code: def probe_response(msg, arg):
      
      tb = dict((i, None) for i in range(CTRL_ATTR_MAX + 1))
      nlh = nlmsg_hdr(msg)
      ret = arg
      if genlmsg_parse(nlh, 0, tb, CTRL_ATTR_MAX, ctrl_policy):
          return NL_SKIP
      if tb[CTRL_ATTR_FAMILY_ID]:
          genl_family_set_id(ret, nla_get_u16(tb[CTRL_ATTR_FAMILY_ID]))
      if tb[CTRL_ATTR_MCAST_GROUPS] and parse_mcast_grps(ret, tb[CTRL_ATTR_MCAST_GROUPS]) < 0:
          return NL_SKIP
      return NL_STOP
docs: Process responses from from the query sent by genl_ctrl_probe_by_name().
  
      https://github.com/thom311/libnl/blob/libnl3_2_25/lib/genl/ctrl.c#L203
  
      Process returned messages, filling out the missing information in the genl_family structure.
  
      Positional arguments:
      msg -- returned message (nl_msg class instance).
      arg -- genl_family class instance to fill out.
  
      Returns:
      Indicator to keep processing frames or not (NL_SKIP or NL_STOP).