1 #ifndef _IPXE_VLAN_H 2 #define _IPXE_VLAN_H 3 4 /** 5 * @file 6 * 7 * Virtual LANs 8 * 9 */ 10 11 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 12 13 #include <ipxe/netdevice.h> 14 15 /** A VLAN header */ 16 struct vlan_header { 17 /** Tag control information */ 18 uint16_t tci; 19 /** Encapsulated protocol */ 20 uint16_t net_proto; 21 } __attribute__ (( packed )); 22 23 /** 24 * Extract VLAN tag from tag control information 25 * 26 * @v tci Tag control information 27 * @ret tag VLAN tag 28 */ 29 #define VLAN_TAG( tci ) ( (tci) & 0x0fff ) 30 31 /** 32 * Extract VLAN priority from tag control information 33 * 34 * @v tci Tag control information 35 * @ret priority Priority 36 */ 37 #define VLAN_PRIORITY( tci ) ( (tci) >> 13 ) 38 39 /** 40 * Construct VLAN tag control information 41 * 42 * @v tag VLAN tag 43 * @v priority Priority 44 * @ret tci Tag control information 45 */ 46 #define VLAN_TCI( tag, priority ) ( ( (priority) << 13 ) | (tag) ) 47 48 /** 49 * Check VLAN tag is valid 50 * 51 * @v tag VLAN tag 52 * @ret is_valid VLAN tag is valid 53 */ 54 #define VLAN_TAG_IS_VALID( tag ) ( (tag) < 0xfff ) 55 56 /** 57 * Check VLAN priority is valid 58 * 59 * @v priority VLAN priority 60 * @ret is_valid VLAN priority is valid 61 */ 62 #define VLAN_PRIORITY_IS_VALID( priority ) ( (priority) <= 7 ) 63 64 extern unsigned int vlan_tag ( struct net_device *netdev ); 65 extern int vlan_can_be_trunk ( struct net_device *trunk ); 66 extern int vlan_create ( struct net_device *trunk, unsigned int tag, 67 unsigned int priority ); 68 extern int vlan_destroy ( struct net_device *netdev ); 69 extern void vlan_netdev_rx ( struct net_device *netdev, unsigned int tag, 70 struct io_buffer *iobuf ); 71 extern void vlan_netdev_rx_err ( struct net_device *netdev, unsigned int tag, 72 struct io_buffer *iobuf, int rc ); 73 74 #endif /* _IPXE_VLAN_H */ 75