if_vlan.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * VLAN An implementation of 802.1Q VLAN tagging.
  3.  *
  4.  * Authors: Ben Greear <greearb@candelatech.com>
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version
  9.  * 2 of the License, or (at your option) any later version.
  10.  *
  11.  */
  12. #ifndef _LINUX_IF_VLAN_H_
  13. #define _LINUX_IF_VLAN_H_
  14. #ifdef __KERNEL__
  15. /* externally defined structs */
  16. struct vlan_group;
  17. struct net_device;
  18. struct sk_buff;
  19. struct packet_type;
  20. struct vlan_collection;
  21. struct vlan_dev_info;
  22. #include <linux/proc_fs.h> /* for proc_dir_entry */
  23. #include <linux/netdevice.h>
  24. #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header)
  25.  * that VLAN requires.
  26.  */
  27. #define VLAN_ETH_ALEN 6 /* Octets in one ethernet addr  */
  28. #define VLAN_ETH_HLEN 18 /* Total octets in header.  */
  29. #define VLAN_ETH_ZLEN 64 /* Min. octets in frame sans FCS */
  30. /*
  31.  * According to 802.3ac, the packet can be 4 bytes longer. --Klika Jan
  32.  */
  33. #define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload  */
  34. #define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */
  35. struct vlan_ethhdr {
  36.    unsigned char h_dest[ETH_ALEN];    /* destination eth addr */
  37.    unsigned char h_source[ETH_ALEN];    /* source ether addr */
  38.    unsigned short       h_vlan_proto;              /* Should always be 0x8100 */
  39.    unsigned short       h_vlan_TCI;                /* Encapsulates priority and VLAN ID */
  40.    unsigned short h_vlan_encapsulated_proto; /* packet type ID field (or len) */
  41. };
  42. struct vlan_hdr {
  43.    unsigned short       h_vlan_TCI;                /* Encapsulates priority and VLAN ID */
  44.    unsigned short       h_vlan_encapsulated_proto; /* packet type ID field (or len) */
  45. };
  46. /*  Find a VLAN device by the MAC address of it's Ethernet device, and
  47.  *  it's VLAN ID.  The default configuration is to have VLAN's scope
  48.  *  to be box-wide, so the MAC will be ignored.  The mac will only be
  49.  *  looked at if we are configured to have a seperate set of VLANs per
  50.  *  each MAC addressable interface.  Note that this latter option does
  51.  *  NOT follow the spec for VLANs, but may be useful for doing very
  52.  *  large quantities of VLAN MUX/DEMUX onto FrameRelay or ATM PVCs.
  53.  */
  54. struct net_device *find_802_1Q_vlan_dev(struct net_device* real_dev,
  55.                                         unsigned short VID); /* vlan.c */
  56. /* found in af_inet.c */
  57. extern int (*vlan_ioctl_hook)(unsigned long arg);
  58. /* found in vlan_dev.c */
  59. struct net_device_stats* vlan_dev_get_stats(struct net_device* dev);
  60. int vlan_dev_rebuild_header(struct sk_buff *skb);
  61. int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
  62.                   struct packet_type* ptype);
  63. int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
  64.                          unsigned short type, void *daddr, void *saddr,
  65.                          unsigned len);
  66. int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
  67. int vlan_dev_change_mtu(struct net_device *dev, int new_mtu);
  68. int vlan_dev_set_mac_address(struct net_device *dev, void* addr);
  69. int vlan_dev_open(struct net_device* dev);
  70. int vlan_dev_stop(struct net_device* dev);
  71. int vlan_dev_init(struct net_device* dev);
  72. void vlan_dev_destruct(struct net_device* dev);
  73. void vlan_dev_copy_and_sum(struct sk_buff *dest, unsigned char *src,
  74.                            int length, int base);
  75. int vlan_dev_set_ingress_priority(char* dev_name, __u32 skb_prio, short vlan_prio);
  76. int vlan_dev_set_egress_priority(char* dev_name, __u32 skb_prio, short vlan_prio);
  77. int vlan_dev_set_vlan_flag(char* dev_name, __u32 flag, short flag_val);
  78. /* VLAN multicast stuff */
  79. /* Delete all of the MC list entries from this vlan device.  Also deals
  80.  * with the underlying device...
  81.  */
  82. void vlan_flush_mc_list(struct net_device* dev);
  83. /* copy the mc_list into the vlan_info structure. */
  84. void vlan_copy_mc_list(struct dev_mc_list* mc_list, struct vlan_dev_info* vlan_info);
  85. /** dmi is a single entry into a dev_mc_list, a single node.  mc_list is
  86.  *  an entire list, and we'll iterate through it.
  87.  */
  88. int vlan_should_add_mc(struct dev_mc_list *dmi, struct dev_mc_list *mc_list);
  89. /** Taken from Gleb + Lennert's VLAN code, and modified... */
  90. void vlan_dev_set_multicast_list(struct net_device *vlan_dev);
  91. int vlan_collection_add_vlan(struct vlan_collection* vc, unsigned short vlan_id,
  92.                              unsigned short flags);
  93. int vlan_collection_remove_vlan(struct vlan_collection* vc,
  94.                                 struct net_device* vlan_dev);
  95. int vlan_collection_remove_vlan_id(struct vlan_collection* vc, unsigned short vlan_id);
  96. /* found in vlan.c */
  97. /* Our listing of VLAN group(s) */
  98. extern struct vlan_group* p802_1Q_vlan_list;
  99. #define VLAN_NAME "vlan"
  100. /* if this changes, algorithm will have to be reworked because this
  101.  * depends on completely exhausting the VLAN identifier space.  Thus
  102.  * it gives constant time look-up, but it many cases it wastes memory.
  103.  */
  104. #define VLAN_GROUP_ARRAY_LEN 4096
  105. struct vlan_group {
  106. int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */
  107. struct net_device *vlan_devices[VLAN_GROUP_ARRAY_LEN];
  108. struct vlan_group *next; /* the next in the list */
  109. };
  110. struct vlan_priority_tci_mapping {
  111. unsigned long priority;
  112. unsigned short vlan_qos; /* This should be shifted when first set, so we only do it
  113.   * at provisioning time.
  114.   * ((skb->priority << 13) & 0xE000)
  115.   */
  116. struct vlan_priority_tci_mapping *next;
  117. };
  118. /* Holds information that makes sense if this device is a VLAN device. */
  119. struct vlan_dev_info {
  120. /** This will be the mapping that correlates skb->priority to
  121.  * 3 bits of VLAN QOS tags...
  122.  */
  123. unsigned long ingress_priority_map[8];
  124. struct vlan_priority_tci_mapping *egress_priority_map[16]; /* hash table */
  125. unsigned short vlan_id;        /*  The VLAN Identifier for this interface. */
  126. unsigned short flags;          /* (1 << 0) re_order_header   This option will cause the
  127.                                         *   VLAN code to move around the ethernet header on
  128.                                         *   ingress to make the skb look **exactly** like it
  129.                                         *   came in from an ethernet port.  This destroys some of
  130.                                         *   the VLAN information in the skb, but it fixes programs
  131.                                         *   like DHCP that use packet-filtering and don't understand
  132.                                         *   802.1Q
  133.                                         */
  134. struct dev_mc_list *old_mc_list;  /* old multi-cast list for the VLAN interface..
  135.                                            * we save this so we can tell what changes were
  136.                                            * made, in order to feed the right changes down
  137.                                            * to the real hardware...
  138.                                            */
  139. int old_allmulti;               /* similar to above. */
  140. int old_promiscuity;            /* similar to above. */
  141. struct net_device *real_dev;    /* the underlying device/interface */
  142. struct proc_dir_entry *dent;    /* Holds the proc data */
  143. unsigned long cnt_inc_headroom_on_tx; /* How many times did we have to grow the skb on TX. */
  144. unsigned long cnt_encap_on_xmit;      /* How many times did we have to encapsulate the skb on TX. */
  145. struct net_device_stats dev_stats; /* Device stats (rx-bytes, tx-pkts, etc...) */
  146. };
  147. #define VLAN_DEV_INFO(x) ((struct vlan_dev_info *)(x->priv))
  148. /* inline functions */
  149. /* Used in vlan_skb_recv */
  150. static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
  151. {
  152. if (VLAN_DEV_INFO(skb->dev)->flags & 1) {
  153. skb = skb_share_check(skb, GFP_ATOMIC);
  154. if (skb) {
  155. /* Lifted from Gleb's VLAN code... */
  156. memmove(skb->data - ETH_HLEN,
  157. skb->data - VLAN_ETH_HLEN, 12);
  158. skb->mac.raw += VLAN_HLEN;
  159. }
  160. }
  161. return skb;
  162. }
  163. static inline unsigned short vlan_dev_get_egress_qos_mask(struct net_device* dev,
  164.   struct sk_buff* skb)
  165. {
  166. struct vlan_priority_tci_mapping *mp =
  167. VLAN_DEV_INFO(dev)->egress_priority_map[(skb->priority & 0xF)];
  168. while (mp) {
  169. if (mp->priority == skb->priority) {
  170. return mp->vlan_qos; /* This should already be shifted to mask
  171.       * correctly with the VLAN's TCI
  172.       */
  173. }
  174. mp = mp->next;
  175. }
  176. return 0;
  177. }
  178. static inline int vlan_dmi_equals(struct dev_mc_list *dmi1,
  179.                                   struct dev_mc_list *dmi2)
  180. {
  181. return ((dmi1->dmi_addrlen == dmi2->dmi_addrlen) &&
  182. (memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0));
  183. }
  184. static inline void vlan_destroy_mc_list(struct dev_mc_list *mc_list)
  185. {
  186. struct dev_mc_list *dmi = mc_list;
  187. struct dev_mc_list *next;
  188. while(dmi) {
  189. next = dmi->next;
  190. kfree(dmi);
  191. dmi = next;
  192. }
  193. }
  194. #endif /* __KERNEL__ */
  195. /* VLAN IOCTLs are found in sockios.h */
  196. /* Passed in vlan_ioctl_args structure to determine behaviour. */
  197. enum vlan_ioctl_cmds {
  198. ADD_VLAN_CMD,
  199. DEL_VLAN_CMD,
  200. SET_VLAN_INGRESS_PRIORITY_CMD,
  201. SET_VLAN_EGRESS_PRIORITY_CMD,
  202. GET_VLAN_INGRESS_PRIORITY_CMD,
  203. GET_VLAN_EGRESS_PRIORITY_CMD,
  204. SET_VLAN_NAME_TYPE_CMD,
  205. SET_VLAN_FLAG_CMD
  206. };
  207. enum vlan_name_types {
  208. VLAN_NAME_TYPE_PLUS_VID, /* Name will look like:  vlan0005 */
  209. VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like:  eth1.0005 */
  210. VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like:  vlan5 */
  211. VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like:  eth0.5 */
  212. VLAN_NAME_TYPE_HIGHEST
  213. };
  214. struct vlan_ioctl_args {
  215. int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */
  216. char device1[24];
  217.         union {
  218. char device2[24];
  219. int VID;
  220. unsigned int skb_priority;
  221. unsigned int name_type;
  222. unsigned int bind_type;
  223. unsigned int flag; /* Matches vlan_dev_info flags */
  224.         } u;
  225. short vlan_qos;   
  226. };
  227. #endif /* !(_LINUX_IF_VLAN_H_) */