code: def callback(msg, _):
      
      # First convert `msg` into something more manageable.
      nlh = nlmsg_hdr(msg)
      iface = ifinfomsg(nlmsg_data(nlh))
      hdr = IFLA_RTA(iface)
      remaining = ctypes.c_int(nlh.nlmsg_len - NLMSG_LENGTH(iface.SIZEOF))
  
      # Now iterate through each rtattr stored in `iface`.
      while RTA_OK(hdr, remaining):
          # Each rtattr (which is what hdr is) instance is only one type. Looping through all of them until we run into
          # the ones we care about.
          if hdr.rta_type == IFLA_IFNAME:
              print('Found network interface {0}: {1}'.format(iface.ifi_index, get_string(RTA_DATA(hdr)).decode('ascii')))
          hdr = RTA_NEXT(hdr, remaining)
      return NL_OK
docs: Callback function called by libnl upon receiving messages from the kernel.
  
      Positional arguments:
      msg -- nl_msg class instance containing the data sent by the kernel.
  
      Returns:
      An integer, value of NL_OK. It tells libnl to proceed with processing the next kernel message.