Hithero, ulogd has only fully supported handling ARP headers that are present in
`NFPROTO_BRIDGE` packets.
Add support for handling ARP packets in their own right.
Reported-by: Slavko <linux@slavino.sk>
Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
return _interp_ipv6hdr(pi, len);
case NFPROTO_BRIDGE:
return _interp_bridge(pi, len);
+ case NFPROTO_ARP:
+ return _interp_arp(pi, len);
}
return ULOGD_IRET_OK;
}
KEY_ORIG_IP_DADDR,
KEY_REPLY_IP_SADDR,
KEY_REPLY_IP_DADDR,
- MAX_KEY = KEY_REPLY_IP_DADDR,
+ KEY_ARP_SPA,
+ KEY_ARP_TPA,
+ MAX_KEY = KEY_ARP_TPA,
};
static struct ulogd_key ip2bin_inp[] = {
.flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
.name = "reply.ip.daddr",
},
+ [KEY_ARP_SPA] = {
+ .type = ULOGD_RET_IPADDR,
+ .flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
+ .name = "arp.saddr",
+ },
+ [KEY_ARP_TPA] = {
+ .type = ULOGD_RET_IPADDR,
+ .flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
+ .name = "arp.daddr",
+ },
};
static struct ulogd_key ip2bin_keys[] = {
.type = ULOGD_RET_RAWSTR,
.name = "reply.ip.daddr.bin",
},
-
+ {
+ .type = ULOGD_RET_RAWSTR,
+ .name = "arp.saddr.bin",
+ },
+ {
+ .type = ULOGD_RET_RAWSTR,
+ .name = "arp.daddr.bin",
+ },
};
static char ipbin_array[MAX_KEY - START_KEY + 1][FORMAT_IPV6_BUFSZ];
addr_family = AF_INET6;
break;
case NFPROTO_IPV4:
+ case NFPROTO_ARP:
addr_family = AF_INET;
break;
case NFPROTO_BRIDGE:
KEY_ORIG_IP_DADDR,
KEY_REPLY_IP_SADDR,
KEY_REPLY_IP_DADDR,
- MAX_KEY = KEY_REPLY_IP_DADDR,
+ KEY_ARP_SPA,
+ KEY_ARP_TPA,
+ MAX_KEY = KEY_ARP_TPA,
};
static struct ulogd_key ip2hbin_inp[] = {
.flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
.name = "reply.ip.daddr",
},
+ [KEY_ARP_SPA] = {
+ .type = ULOGD_RET_IPADDR,
+ .flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
+ .name = "arp.saddr",
+ },
+ [KEY_ARP_TPA] = {
+ .type = ULOGD_RET_IPADDR,
+ .flags = ULOGD_RETF_NONE|ULOGD_KEYF_OPTIONAL,
+ .name = "arp.daddr",
+ },
};
static struct ulogd_key ip2hbin_keys[] = {
.type = ULOGD_RET_IPADDR,
.name = "reply.ip.hdaddr",
},
+ {
+ .type = ULOGD_RET_IPADDR,
+ .name = "arp.hsaddr",
+ },
+ {
+ .type = ULOGD_RET_IPADDR,
+ .name = "arp.hdaddr",
+ },
};
static void ip2hbin(struct ulogd_key *inp, int i, struct ulogd_key *outp, int o,
addr_family = AF_INET6;
break;
case NFPROTO_IPV4:
+ case NFPROTO_ARP:
addr_family = AF_INET;
break;
case NFPROTO_BRIDGE:
addr_family = AF_INET6;
break;
case NFPROTO_IPV4:
+ case NFPROTO_ARP:
addr_family = AF_INET;
break;
case NFPROTO_BRIDGE:
case NFPROTO_BRIDGE:
buf_cur += printpkt_bridge(res, buf_cur);
break;
+ case NFPROTO_ARP:
+ buf_cur += printpkt_arp(res, buf_cur);
+ break;
}
if (pp_is_valid(res, KEY_OOB_UID))