Vitezslav Samel (2): centralize layer 3 packet handling add 802.1ad and QinQ VLAN handling
src/packet.c | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-)
Signed-off-by: Vitezslav Samel vitezslav@samel.cz --- src/packet.c | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/packet.c b/src/packet.c index d0b04e4..8261e3b 100644 --- a/src/packet.c +++ b/src/packet.c @@ -67,13 +67,6 @@ static int packet_adjust(struct pkt_hdr *pkt) pkt->pkt_payload = pkt->pkt_buf; pkt->pkt_payload += ETH_HLEN; pkt->pkt_len -= ETH_HLEN; - if (pkt->pkt_protocol == ETH_P_8021Q) { - /* strip 0x8100 802.1Q VLAN Extended Header */ - pkt->pkt_payload += 4; - pkt->pkt_len -= 4; - /* update network protocol */ - pkt->pkt_protocol = ntohs(*((unsigned short *) pkt->pkt_payload)); - } break; case ARPHRD_SLIP: case ARPHRD_CSLIP: @@ -194,7 +187,8 @@ int packet_process(struct pkt_hdr *pkt, unsigned int *total_br,
again: packet_set_l3_hdrp(pkt); - if (pkt->pkt_protocol == ETH_P_IP) { + switch (pkt->pkt_protocol) { + case ETH_P_IP: { struct iphdr *ip = pkt->iphdr; int hdr_check; register int ip_checksum; @@ -287,8 +281,8 @@ again: pkt->pkt_len -= pkt_iph_len(pkt); goto again; } - return PACKET_OK; - } else if (pkt->pkt_protocol == ETH_P_IPV6) { + break; } + case ETH_P_IPV6: { struct tcphdr *tcp; struct udphdr *udp; struct ip6_hdr *ip6 = pkt->ip6_hdr; @@ -317,7 +311,15 @@ again: *dport = 0; break; } - } else { + break; } + case ETH_P_8021Q: + /* strip 0x8100 802.1Q VLAN Extended Header */ + pkt->pkt_payload += 4; + pkt->pkt_len -= 4; + /* update network protocol */ + pkt->pkt_protocol = ntohs(*((unsigned short *) pkt->pkt_payload)); + goto again; + default: /* not IPv4 and not IPv6: apply non-IP packet filter */ if (!nonipfilter(filter, pkt->pkt_protocol)) { return PACKET_FILTERED;
Signed-off-by: Vitezslav Samel vitezslav@samel.cz --- src/packet.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/packet.c b/src/packet.c index 8261e3b..ef76925 100644 --- a/src/packet.c +++ b/src/packet.c @@ -313,7 +313,11 @@ again: } break; } case ETH_P_8021Q: - /* strip 0x8100 802.1Q VLAN Extended Header */ + case ETH_P_QINQ1: /* ETH_P_QINQx are not officially */ + case ETH_P_QINQ2: /* registered IDs */ + case ETH_P_QINQ3: + case ETH_P_8021AD: + /* strip 802.1Q/QinQ/802.1ad VLAN header */ pkt->pkt_payload += 4; pkt->pkt_len -= 4; /* update network protocol */
iptraf-ng@lists.fedorahosted.org