2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2014 Tobias Klauser.
4 * Subject to the GPL, version 2.
11 #include <netlink/msg.h>
17 static void nlmsg(struct pkt_buff
*pkt
)
19 struct nlmsghdr
*hdr
= (struct nlmsghdr
*) pkt_pull(pkt
, sizeof(*hdr
));
22 char procname
[PATH_MAX
];
27 /* Look up the process name if message is not coming from the kernel.
29 * Note that the port id is not necessarily equal to the PID of the
30 * receiving process (e.g. if the application is multithreaded or using
31 * multiple sockets). In these cases we're not able to find a matching
32 * PID and the information will not be printed.
34 if (hdr
->nlmsg_pid
!= 0) {
38 snprintf(path
, sizeof(path
), "/proc/%u/exe", hdr
->nlmsg_pid
);
39 ret
= readlink(path
, procname
, sizeof(procname
) - 1);
44 snprintf(procname
, sizeof(procname
), "kernel");
47 tprintf("Len %u, ", hdr
->nlmsg_len
);
48 tprintf("Type 0x%.4x (%s%s%s), ", hdr
->nlmsg_type
,
50 nl_nlmsgtype2str(hdr
->nlmsg_type
, type
, sizeof(type
)),
52 tprintf("Flags 0x%.4x (%s%s%s), ", hdr
->nlmsg_flags
,
54 nl_nlmsg_flags2str(hdr
->nlmsg_flags
, flags
, sizeof(flags
)),
56 tprintf("Seq-Nr %u, ", hdr
->nlmsg_seq
);
57 tprintf("PID %u", hdr
->nlmsg_pid
);
59 tprintf(" (%s%s%s)", colorize_start(bold
), basename(procname
),
64 static void nlmsg_less(struct pkt_buff
*pkt
)
66 struct nlmsghdr
*hdr
= (struct nlmsghdr
*) pkt_pull(pkt
, sizeof(*hdr
));
72 tprintf(" NLMSG %u (%s%s%s)", hdr
->nlmsg_type
, colorize_start(bold
),
73 nl_nlmsgtype2str(hdr
->nlmsg_type
, type
, sizeof(type
)),
77 struct protocol nlmsg_ops
= {
79 .print_less
= nlmsg_less
,