docs: def genl_register(ops):
      """Register Generic Netlink family backed cache.
  
      https://github.com/thom311/libnl/blob/libnl3_2_25/lib/genl/mngt.c#L241
  
      Same as genl_register_family() but additionally registers the specified cache operations using
      nl_cache_mngt_register() and associates it with the Generic Netlink family.
  
      Positional arguments:
      ops -- cache operations definition (nl_cache_ops class instance).
  
      Returns:
      0 on success or a negative error code.
      """
      if ops.co_protocol != NETLINK_GENERIC:
          return -NLE_PROTO_MISMATCH
      if ops.co_hdrsize < GENL_HDRSIZE(0):
          return -NLE_INVAL
      if ops.co_genl is None:
          return -NLE_INVAL
  
      ops.co_genl.o_cache_ops = ops
      ops.co_genl.o_hdrsize = ops.co_hdrsize - GENL_HDRLEN
      ops.co_genl.o_name = ops.co_msgtypes[0].mt_name
      ops.co_genl.o_id = ops.co_msgtypes[0].mt_id
      ops.co_msg_parser = genl_msg_parser
  
      err = genl_register_family(ops.co_genl)
      if err < 0:
          return err
      return nl_cache_mngt_register(ops)