/* muxL2VlanLibP.h - private definitions for the L2 VLAN MUX library */ /* * Copyright (c) 1996-2007 Wind River Systems, Inc. * * The right to copy, distribute, modify or otherwise make use * of this software may be licensed only pursuant to the terms * of an applicable Wind River license agreement. */ /* modification history -------------------- 01i,30jul07,kch Added MUX-L2 hardware capabilities macros. 01h,30sep05,kch Added portCfi member to MUX_L2_PORT. 01g,15sep05,kch Moved MAX_VID, MIN_VID, MAX_VID, MIN_USER_PRIORITY, MAX_USER_PRIORITY, IS_VALID_VID and IS_VALID_PRORITY macros to muxL2Lib.h (SPR #112513). 01f,14sep05,kch Changed MUX_L2_VLAN_STATISTICS define to MUX_L2_VLAN_STAT. Also renamed MUX_L2_VLAN_STAT structure tag to MUX_L2_VLAN_PORT_STAT (SPR #112513). 01e,07sep05,kch Replaced vlanHwTaggingSupport and vlanMtuSupport booleans with hwCaps that uses bit fields. 01d,27aug05,kch Renamed vlan id defines to reflect its actual usage. 01c,24aug05,kch Added MUX_L2_VLAN_STAT data structure and related macros. Also added muxL2PortInDiscards and muxL2PortOutDiscards to MUX_L2_PORT. 01b,23aug05,kch Added hwMtu as well as pointer to END_OBJ and NET_FUNCS to MUX_L2_PORT. Moved vlan tag related macros to muxL2Lib.h. 01a,20jul05,kch written. */ #ifndef __INCmuxL2VlanLibPh #define __INCmuxL2VlanLibPh #include #include #ifdef __cplusplus extern "C" { #endif #ifdef _WRS_KERNEL /* possible ethernet frame format */ typedef enum { ETHER_TYPE2_FRAME_FORMAT = 0x01, ETHER_8023_FRAME_FORMAT, UNKNOWN_FRAME_FORMAT } ETHER_FRAME_FORMAT; typedef enum { VLAN_TAGGED_FRAME = 1, PRIORITY_TAGGED_FRAME, UNTAGGED_FRAME, INVALID_TAGGED_FRAME } ETHER_FRAME_TYPE; /* defines */ #define LLC_SNAP_FRAME_LEN 8 /* * LLC with DSAP and SSAP of 0x42 is reserved for IEEE 802.1 use. * These 802.3 ethernet encapsulation is used by Layer 2 protocols * such as STP, GVRP, and GMRP. */ #define LLC_SAP 0x42 #define RESERVED_VID 4095 /* for internal use */ /* * The following defines are the default port-base vlan setting maintained * by the Layer 2 MUX. */ #define DEFAULT_PORT_VID 1 #define DEFAULT_PORT_USER_PRIORITY 0 #define DEFAULT_PORT_INGRESS_TYPE ADMIT_ALL_FRAMES #define DEFAULT_PORT_INGRESS_FILTER FALSE #define DEFAULT_PORT_EGRESS_TYPE UNTAGGED_FRAME /* * Marco for MUX-L2 Hardware L2 capabilities (used internally). These * hardware capabilities macros are added to provide additional flexbility * to MUX-L2 to distinguish the hardware (vlan tagging) capabilities for * ingress and egress. */ /* hardware supports VLAN-compatible MTU */ #define MUX_L2_HW_CAP_VLAN_MTU 0x01 /* * hardware supports extracting vlan tag from the received frame and stores * the vlan tag information in m_pkthdr.vlan in host-byte order with the * CSUM_VLAN CSUM flags set. The ethernet header from the received frame will * be untagged. */ #define MUX_L2_HW_CAP_TAGGING_RX 0x02 /* * hardware supports inserting vlan tag to ethernet header on egress using * vlan tag information that is stored in m_pkthdr.vlan (in host-byte order) * if the CSUM_VLAN CSUM flags is set. */ #define MUX_L2_HW_CAP_TAGGING_TX 0x04 #ifdef MUX_L2_VLAN_STATS typedef struct mux_l2_vlan_port_stat { /* * The number of valid frames received by this port which were classified * as belonging to this vlan. * RFC2674 MIB object: dot1qTpVlanPortInFrames */ unsigned long muxL2VlanPortInFrames; /* * The number of valid frames transmitted by this port for this vlan. * RFC2674 MIB object: dot1qTpVlanPortOutFrames */ unsigned long muxL2VlanPortOutFrames; /* * The number of valid frames received by this port which were classified * as belonging to this vlan but were discarded due to vlan related * reasons. Specifically, the IEEE 802.1Q counters for Discard Inbound. * RFC2674 MIB object: dot1qTpVlanPortInDiscards * The description for the MIB object specifies that this object also * implements the IEEE 802.1Q counter for Discard Ingress Filtering. * We don't keep track that here because if a frame is discarded by * ingress filtering, the port is not a member of the vlan, hence, * the MUX_L2_VLAN_STAT is not allocated for that vlan for the port. */ unsigned long muxL2VlanPortInDiscards; } MUX_L2_VLAN_PORT_STAT; #endif /* MUX_L2_VLAN_STATS */ /* * L2 per-port configuration */ typedef struct mux_l2_port { END_OBJ *pEnd; /* pointer back to the device's (END_OBJ *) */ /* * The Port VLAN ID that is assigned to untagged frames or priority-tagged * frames received on this port. Default: 1 * RFC2674 MIB object: dot1qPvid */ unsigned short portVid; /* Valid Vid: 1..4094 */ /* * The default ingress User Priority for this port (assuming Ethernet * media). Default: 0 * RFC2674 MIB object: dot1dPortDefaultUserPriority */ unsigned short portUpriority; /* Valid Priority: 0..7 */ /* * Canonical format indicator (CFI), 0 or 1. * - in token ring/source-routed FDDI MAC methods, this field is used * to signal the bit order of address information carried in the * encapsulated frame; * - in 802.3/Ethernet and transparent FDDI MAC methods, this field is * used to signal the presence or absence of an Embedded Souce-Routing * Information Field (E-RIF), and in combination with the Non-canonical * Format Indicator (NCFI) carried in the RIF, to signal the bit order * of address information carried in the encapsulated frame. * NOTE: For 802.3/Ethernet, MUX-L2 assumes this bit is always 0. That * is, the received/transmitted tagged frame does not carry any * embedded source routing information. */ unsigned short portCfi; /* * When set to ADMIT_TAGGED_ONLY_FRAMES(2), the device will discard * untagged frames or priority-tagged frames received on this port. * When set to ADMIT_ALL_FRAMES(1), untagged frames or priority-tagged * frames received on this port will be accepted and assigned to the * portPvid for this port. * The setting does not affect VLAN independent BPDU frames, such as * GVRP and STP but it does affect VLAN dependent BPDU frames, such as * GMRP. Default: ADMIT_ALL_FRAMES(1) * RFC2674 MIB object: dot1qPortAcceptableFrameTypes */ ACCEPT_FRAME_TYPE portIngressAcceptFrameType; /* * When this is true(1) the device will discard incoming frame for * VLANs which do not include this Port in its Member set. When * false(2), the port will accept all incoming frames. Default: false * RFC2674 MIB object: dot1qPortIngressFiltering. */ BOOL portIngressFilter; #ifdef VLAN_TAG /* Function pointer for user-defined conversion function to convert * IP TOS field to the 3-bit 802.1Q user priority. The conversion * routine takes the IP TOS value as its input and returns the vlan * user priority value (0-7) that needs to be inserted to the outgoing * vlan tag header. */ unsigned char (*portTos2UpConvRtn) (unsigned char); #endif /* VLAN_TAG */ /* * VLAN membership for this L2 port. Each array element is a bit map * represents a set of 8 unique VLAN IDs, with the first octet specifies * VID 1 through 8, the second octet specifying VID 9 through 16, etc. * Within each octet, the most significant bit represents the highest * numbered VID. Thus, each VID is represented by a single bit. If that * bit has a value of 1, then this L2 port is the member for that VID; * the port is not a member its bit has a value of 0. */ unsigned char portVidMemberMap[512]; unsigned int numVid; /* number of vids configured for this port */ /* hardware layer 2 capabilities flags */ unsigned long hwCapabilities; /* original driver's NET_FUNCS table */ NET_FUNCS *pEndNetFuncs; /* driver's address format - Ethernet Type 2 or 802.3 addressing */ ETHER_FRAME_FORMAT endAddressFormat; int hwMtu; /* hardware mtu size */ #ifdef MUX_L2_VLAN_STATS MUX_L2_VLAN_PORT_STAT **muxL2VlanStat; /* * The number of valid frames received by this port which were discarded * due to reasons such as vlan membership problem or invalid ingress * frame type. Specifically, this implements the IEEE 802.1Q counter for * Discard Ingress Filtering. */ unsigned long muxL2PortInDiscards; /* * The number of valid frames transmitted by this port which were * discarded due to reasons such as vlan membership problem or invalid * egress frame type */ unsigned long muxL2PortOutDiscards; #endif /* MUX_L2_VLAN_STATS */ } MUX_L2_PORT; #ifdef MUX_L2_VLAN_STATS /* * Macros for MUX_L2_VLAN_STAT statistics that apply to the port/vlan pairing */ #define MUX_L2_VLAN_PORT_IN_FRAMES_COUNT(vlps) \ { \ if ((vlps) != NULL) \ (vlps)->muxL2VlanPortInFrames++; \ } #define MUX_L2_VLAN_PORT_OUT_FRAMES_COUNT(vlps) \ { \ if ((vlps) != NULL) \ (vlps)->muxL2VlanPortOutFrames++; \ } #define MUX_L2_VLAN_PORT_IN_DISCARDS_COUNT(vlps) \ { \ if ((vlps) != NULL) \ (vlps)->muxL2VlanPortInDiscards++; \ } /* * Macro for MUX_L2_PORT statistics that apply to the port */ #define MUX_L2_PORT_IN_DISCARDS_COUNT(vlp) vlp->muxL2PortInDiscards++; #define MUX_L2_PORT_OUT_DISCARDS_COUNT(vlp) vlp->muxL2PortOutDiscards++ #else /* MUX_L2_VLAN_STATS not defined */ #define MUX_L2_VLAN_PORT_IN_FRAMES_COUNT(vlps) #define MUX_L2_VLAN_PORT_OUT_FRAMES_COUNT(vlps) #define MUX_L2_VLAN_PORT_IN_DISCARDS_COUNT(vlps) #define MUX_L2_PORT_IN_DISCARDS_COUNT(vlp) #define MUX_L2_PORT_OUT_DISCARDS_COUNT(vlp) #endif /* MUX_L2_VLAN_STATS */ #endif /* _WRS_KERNEL */ #ifdef __cplusplus } #endif #endif /* __INCmuxL2VlanLibPh */