Date: Tue, 1 Aug 2006 11:06:18 GMT From: CoolDavid(Tseng Guo-Fu) <cooldavid@cdpa.nsysu.edu.tw> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/101162: [patch] ng_netflow 802.11Q VLAN Tag support Message-ID: <200608011106.k71B6IKi060564@www.freebsd.org> Resent-Message-ID: <200608011110.k71BAANM095552@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 101162 >Category: kern >Synopsis: [patch] ng_netflow 802.11Q VLAN Tag support >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Aug 01 11:10:10 GMT 2006 >Closed-Date: >Last-Modified: >Originator: CoolDavid(Tseng Guo-Fu) >Release: FreeBSD 5.5-STABLE i386 >Organization: Campus Dorm-Net Promotion Association of National Sun Yat-sen University ,Kaohsiung, 80424 , Taiwan >Environment: FreeBSD netflow.cdpa.nsysu.edu.tw 5.5-STABLE FreeBSD 5.5-STABLE #0: Tue Aug 1 12:09:34 UTC 2006 root@netflow.cdpa.nsysu.edu.tw:/usr/src/sys/i386/compile/NETFLOW i386 >Description: Some network device sends Port-Mirror data with 802.11Q VLAN tag. The original version of ng_netflow didn't check the VLAN proto in ethernet header. >How-To-Repeat: Any packet received from NIC encapsulated with VALN tag will be ignored. >Fix: root@netflow[/usr/src/sys/netgraph/netflow]# diff -Naur /root/netflow.org /usr/src/sys/netgraph/netflow diff -Naur /root/netflow.org/ng_netflow.c /usr/src/sys/netgraph/netflow/ng_netflow.c --- /root/netflow.org/ng_netflow.c Tue Aug 1 17:04:39 2006 +++ /usr/src/sys/netgraph/netflow/ng_netflow.c Tue Aug 1 17:57:41 2006 @@ -42,6 +42,7 @@ #include <net/ethernet.h> #include <net/if_arp.h> #include <net/if_var.h> +#include <net/if_vlan_var.h> #include <net/bpf.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -494,6 +495,7 @@ case DLT_EN10MB: /* Ethernet */ { struct ether_header *eh; + struct ether_vlan_header *evh; uint16_t etype; M_CHECK(sizeof(struct ether_header)); @@ -507,6 +509,14 @@ eh = mtod(m, struct ether_header *); ip = (struct ip *)(eh + 1); break; + case ETHERTYPE_VLAN: + M_CHECK(sizeof(struct ether_vlan_header) - sizeof(struct ether_header)); + evh = mtod(m, struct ether_vlan_header *); + if(ntohs(evh->evl_proto) == ETHERTYPE_IP) { + M_CHECK(sizeof(struct ip)); + ip = (struct ip *)(evh + 1); + break; + } default: goto bypass; /* pass this frame */ } @@ -540,9 +550,17 @@ case DLT_EN10MB: { struct ether_header *eh; + struct ether_vlan_header *evh; - eh = mtod(m, struct ether_header *); - ip = (struct ip *)(eh + 1); + //log(LOG_CRIT, "ng_netflow: vlan->ip.\n"); + eh = mtod(m, struct ether_header *); + if(ntohs(eh->ether_type) == ETHERTYPE_IP) { + ip = (struct ip *)(eh + 1); + } + else { //Must be vlan + evh = mtod(m, struct ether_vlan_header *); + ip = (struct ip *)(evh + 1); + } break; } case DLT_RAW: >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608011106.k71B6IKi060564>