15 #include <libmnl/libmnl.h>
56 return len + MNL_NLMSG_HDRLEN;
69 return nlh->nlmsg_len - MNL_NLMSG_HDRLEN;
84 int len = MNL_ALIGN(
sizeof(
struct nlmsghdr));
85 struct nlmsghdr *nlh = buf;
107 char *ptr = (
char *)nlh + nlh->nlmsg_len;
108 size_t len = MNL_ALIGN(size);
109 nlh->nlmsg_len += len;
123 return (
void *)nlh + MNL_NLMSG_HDRLEN;
138 return (
void *)nlh + MNL_NLMSG_HDRLEN + MNL_ALIGN(offset);
160 return len >= (int)
sizeof(
struct nlmsghdr) &&
161 nlh->nlmsg_len >=
sizeof(
struct nlmsghdr) &&
162 (int)nlh->nlmsg_len <= len;
182 *len -= MNL_ALIGN(nlh->nlmsg_len);
183 return (
struct nlmsghdr *)((
void *)nlh + MNL_ALIGN(nlh->nlmsg_len));
197 return (
void *)nlh + MNL_ALIGN(nlh->nlmsg_len);
218 return nlh->nlmsg_seq && seq ? nlh->nlmsg_seq == seq :
true;
239 return nlh->nlmsg_pid && portid ? nlh->nlmsg_pid == portid :
true;
243 static void mnl_nlmsg_fprintf_header(FILE *fd,
const struct nlmsghdr *nlh)
245 fprintf(fd,
"----------------\t------------------\n");
246 fprintf(fd,
"| %.010u |\t| message length |\n", nlh->nlmsg_len);
247 fprintf(fd,
"| %.05u | %c%c%c%c |\t| type | flags |\n",
249 nlh->nlmsg_flags & NLM_F_REQUEST ?
'R' :
'-',
250 nlh->nlmsg_flags & NLM_F_MULTI ?
'M' :
'-',
251 nlh->nlmsg_flags & NLM_F_ACK ?
'A' :
'-',
252 nlh->nlmsg_flags & NLM_F_ECHO ?
'E' :
'-');
253 fprintf(fd,
"| %.010u |\t| sequence number|\n", nlh->nlmsg_seq);
254 fprintf(fd,
"| %.010u |\t| port ID |\n", nlh->nlmsg_pid);
255 fprintf(fd,
"----------------\t------------------\n");
259 mnl_nlmsg_fprintf_payload(FILE *fd,
const struct nlmsghdr *nlh,
260 size_t extra_header_size)
265 for (i=
sizeof(
struct nlmsghdr); i<nlh->nlmsg_len; i+=4) {
266 char *b = (
char *) nlh;
267 struct nlattr *attr = (
struct nlattr *) (b+i);
270 if (nlh->nlmsg_type < NLMSG_MIN_TYPE) {
271 fprintf(fd,
"| %.2x %.2x %.2x %.2x |\t",
272 0xff & b[i], 0xff & b[i+1],
273 0xff & b[i+2], 0xff & b[i+3]);
274 fprintf(fd,
"| |\n");
276 }
else if (extra_header_size > 0) {
277 extra_header_size -= 4;
278 fprintf(fd,
"| %.2x %.2x %.2x %.2x |\t",
279 0xff & b[i], 0xff & b[i+1],
280 0xff & b[i+2], 0xff & b[i+3]);
281 fprintf(fd,
"| extra header |\n");
283 }
else if (rem == 0 && (attr->nla_type & NLA_TYPE_MASK) != 0) {
284 fprintf(fd,
"|%c[%d;%dm"
299 attr->nla_type & NLA_F_NESTED ?
'N' :
'-',
301 NLA_F_NET_BYTEORDER ?
'B' :
'-',
304 attr->nla_type & NLA_TYPE_MASK,
306 fprintf(fd,
"|len |flags| type|\n");
308 if (!(attr->nla_type & NLA_F_NESTED)) {
309 rem = NLA_ALIGN(attr->nla_len) -
310 sizeof(
struct nlattr);
313 }
else if (rem > 0) {
315 fprintf(fd,
"| %.2x %.2x %.2x %.2x |\t",
316 0xff & b[i], 0xff & b[i+1],
317 0xff & b[i+2], 0xff & b[i+3]);
318 fprintf(fd,
"| data |");
319 fprintf(fd,
"\t %c %c %c %c\n",
320 isalnum(b[i]) ? b[i] : 0,
321 isalnum(b[i+1]) ? b[i+1] : 0,
322 isalnum(b[i+2]) ? b[i+2] : 0,
323 isalnum(b[i+3]) ? b[i+3] : 0);
326 fprintf(fd,
"----------------\t------------------\n");
374 size_t extra_header_size)
376 const struct nlmsghdr *nlh = data;
380 mnl_nlmsg_fprintf_header(fd, nlh);
381 mnl_nlmsg_fprintf_payload(fd, nlh, extra_header_size);
486 struct nlmsghdr *nlh = b->cur;
488 if (b->buflen + nlh->nlmsg_len > b->limit) {
492 b->cur = b->buf + b->buflen + nlh->nlmsg_len;
493 b->buflen += nlh->nlmsg_len;
509 struct nlmsghdr *nlh = b->cur;
510 memcpy(b->buf, b->cur, nlh->nlmsg_len);
511 b->buflen = nlh->nlmsg_len;
512 b->cur = b->buf + b->buflen;
567 return b->buflen == 0;