docs: def genl_ctrl_probe_by_name(sk, name):
      """Look up generic Netlink family by family name querying the kernel directly.
  
      https://github.com/thom311/libnl/blob/libnl3_2_25/lib/genl/ctrl.c#L237
  
      Directly query's the kernel for a given family name.
  
      Note: This API call differs from genl_ctrl_search_by_name in that it queries the kernel directly, allowing for
      module autoload to take place to resolve the family request. Using an nl_cache prevents that operation.
  
      Positional arguments:
      sk -- Generic Netlink socket (nl_sock class instance).
      name -- family name (bytes).
  
      Returns:
      Generic Netlink family `genl_family` class instance or None if no match was found.
      """
      ret = genl_family_alloc()
      if not ret:
          return None
  
      genl_family_set_name(ret, name)
      msg = nlmsg_alloc()
      orig = nl_socket_get_cb(sk)
      cb = nl_cb_clone(orig)
      genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, GENL_ID_CTRL, 0, 0, CTRL_CMD_GETFAMILY, 1)
      nla_put_string(msg, CTRL_ATTR_FAMILY_NAME, name)
      nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, probe_response, ret)
  
      if nl_send_auto(sk, msg) < 0:
          return None
      if nl_recvmsgs(sk, cb) < 0:
          return None
      if wait_for_ack(sk) < 0:  # If search was successful, request may be ACKed after data.
          return None
  
      if genl_family_get_id(ret) != 0:
          return ret