pkttype match mismatches on locally generated packets
Subsystems (2)
PATCH 1/1 pkttype match mismatches on locally generated packets
Locally generated broadcast and multicast packets have pkttype set to PACKET_LOOPBACK instead of PACKET_BROADCAST or PACKET_MULTICAST. This causes the pkttype match to fail to match packets of either type.
The below patch remedies this by using the daddr as a hint as to broadcast|multicast. While not pretty, this seems like the only way to solve the problem short of just noting this as a limitation of the match.
This resolves bug #484
Phil
Quoted 8 lines · Phil Oester
Locally generated broadcast and multicast packets have pkttype set to
PACKET_LOOPBACKinstead ofPACKET_BROADCASTorPACKET_MULTICAST. This causes the pkttype match to fail to match packets of either type.The below patch remedies this by using the daddr as a hint as to broadcast|multicast. While not pretty, this seems like the only way to solve the problem short of just noting this as a limitation of the match.
Quoted 5 lines
This resolves bug #484
Phil
Signed-off-by Phil Oester <[email protected]>
And this time the patch is attached...
Phil
net/netfilter/xt_pkttype.c +11 -1
@@ -9,6 +9,8 @@#include <linux/skbuff.h> #include <linux/if_ether.h> #include <linux/if_packet.h> +#include <linux/in.h> +#include <linux/ip.h> #include <linux/netfilter/xt_pkttype.h> #include <linux/netfilter/x_tables.h>
@@ -28,9 +30,17 @@unsigned int protoff, int *hotdrop) { + u_int8_t type;const struct xt_pkttype_info *info = matchinfo; -return (skb->pkt_type == info->pkttype) ^ info->invert; +if (skb->pkt_type ==PACKET_LOOPBACK ) + type = (MULTICAST (skb->nh.iph->daddr) + ?PACKET_MULTICAST + :PACKET_BROADCAST ); +else + type = skb->pkt_type; + +return (type == info->pkttype) ^ info->invert; } static struct xt_match pkttype_match = {
Quoted 9 lines · Phil Oester
Locally generated broadcast and multicast packets have pkttype set to
PACKET_LOOPBACKinstead ofPACKET_BROADCASTorPACKET_MULTICAST. This causes the pkttype match to fail to match packets of either type.The below patch remedies this by using the daddr as a hint as to broadcast|multicast. While not pretty, this seems like the only way to solve the problem short of just noting this as a limitation of the match.
This resolves bug #484
Thanks Phil. I thought about just adding PACKET_LOOPBACK support to userspace, but this way seems better, so applied.