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 /** A VLAN header */
14 struct vlan_header {
15 	/** Tag control information */
16 	uint16_t tci;
17 	/** Encapsulated protocol */
18 	uint16_t net_proto;
19 } __attribute__ (( packed ));
20 
21 /**
22  * Extract VLAN tag from tag control information
23  *
24  * @v tci		Tag control information
25  * @ret tag		VLAN tag
26  */
27 #define VLAN_TAG( tci ) ( (tci) & 0x0fff )
28 
29 /**
30  * Extract VLAN priority from tag control information
31  *
32  * @v tci		Tag control information
33  * @ret priority	Priority
34  */
35 #define VLAN_PRIORITY( tci ) ( (tci) >> 13 )
36 
37 /**
38  * Construct VLAN tag control information
39  *
40  * @v tag		VLAN tag
41  * @v priority		Priority
42  * @ret tci		Tag control information
43  */
44 #define VLAN_TCI( tag, priority ) ( ( (priority) << 13 ) | (tag) )
45 
46 /**
47  * Check VLAN tag is valid
48  *
49  * @v tag		VLAN tag
50  * @ret is_valid	VLAN tag is valid
51  */
52 #define VLAN_TAG_IS_VALID( tag ) ( (tag) < 0xfff )
53 
54 /**
55  * Check VLAN priority is valid
56  *
57  * @v priority		VLAN priority
58  * @ret is_valid	VLAN priority is valid
59  */
60 #define VLAN_PRIORITY_IS_VALID( priority ) ( (priority) <= 7 )
61 
62 extern struct net_device * vlan_find ( struct net_device *trunk,
63 				       unsigned int tag );
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 
70 #endif /* _IPXE_VLAN_H */
71