802.1Q VLAN 1.4 released.
Subsystems (2)
PATCH 1/1 802.1Q VLAN 1.4 released.
This patch adds 802.1Q VLAN support to the linux kernel. You can learn more at: http://scry.wanfear.com/~greear/vlan.html
This patch fixes several bugs and removes a dependency on the /proc interface. It should be close to passing muster with the network code maintainers, and so may be a cantidate for kernel inclusion. Please let me know if you have any suggestions or corrections to the patch.
Thanks,
Ben
Signature · 3 lines
Ben Greear <[email protected]> <[email protected]> President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear
include/linux/if.h +6 -1
@@ -22,7 +22,7 @@#include <linux/types.h> /* for "__kernel_caddr_t" et al */ #include <linux/socket.h> /* for "struct sockaddr" et al */ -/* Standard interface flags. */ +/* Standard interface flags (netdevice->flags). */ #define IFF_UP 0x1/* interface is up */ #define IFF_BROADCAST 0x2/* broadcast address valid */ #define IFF_DEBUG 0x4/* turn on debugging */
@@ -44,6 +44,11 @@#define IFF_PORTSEL 0x2000/* can set media type */ #define IFF_AUTOMEDIA 0x4000/* auto media select active */ #define IFF_DYNAMIC 0x8000/* dialup device with changing addresses*/ + + +/* This defines netdevice->more_flags */ +#define IFF_802_1Q_VLAN 0x1/* 802.1Q VLAN device. */ +/* * Device mapping structure. I'd just gone off and designed a
include/linux/if_ether.h +1 -0
@@ -56,6 +56,7 @@#define ETH_P_RARP 0x8035/* Reverse Addr Res packet */ #define ETH_P_ATALK 0x809B/* Appletalk DDP */ #define ETH_P_AARP 0x80F3/* Appletalk AARP */ +#define ETH_P_8021Q 0x8100/* 802.1Q VLAN Extended Header */ #define ETH_P_IPX 0x8137/* IPX over DIX */ #define ETH_P_IPV6 0x86DD/* IPv6 over bluebook */ #define ETH_P_PPP_DISC 0x8863/* PPPoE discovery messages */
include/linux/if_vlan.h +290 -0
290 lines not on this page · raw message
include/linux/netdevice.h +20 -3
@@ -37,6 +37,7 @@#include <linux/config.h> #ifdef CONFIG_NET_PROFILE #include <net/profile.h> +#endif struct divert_blk ;
@@ -183,12 +184,16 @@ {struct hh_cache *hh_next;/* Next entry */ atomic_t hh_refcnt;/* number of users */ -unsigned short hh_type;/* protocol identifier, f.e ETH_P_IP */ +unsigned short hh_type;/* protocol identifier, f.e ETH_P_IP +* NOTE: For VLANs, this will be the +* encapuslated type. --BLG +*/ int hh_len;/* length of header */ int (*hh_output)(struct sk_buff *skb);rwlock_t hh_lock;/* cached hardware header; allow for machine alignment needs. */ -unsigned long hh_data[16 /sizeof (unsigned long )]; + +unsigned long hh_data[16 /sizeof (unsigned long )]; };/* These flag bits are private to the generic network queueing
@@ -285,8 +290,19 @@unsigned long trans_start;/* Time (in jiffies) of last Tx */ unsigned long last_rx;/* Time of last Rx */ -unsigned short flags;/* interface flags (a la BSD) */ +unsigned short flags;/* defined in if.h */ unsigned short gflags; +unsigned short more_flags;/* defined in if.h We already have 16 flags defined for the +* 'flags' 2-byte variable above. I tried changing it to 32 +* bits, but when you 'ifconfig vlanXX 2.2.2.2 up', for instance, +* the high flags are re-set to zero. I'm sure that someone, +* somewhere, is AND-ing the flags with 0xFFFF, and it may be +* user-space. +*/ +unsigned short unused_alignment_fixer;/* Because we need more_flags, +* and we want to be 32-bit aligned. +*/ +unsigned mtu;/* interface MTU value */ unsigned short type;/* interface hardware type */ unsigned short hard_header_len;/* hardware hdr length */
@@ -393,6 +409,7 @@/* open/release and usage marking */ struct module *owner; +/* bridge stuff */ struct net_bridge_port *br_port;
include/linux/sockios.h +4 -0
@@ -102,6 +102,10 @@#define SIOCADDDLCI 0x8980/* Create new DLCI device */ #define SIOCDELDLCI 0x8981/* Delete DLCI device */ +#define SIOCGIFVLAN 0x8982/* 802.1Q VLAN support */ +#define SIOCSIFVLAN 0x8983/* Set 802.1Q VLAN options */ + +/* Device private ioctl calls */ /*
net/8021q/Makefile +19 -0
@@ -0,0 +1,19 @@ +# +# Makefile for the Linux VLAN layer. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definition is now in the main makefile... + +O_TARGET := 8021q.o + +obj-y := vlan.o vlanproc.o vlan_dev.o +obj-m := $(O_TARGET) +obj-$(CONFIG_SYSCTL) += sysctl_net_vlan.o + +include $(TOPDIR)/Rules.make + +tar: + tar -cvf /dev/f1 .
net/8021q/sysctl_net_vlan.c +20 -0
@@ -0,0 +1,20 @@ +/* +* sysctl_net_vlan.c: sysctl interface to net Ethernet VLAN subsystem. +* +* Begun Dec 20, 1998, Ben Greear +* +* TODO: What, if anything, should this do?? +*/ + +#include <linux/module.h> + +#if defined(CONFIG_VLAN_8021Q ) || defined(CONFIG_VLAN_8021Q_MODULE ) + +#include <linux/mm.h> +#include <linux/sysctl.h> + +ctl_table ether_vlan_table[] = { + {0 } +}; + +#endif
net/8021q/vlan.c +643 -0
643 lines not on this page · raw message
net/8021q/vlan.h +43 -0
43 lines not on this page · raw message
net/8021q/vlan_dev.c +778 -0
778 lines not on this page · raw message
net/8021q/vlanproc.c +521 -0
521 lines not on this page · raw message
net/8021q/vlanproc.h +27 -0
@@ -0,0 +1,27 @@ + +#ifndef __BEN_VLAN_PROC_INC__ +#define __BEN_VLAN_PROC_INC__ + + +int vlan_proc_init (void ); + +int vlan_proc_rem_dev (struct net_device * vlandev); +int vlan_proc_add_dev (struct net_device * vlandev); +void vlan_proc_cleanup (void ); + + +#define VLAN_PROC_BUFSZ (4096)/* buffer size for printing proc info */ + +/****** Data Types **********************************************************/ + +/* +typedef struct vlan_stat_entry { +struct vlan_stat_entry * next; +char *description; * description string * +void *data; * -> data * +unsigned data_type; * data type * +} vlan_stat_entry_t; +*/ + + +#endif
net/Config.in +3 -0
@@ -46,6 +46,9 @@ tristate ' Multi-Protocol Over ATM (MPOA) support' CONFIG_ATM_MPOA fi fi + + tristate '802.1Q VLAN Support (EXPERIMENTAL)' CONFIG_VLAN_8021Q + fi comment ' '
net/Makefile +1 -0
@@ -45,6 +45,7 @@ subdir-$(CONFIG_ATM) += atm subdir-$(CONFIG_DECNET) += decnet subdir-$(CONFIG_ECONET) += econet +subdir-$(CONFIG_VLAN_8021Q) += 8021q obj-y := socket.o $(join $(subdir-y), $(patsubst %,/%.o,$(notdir $(subdir-y))))
net/core/dev.c +11 -2
@@ -1,4 +1,4 @@ -/* +/* -*- linux-c -*- * NET3 Protocol independent device support routines. * * This program is free software; you can redistribute it and/or
@@ -107,6 +107,7 @@extern int plip_init (void );#endif +/* This define, if set, will randomly drop a packet when congestion * is more than moderate. It helps fairness in the multi-interface * case when one of them is a hog, but it kills performance for the
@@ -137,9 +138,17 @@* and the routines to invoke. * * Why 16. Because with 16 the only overlap we get on a hash of the -* low nibble of the protocol value is RARP/SNAP/X.25. +* low nibble of the protocol value is RARP/SNAP/X.25. +* +* NOTE: That is no longer true with the addition of VLAN tags. Not +* sure which should go first, but I bet it won't make much +* difference if we are running VLANs. The good news is that +* this protocol won't be in the list unless compiled in, so +* the average user (w/out VLANs) will not be adversly affected. +* --BLG * * 0800 IP +* 8100 802.1Q VLAN * 0001 802.3 * 0002 AX.25 * 0004 802.2
net/ethernet/eth.c +11 -10
@@ -82,7 +82,7 @@* in here instead. It is up to the 802.2 layer to carry protocol information. */ -if (type!=ETH_P_802_3 ) +if (type !=ETH_P_802_3 ) eth->h_proto =htons (type);else eth->h_proto =htons (len);
@@ -92,9 +92,9 @@*/ if (saddr) -memcpy (eth->h_source,saddr,dev->addr_len); +memcpy (eth->h_source, saddr, dev->addr_len);else -memcpy (eth->h_source,dev->dev_addr,dev->addr_len); +memcpy (eth->h_source, dev->dev_addr, dev->addr_len);/* * Anyway, the loopback-device should never use this function...
@@ -159,11 +159,12 @@ {struct ethhdr *eth;unsigned char *rawp; - - skb->mac.raw=skb->data; -skb_pull (skb,dev->hard_header_len); - eth= skb->mac.ethernet; - + + skb->mac.raw = skb->data; +skb_pull (skb, dev->hard_header_len); + eth = skb->mac.ethernet; + +if (*eth->h_dest&1 ) {if (memcmp (eth->h_dest,dev->broadcast,ETH_ALEN )==0 )
@@ -198,12 +199,12 @@* won't work for fault tolerant netware but does for the rest. */ if (*(unsigned short *)rawp ==0xFFFF ) -return htons (ETH_P_802_3 ); +return __constant_htons (ETH_P_802_3 );/* * Real 802.2 LLC */ -return htons (ETH_P_802_2 ); +return __constant_htons (ETH_P_802_2 ); }int eth_header_parse (struct sk_buff *skb,unsigned char *haddr)
net/ipv4/af_inet.c +16 -0
@@ -143,6 +143,10 @@int (*br_ioctl_hook)(unsigned long );#endif +#if defined(CONFIG_VLAN_8021Q ) || defined(CONFIG_VLAN_8021Q_MODULE ) +int (*vlan_ioctl_hook)(unsigned long arg); +#endif +/* The inetsw table contains everything that inet_create needs to * build a new socket. */
@@ -879,6 +883,18 @@#endif if (br_ioctl_hook !=NULL )return br_ioctl_hook (arg); +#endif +return -ENOPKG ; + +case SIOCGIFVLAN : +case SIOCSIFVLAN : +#if defined(CONFIG_VLAN_8021Q ) || defined(CONFIG_VLAN_8021Q_MODULE ) +#ifdef CONFIG_KMOD +if (vlan_ioctl_hook ==NULL ) +request_module ("8021q" ); +#endif +if (vlan_ioctl_hook !=NULL ) +return vlan_ioctl_hook (arg);#endif return -ENOPKG ;
net/netsyms.c +10 -0
@@ -30,6 +30,7 @@#include <net/pkt_sched.h> #include <net/scm.h> #include <linux/if_bridge.h> +#include <linux/if_vlan.h> #include <linux/random.h> #ifdef CONFIG_NET_DIVERT #include <linux/divert.h>
@@ -212,6 +213,15 @@EXPORT_SYMBOL (make_EII_client);EXPORT_SYMBOL (destroy_EII_client);#endif + + +/* for 801q VLAN support */ +#if defined(CONFIG_VLAN_8021Q_MODULE ) || defined(CONFIG_VLAN_8021Q ) +EXPORT_SYMBOL (dev_change_flags); +EXPORT_SYMBOL (vlan_ioctl_hook); +#endif + +EXPORT_SYMBOL (sklist_destroy_socket);EXPORT_SYMBOL (sklist_insert_socket);