static void print_header_content(FILE *ofd, struct nlmsghdr *n) { char flags[128]; char type[32]; fprintf(ofd, "type=%s length=%u flags=<%s> sequence-nr=%u pid=%u", nl_nlmsgtype2str(n->nlmsg_type, type, sizeof(type)), n->nlmsg_len, nl_nlmsg_flags2str(n->nlmsg_flags, flags, sizeof(flags)), n->nlmsg_seq, n->nlmsg_pid); }
static char *nlmsg_type2str(uint16_t proto, uint16_t type, char *buf, int len) { if (proto == NETLINK_ROUTE && type < RTM_MAX) { const char *name = nlmsg_rtnl_type2str(type); if (name) { strncpy(buf, name, len); return buf; } } return nl_nlmsgtype2str(type, buf, len); }
static int usnic_rt_raw_parse_cb(struct nl_msg *msg, void *arg) { struct usnic_rt_cb_arg *lookup_arg = (struct usnic_rt_cb_arg *)arg; struct usnic_nl_sk *unlsk = lookup_arg->unlsk; struct nlmsghdr *nlm_hdr = nlmsg_hdr(msg); struct rtmsg *rtm; struct nlattr *tb[RTA_MAX + 1]; int found = 0; int err; INC_CB_MSGCNT(lookup_arg); if (!usnic_is_nlreply_expected(unlsk, nlm_hdr)) { usnic_nlmsg_dump(msg); return NL_SKIP; } if (usnic_is_nlreply_err(nlm_hdr, lookup_arg)) { usnic_nlmsg_dump(msg); return NL_SKIP; } if (nlm_hdr->nlmsg_type != RTM_NEWROUTE) { char buf[128]; nl_nlmsgtype2str(nlm_hdr->nlmsg_type, buf, sizeof(buf)); usnic_err("Received an invalid route request reply message type: %s\n", buf); usnic_nlmsg_dump(msg); return NL_SKIP; } rtm = nlmsg_data(nlm_hdr); if (rtm->rtm_family != AF_INET) { usnic_err("RTM message contains invalid AF family: %u\n", rtm->rtm_family); usnic_nlmsg_dump(msg); return NL_SKIP; } err = nlmsg_parse(nlm_hdr, sizeof(struct rtmsg), tb, RTA_MAX, route_policy); if (err < 0) { usnic_err("nlmsg parse error %s\n", NL_GETERROR(err)); usnic_nlmsg_dump(msg); return NL_SKIP; } if (tb[RTA_OIF]) { if (nla_get_u32(tb[RTA_OIF]) == (uint32_t)lookup_arg->oif) found = 1; else usnic_err("Retrieved route has a different outgoing interface %d (expected %d)\n", nla_get_u32(tb[RTA_OIF]), lookup_arg->oif); } if (found && tb[RTA_GATEWAY]) lookup_arg->nh_addr = nla_get_u32(tb[RTA_GATEWAY]); lookup_arg->found = found; return NL_STOP; }