linux/include/linux/if_vlan.h
<<
>>
Prefs
   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
  15#include <linux/netdevice.h>
  16#include <linux/etherdevice.h>
  17#include <linux/rtnetlink.h>
  18#include <linux/bug.h>
  19#include <uapi/linux/if_vlan.h>
  20
  21#define VLAN_HLEN       4               /* The additional bytes required by VLAN
  22                                         * (in addition to the Ethernet header)
  23                                         */
  24#define VLAN_ETH_HLEN   18              /* Total octets in header.       */
  25#define VLAN_ETH_ZLEN   64              /* Min. octets in frame sans FCS */
  26
  27/*
  28 * According to 802.3ac, the packet can be 4 bytes longer. --Klika Jan
  29 */
  30#define VLAN_ETH_DATA_LEN       1500    /* Max. octets in payload        */
  31#define VLAN_ETH_FRAME_LEN      1518    /* Max. octets in frame sans FCS */
  32
  33/*
  34 *      struct vlan_hdr - vlan header
  35 *      @h_vlan_TCI: priority and VLAN ID
  36 *      @h_vlan_encapsulated_proto: packet type ID or len
  37 */
  38struct vlan_hdr {
  39        __be16  h_vlan_TCI;
  40        __be16  h_vlan_encapsulated_proto;
  41};
  42
  43/**
  44 *      struct vlan_ethhdr - vlan ethernet header (ethhdr + vlan_hdr)
  45 *      @h_dest: destination ethernet address
  46 *      @h_source: source ethernet address
  47 *      @h_vlan_proto: ethernet protocol
  48 *      @h_vlan_TCI: priority and VLAN ID
  49 *      @h_vlan_encapsulated_proto: packet type ID or len
  50 */
  51struct vlan_ethhdr {
  52        unsigned char   h_dest[ETH_ALEN];
  53        unsigned char   h_source[ETH_ALEN];
  54        __be16          h_vlan_proto;
  55        __be16          h_vlan_TCI;
  56        __be16          h_vlan_encapsulated_proto;
  57};
  58
  59#include <linux/skbuff.h>
  60
  61static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb)
  62{
  63        return (struct vlan_ethhdr *)skb_mac_header(skb);
  64}
  65
  66#define VLAN_PRIO_MASK          0xe000 /* Priority Code Point */
  67#define VLAN_PRIO_SHIFT         13
  68#define VLAN_CFI_MASK           0x1000 /* Canonical Format Indicator */
  69#define VLAN_TAG_PRESENT        VLAN_CFI_MASK
  70#define VLAN_VID_MASK           0x0fff /* VLAN Identifier */
  71#define VLAN_N_VID              4096
  72
  73/* found in socket.c */
  74extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *));
  75
  76static inline bool is_vlan_dev(const struct net_device *dev)
  77{
  78        return dev->priv_flags & IFF_802_1Q_VLAN;
  79}
  80
  81#define skb_vlan_tag_present(__skb)     ((__skb)->vlan_tci & VLAN_TAG_PRESENT)
  82#define skb_vlan_tag_get(__skb)         ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
  83#define skb_vlan_tag_get_id(__skb)      ((__skb)->vlan_tci & VLAN_VID_MASK)
  84#define skb_vlan_tag_get_prio(__skb)    ((__skb)->vlan_tci & VLAN_PRIO_MASK)
  85
  86/**
  87 *      struct vlan_pcpu_stats - VLAN percpu rx/tx stats
  88 *      @rx_packets: number of received packets
  89 *      @rx_bytes: number of received bytes
  90 *      @rx_multicast: number of received multicast packets
  91 *      @tx_packets: number of transmitted packets
  92 *      @tx_bytes: number of transmitted bytes
  93 *      @syncp: synchronization point for 64bit counters
  94 *      @rx_errors: number of rx errors
  95 *      @tx_dropped: number of tx drops
  96 */
  97struct vlan_pcpu_stats {
  98        u64                     rx_packets;
  99        u64                     rx_bytes;
 100        u64                     rx_multicast;
 101        u64                     tx_packets;
 102        u64                     tx_bytes;
 103        struct u64_stats_sync   syncp;
 104        u32                     rx_errors;
 105        u32                     tx_dropped;
 106};
 107
 108#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 109
 110extern struct net_device *__vlan_find_dev_deep_rcu(struct net_device *real_dev,
 111                                               __be16 vlan_proto, u16 vlan_id);
 112extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
 113extern u16 vlan_dev_vlan_id(const struct net_device *dev);
 114extern __be16 vlan_dev_vlan_proto(const struct net_device *dev);
 115
 116/**
 117 *      struct vlan_priority_tci_mapping - vlan egress priority mappings
 118 *      @priority: skb priority
 119 *      @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000
 120 *      @next: pointer to next struct
 121 */
 122struct vlan_priority_tci_mapping {
 123        u32                                     priority;
 124        u16                                     vlan_qos;
 125        struct vlan_priority_tci_mapping        *next;
 126};
 127
 128struct proc_dir_entry;
 129struct netpoll;
 130
 131/**
 132 *      struct vlan_dev_priv - VLAN private device data
 133 *      @nr_ingress_mappings: number of ingress priority mappings
 134 *      @ingress_priority_map: ingress priority mappings
 135 *      @nr_egress_mappings: number of egress priority mappings
 136 *      @egress_priority_map: hash of egress priority mappings
 137 *      @vlan_proto: VLAN encapsulation protocol
 138 *      @vlan_id: VLAN identifier
 139 *      @flags: device flags
 140 *      @real_dev: underlying netdevice
 141 *      @real_dev_addr: address of underlying netdevice
 142 *      @dent: proc dir entry
 143 *      @vlan_pcpu_stats: ptr to percpu rx stats
 144 */
 145struct vlan_dev_priv {
 146        unsigned int                            nr_ingress_mappings;
 147        u32                                     ingress_priority_map[8];
 148        unsigned int                            nr_egress_mappings;
 149        struct vlan_priority_tci_mapping        *egress_priority_map[16];
 150
 151        __be16                                  vlan_proto;
 152        u16                                     vlan_id;
 153        u16                                     flags;
 154
 155        struct net_device                       *real_dev;
 156        unsigned char                           real_dev_addr[ETH_ALEN];
 157
 158        struct proc_dir_entry                   *dent;
 159        struct vlan_pcpu_stats __percpu         *vlan_pcpu_stats;
 160#ifdef CONFIG_NET_POLL_CONTROLLER
 161        struct netpoll                          *netpoll;
 162#endif
 163        unsigned int                            nest_level;
 164};
 165
 166static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev)
 167{
 168        return netdev_priv(dev);
 169}
 170
 171static inline u16
 172vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
 173{
 174        struct vlan_priority_tci_mapping *mp;
 175
 176        smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */
 177
 178        mp = vlan_dev_priv(dev)->egress_priority_map[(skprio & 0xF)];
 179        while (mp) {
 180                if (mp->priority == skprio) {
 181                        return mp->vlan_qos; /* This should already be shifted
 182                                              * to mask correctly with the
 183                                              * VLAN's TCI */
 184                }
 185                mp = mp->next;
 186        }
 187        return 0;
 188}
 189
 190extern bool vlan_do_receive(struct sk_buff **skb);
 191
 192extern int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid);
 193extern void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid);
 194
 195extern int vlan_vids_add_by_dev(struct net_device *dev,
 196                                const struct net_device *by_dev);
 197extern void vlan_vids_del_by_dev(struct net_device *dev,
 198                                 const struct net_device *by_dev);
 199
 200extern bool vlan_uses_dev(const struct net_device *dev);
 201
 202static inline int vlan_get_encap_level(struct net_device *dev)
 203{
 204        BUG_ON(!is_vlan_dev(dev));
 205        return vlan_dev_priv(dev)->nest_level;
 206}
 207#else
 208static inline struct net_device *
 209__vlan_find_dev_deep_rcu(struct net_device *real_dev,
 210                     __be16 vlan_proto, u16 vlan_id)
 211{
 212        return NULL;
 213}
 214
 215static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
 216{
 217        BUG();
 218        return NULL;
 219}
 220
 221static inline u16 vlan_dev_vlan_id(const struct net_device *dev)
 222{
 223        BUG();
 224        return 0;
 225}
 226
 227static inline __be16 vlan_dev_vlan_proto(const struct net_device *dev)
 228{
 229        BUG();
 230        return 0;
 231}
 232
 233static inline u16 vlan_dev_get_egress_qos_mask(struct net_device *dev,
 234                                               u32 skprio)
 235{
 236        return 0;
 237}
 238
 239static inline bool vlan_do_receive(struct sk_buff **skb)
 240{
 241        return false;
 242}
 243
 244static inline int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid)
 245{
 246        return 0;
 247}
 248
 249static inline void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid)
 250{
 251}
 252
 253static inline int vlan_vids_add_by_dev(struct net_device *dev,
 254                                       const struct net_device *by_dev)
 255{
 256        return 0;
 257}
 258
 259static inline void vlan_vids_del_by_dev(struct net_device *dev,
 260                                        const struct net_device *by_dev)
 261{
 262}
 263
 264static inline bool vlan_uses_dev(const struct net_device *dev)
 265{
 266        return false;
 267}
 268static inline int vlan_get_encap_level(struct net_device *dev)
 269{
 270        BUG();
 271        return 0;
 272}
 273#endif
 274
 275/**
 276 * eth_type_vlan - check for valid vlan ether type.
 277 * @ethertype: ether type to check
 278 *
 279 * Returns true if the ether type is a vlan ether type.
 280 */
 281static inline bool eth_type_vlan(__be16 ethertype)
 282{
 283        switch (ethertype) {
 284        case htons(ETH_P_8021Q):
 285        case htons(ETH_P_8021AD):
 286                return true;
 287        default:
 288                return false;
 289        }
 290}
 291
 292static inline bool vlan_hw_offload_capable(netdev_features_t features,
 293                                           __be16 proto)
 294{
 295        if (proto == htons(ETH_P_8021Q) && features & NETIF_F_HW_VLAN_CTAG_TX)
 296                return true;
 297        if (proto == htons(ETH_P_8021AD) && features & NETIF_F_HW_VLAN_STAG_TX)
 298                return true;
 299        return false;
 300}
 301
 302/**
 303 * __vlan_insert_tag - regular VLAN tag inserting
 304 * @skb: skbuff to tag
 305 * @vlan_proto: VLAN encapsulation protocol
 306 * @vlan_tci: VLAN TCI to insert
 307 *
 308 * Inserts the VLAN tag into @skb as part of the payload
 309 * Returns error if skb_cow_head failes.
 310 *
 311 * Does not change skb->protocol so this function can be used during receive.
 312 */
 313static inline int __vlan_insert_tag(struct sk_buff *skb,
 314                                    __be16 vlan_proto, u16 vlan_tci)
 315{
 316        struct vlan_ethhdr *veth;
 317
 318        if (skb_cow_head(skb, VLAN_HLEN) < 0)
 319                return -ENOMEM;
 320
 321        veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
 322
 323        /* Move the mac addresses to the beginning of the new header. */
 324        memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN);
 325        skb->mac_header -= VLAN_HLEN;
 326
 327        /* first, the ethernet type */
 328        veth->h_vlan_proto = vlan_proto;
 329
 330        /* now, the TCI */
 331        veth->h_vlan_TCI = htons(vlan_tci);
 332
 333        return 0;
 334}
 335
 336/**
 337 * vlan_insert_tag - regular VLAN tag inserting
 338 * @skb: skbuff to tag
 339 * @vlan_proto: VLAN encapsulation protocol
 340 * @vlan_tci: VLAN TCI to insert
 341 *
 342 * Inserts the VLAN tag into @skb as part of the payload
 343 * Returns a VLAN tagged skb. If a new skb is created, @skb is freed.
 344 *
 345 * Following the skb_unshare() example, in case of error, the calling function
 346 * doesn't have to worry about freeing the original skb.
 347 *
 348 * Does not change skb->protocol so this function can be used during receive.
 349 */
 350static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb,
 351                                              __be16 vlan_proto, u16 vlan_tci)
 352{
 353        int err;
 354
 355        err = __vlan_insert_tag(skb, vlan_proto, vlan_tci);
 356        if (err) {
 357                dev_kfree_skb_any(skb);
 358                return NULL;
 359        }
 360        return skb;
 361}
 362
 363/**
 364 * vlan_insert_tag_set_proto - regular VLAN tag inserting
 365 * @skb: skbuff to tag
 366 * @vlan_proto: VLAN encapsulation protocol
 367 * @vlan_tci: VLAN TCI to insert
 368 *
 369 * Inserts the VLAN tag into @skb as part of the payload
 370 * Returns a VLAN tagged skb. If a new skb is created, @skb is freed.
 371 *
 372 * Following the skb_unshare() example, in case of error, the calling function
 373 * doesn't have to worry about freeing the original skb.
 374 */
 375static inline struct sk_buff *vlan_insert_tag_set_proto(struct sk_buff *skb,
 376                                                        __be16 vlan_proto,
 377                                                        u16 vlan_tci)
 378{
 379        skb = vlan_insert_tag(skb, vlan_proto, vlan_tci);
 380        if (skb)
 381                skb->protocol = vlan_proto;
 382        return skb;
 383}
 384
 385/*
 386 * __vlan_hwaccel_push_inside - pushes vlan tag to the payload
 387 * @skb: skbuff to tag
 388 *
 389 * Pushes the VLAN tag from @skb->vlan_tci inside to the payload.
 390 *
 391 * Following the skb_unshare() example, in case of error, the calling function
 392 * doesn't have to worry about freeing the original skb.
 393 */
 394static inline struct sk_buff *__vlan_hwaccel_push_inside(struct sk_buff *skb)
 395{
 396        skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto,
 397                                        skb_vlan_tag_get(skb));
 398        if (likely(skb))
 399                skb->vlan_tci = 0;
 400        return skb;
 401}
 402
 403/**
 404 * __vlan_hwaccel_put_tag - hardware accelerated VLAN inserting
 405 * @skb: skbuff to tag
 406 * @vlan_proto: VLAN encapsulation protocol
 407 * @vlan_tci: VLAN TCI to insert
 408 *
 409 * Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest
 410 */
 411static inline void __vlan_hwaccel_put_tag(struct sk_buff *skb,
 412                                          __be16 vlan_proto, u16 vlan_tci)
 413{
 414        skb->vlan_proto = vlan_proto;
 415        skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci;
 416}
 417
 418/**
 419 * __vlan_get_tag - get the VLAN ID that is part of the payload
 420 * @skb: skbuff to query
 421 * @vlan_tci: buffer to store value
 422 *
 423 * Returns error if the skb is not of VLAN type
 424 */
 425static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
 426{
 427        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data;
 428
 429        if (!eth_type_vlan(veth->h_vlan_proto))
 430                return -EINVAL;
 431
 432        *vlan_tci = ntohs(veth->h_vlan_TCI);
 433        return 0;
 434}
 435
 436/**
 437 * __vlan_hwaccel_get_tag - get the VLAN ID that is in @skb->cb[]
 438 * @skb: skbuff to query
 439 * @vlan_tci: buffer to store value
 440 *
 441 * Returns error if @skb->vlan_tci is not set correctly
 442 */
 443static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb,
 444                                         u16 *vlan_tci)
 445{
 446        if (skb_vlan_tag_present(skb)) {
 447                *vlan_tci = skb_vlan_tag_get(skb);
 448                return 0;
 449        } else {
 450                *vlan_tci = 0;
 451                return -EINVAL;
 452        }
 453}
 454
 455#define HAVE_VLAN_GET_TAG
 456
 457/**
 458 * vlan_get_tag - get the VLAN ID from the skb
 459 * @skb: skbuff to query
 460 * @vlan_tci: buffer to store value
 461 *
 462 * Returns error if the skb is not VLAN tagged
 463 */
 464static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
 465{
 466        if (skb->dev->features & NETIF_F_HW_VLAN_CTAG_TX) {
 467                return __vlan_hwaccel_get_tag(skb, vlan_tci);
 468        } else {
 469                return __vlan_get_tag(skb, vlan_tci);
 470        }
 471}
 472
 473/**
 474 * vlan_get_protocol - get protocol EtherType.
 475 * @skb: skbuff to query
 476 * @type: first vlan protocol
 477 * @depth: buffer to store length of eth and vlan tags in bytes
 478 *
 479 * Returns the EtherType of the packet, regardless of whether it is
 480 * vlan encapsulated (normal or hardware accelerated) or not.
 481 */
 482static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type,
 483                                         int *depth)
 484{
 485        unsigned int vlan_depth = skb->mac_len;
 486
 487        /* if type is 802.1Q/AD then the header should already be
 488         * present at mac_len - VLAN_HLEN (if mac_len > 0), or at
 489         * ETH_HLEN otherwise
 490         */
 491        if (eth_type_vlan(type)) {
 492                if (vlan_depth) {
 493                        if (WARN_ON(vlan_depth < VLAN_HLEN))
 494                                return 0;
 495                        vlan_depth -= VLAN_HLEN;
 496                } else {
 497                        vlan_depth = ETH_HLEN;
 498                }
 499                do {
 500                        struct vlan_hdr *vh;
 501
 502                        if (unlikely(!pskb_may_pull(skb,
 503                                                    vlan_depth + VLAN_HLEN)))
 504                                return 0;
 505
 506                        vh = (struct vlan_hdr *)(skb->data + vlan_depth);
 507                        type = vh->h_vlan_encapsulated_proto;
 508                        vlan_depth += VLAN_HLEN;
 509                } while (eth_type_vlan(type));
 510        }
 511
 512        if (depth)
 513                *depth = vlan_depth;
 514
 515        return type;
 516}
 517
 518/**
 519 * vlan_get_protocol - get protocol EtherType.
 520 * @skb: skbuff to query
 521 *
 522 * Returns the EtherType of the packet, regardless of whether it is
 523 * vlan encapsulated (normal or hardware accelerated) or not.
 524 */
 525static inline __be16 vlan_get_protocol(struct sk_buff *skb)
 526{
 527        return __vlan_get_protocol(skb, skb->protocol, NULL);
 528}
 529
 530static inline void vlan_set_encap_proto(struct sk_buff *skb,
 531                                        struct vlan_hdr *vhdr)
 532{
 533        __be16 proto;
 534        unsigned short *rawp;
 535
 536        /*
 537         * Was a VLAN packet, grab the encapsulated protocol, which the layer
 538         * three protocols care about.
 539         */
 540
 541        proto = vhdr->h_vlan_encapsulated_proto;
 542        if (eth_proto_is_802_3(proto)) {
 543                skb->protocol = proto;
 544                return;
 545        }
 546
 547        rawp = (unsigned short *)(vhdr + 1);
 548        if (*rawp == 0xFFFF)
 549                /*
 550                 * This is a magic hack to spot IPX packets. Older Novell
 551                 * breaks the protocol design and runs IPX over 802.3 without
 552                 * an 802.2 LLC layer. We look for FFFF which isn't a used
 553                 * 802.2 SSAP/DSAP. This won't work for fault tolerant netware
 554                 * but does for the rest.
 555                 */
 556                skb->protocol = htons(ETH_P_802_3);
 557        else
 558                /*
 559                 * Real 802.2 LLC
 560                 */
 561                skb->protocol = htons(ETH_P_802_2);
 562}
 563
 564/**
 565 * skb_vlan_tagged - check if skb is vlan tagged.
 566 * @skb: skbuff to query
 567 *
 568 * Returns true if the skb is tagged, regardless of whether it is hardware
 569 * accelerated or not.
 570 */
 571static inline bool skb_vlan_tagged(const struct sk_buff *skb)
 572{
 573        if (!skb_vlan_tag_present(skb) &&
 574            likely(!eth_type_vlan(skb->protocol)))
 575                return false;
 576
 577        return true;
 578}
 579
 580/**
 581 * skb_vlan_tagged_multi - check if skb is vlan tagged with multiple headers.
 582 * @skb: skbuff to query
 583 *
 584 * Returns true if the skb is tagged with multiple vlan headers, regardless
 585 * of whether it is hardware accelerated or not.
 586 */
 587static inline bool skb_vlan_tagged_multi(const struct sk_buff *skb)
 588{
 589        __be16 protocol = skb->protocol;
 590
 591        if (!skb_vlan_tag_present(skb)) {
 592                struct vlan_ethhdr *veh;
 593
 594                if (likely(!eth_type_vlan(protocol)))
 595                        return false;
 596
 597                veh = (struct vlan_ethhdr *)skb->data;
 598                protocol = veh->h_vlan_encapsulated_proto;
 599        }
 600
 601        if (!eth_type_vlan(protocol))
 602                return false;
 603
 604        return true;
 605}
 606
 607/**
 608 * vlan_features_check - drop unsafe features for skb with multiple tags.
 609 * @skb: skbuff to query
 610 * @features: features to be checked
 611 *
 612 * Returns features without unsafe ones if the skb has multiple tags.
 613 */
 614static inline netdev_features_t vlan_features_check(const struct sk_buff *skb,
 615                                                    netdev_features_t features)
 616{
 617        if (skb_vlan_tagged_multi(skb)) {
 618                /* In the case of multi-tagged packets, use a direct mask
 619                 * instead of using netdev_interesect_features(), to make
 620                 * sure that only devices supporting NETIF_F_HW_CSUM will
 621                 * have checksum offloading support.
 622                 */
 623                features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_HW_CSUM |
 624                            NETIF_F_FRAGLIST | NETIF_F_HW_VLAN_CTAG_TX |
 625                            NETIF_F_HW_VLAN_STAG_TX;
 626        }
 627
 628        return features;
 629}
 630
 631/**
 632 * compare_vlan_header - Compare two vlan headers
 633 * @h1: Pointer to vlan header
 634 * @h2: Pointer to vlan header
 635 *
 636 * Compare two vlan headers, returns 0 if equal.
 637 *
 638 * Please note that alignment of h1 & h2 are only guaranteed to be 16 bits.
 639 */
 640static inline unsigned long compare_vlan_header(const struct vlan_hdr *h1,
 641                                                const struct vlan_hdr *h2)
 642{
 643#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 644        return *(u32 *)h1 ^ *(u32 *)h2;
 645#else
 646        return ((__force u32)h1->h_vlan_TCI ^ (__force u32)h2->h_vlan_TCI) |
 647               ((__force u32)h1->h_vlan_encapsulated_proto ^
 648                (__force u32)h2->h_vlan_encapsulated_proto);
 649#endif
 650}
 651#endif /* !(_LINUX_IF_VLAN_H_) */
 652