iPXE
Data Structures | Macros | Functions
vlan.h File Reference

Virtual LANs. More...

#include <ipxe/netdevice.h>

Go to the source code of this file.

Data Structures

struct  vlan_header
 A VLAN header. More...
 

Macros

#define VLAN_TAG(tci)   ( (tci) & 0x0fff )
 Extract VLAN tag from tag control information. More...
 
#define VLAN_PRIORITY(tci)   ( (tci) >> 13 )
 Extract VLAN priority from tag control information. More...
 
#define VLAN_TCI(tag, priority)   ( ( (priority) << 13 ) | (tag) )
 Construct VLAN tag control information. More...
 
#define VLAN_TAG_IS_VALID(tag)   ( (tag) < 0xfff )
 Check VLAN tag is valid. More...
 
#define VLAN_PRIORITY_IS_VALID(priority)   ( (priority) <= 7 )
 Check VLAN priority is valid. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
unsigned int vlan_tci (struct net_device *netdev)
 Get the VLAN tag control information. More...
 
static unsigned int vlan_tag (struct net_device *netdev)
 Get the VLAN tag. More...
 
struct net_devicevlan_find (struct net_device *trunk, unsigned int tag)
 Identify VLAN device. More...
 
int vlan_can_be_trunk (struct net_device *trunk)
 Check if network device can be used as a VLAN trunk device. More...
 
int vlan_create (struct net_device *trunk, unsigned int tag, unsigned int priority)
 Create VLAN device. More...
 
int vlan_destroy (struct net_device *netdev)
 Destroy VLAN device. More...
 
void vlan_auto (const void *ll_addr, unsigned int tag)
 Configure automatic VLAN device. More...
 
void vlan_netdev_rx (struct net_device *netdev, unsigned int tag, struct io_buffer *iobuf)
 Add VLAN tag-stripped packet to queue (when VLAN support is not present) More...
 
void vlan_netdev_rx_err (struct net_device *netdev, unsigned int tag, struct io_buffer *iobuf, int rc)
 Discard received VLAN tag-stripped packet (when VLAN support is not present) More...
 

Detailed Description

Virtual LANs.

Definition in file vlan.h.

Macro Definition Documentation

◆ VLAN_TAG

#define VLAN_TAG (   tci)    ( (tci) & 0x0fff )

Extract VLAN tag from tag control information.

Parameters
tciTag control information
Return values
tagVLAN tag

Definition at line 29 of file vlan.h.

◆ VLAN_PRIORITY

#define VLAN_PRIORITY (   tci)    ( (tci) >> 13 )

Extract VLAN priority from tag control information.

Parameters
tciTag control information
Return values
priorityPriority

Definition at line 37 of file vlan.h.

◆ VLAN_TCI

#define VLAN_TCI (   tag,
  priority 
)    ( ( (priority) << 13 ) | (tag) )

Construct VLAN tag control information.

Parameters
tagVLAN tag
priorityPriority
Return values
tciTag control information

Definition at line 46 of file vlan.h.

◆ VLAN_TAG_IS_VALID

#define VLAN_TAG_IS_VALID (   tag)    ( (tag) < 0xfff )

Check VLAN tag is valid.

Parameters
tagVLAN tag
Return values
is_validVLAN tag is valid

Definition at line 54 of file vlan.h.

◆ VLAN_PRIORITY_IS_VALID

#define VLAN_PRIORITY_IS_VALID (   priority)    ( (priority) <= 7 )

Check VLAN priority is valid.

Parameters
priorityVLAN priority
Return values
is_validVLAN priority is valid

Definition at line 62 of file vlan.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ vlan_tci()

unsigned int vlan_tci ( struct net_device netdev)

Get the VLAN tag control information.

Parameters
netdevNetwork device
Return values
tciVLAN tag control information, or 0 if not a VLAN device

Definition at line 301 of file vlan.c.

301  {
302  struct vlan_device *vlan;
303 
304  if ( netdev->op == &vlan_operations ) {
305  vlan = netdev->priv;
306  return ( VLAN_TCI ( vlan->tag, vlan->priority ) );
307  } else {
308  return 0;
309  }
310 }
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:170
#define VLAN_TCI(tag, priority)
Construct VLAN tag control information.
Definition: vlan.h:46
VLAN device private data.
Definition: vlan.c:49
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int tag
VLAN tag.
Definition: vlan.c:53
unsigned int priority
Default priority.
Definition: vlan.c:55

References netdev, net_device::op, vlan_device::priority, net_device::priv, vlan_device::tag, vlan_operations, and VLAN_TCI.

Referenced by vlan_tag().

◆ vlan_tag()

static unsigned int vlan_tag ( struct net_device netdev)
inlinestatic

Get the VLAN tag.

Parameters
netdevNetwork device
Return values
tagVLAN tag, or 0 if device is not a VLAN device

Definition at line 73 of file vlan.h.

73  {
74  return VLAN_TAG ( vlan_tci ( netdev ) );
75 }
#define VLAN_TAG(tci)
Extract VLAN tag from tag control information.
Definition: vlan.h:29
unsigned int vlan_tci(struct net_device *netdev)
Get the VLAN tag control information.
Definition: vlan.c:301
static struct net_device * netdev
Definition: gdbudp.c:52

References netdev, VLAN_TAG, and vlan_tci().

Referenced by cachedhcp_apply(), eapol_probe(), efi_netdev_path(), ibft_fill_nic(), and is_autoboot_ll_addr().

◆ vlan_find()

struct net_device* vlan_find ( struct net_device trunk,
unsigned int  tag 
)

Identify VLAN device.

Parameters
trunkTrunk network device
tagVLAN tag
Return values
netdevVLAN device, if any

Definition at line 208 of file vlan.c.

208  {
209  struct net_device *netdev;
210  struct vlan_device *vlan;
211 
212  for_each_netdev ( netdev ) {
213  if ( netdev->op != &vlan_operations )
214  continue;
215  vlan = netdev->priv;
216  if ( ( vlan->trunk == trunk ) && ( vlan->tag == tag ) )
217  return netdev;
218  }
219  return NULL;
220 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:51
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:170
VLAN device private data.
Definition: vlan.c:49
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:543
A network device.
Definition: netdevice.h:352
unsigned int tag
VLAN tag.
Definition: vlan.c:53
uint64_t tag
Identity tag.
Definition: edd.h:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References for_each_netdev, netdev, NULL, net_device::op, net_device::priv, tag, vlan_device::tag, vlan_device::trunk, and vlan_operations.

Referenced by efi_vlan_find(), efi_vlan_remove(), vlan_create(), vlan_netdev_rx(), vlan_netdev_rx_err(), and vlan_rx().

◆ vlan_can_be_trunk()

int vlan_can_be_trunk ( struct net_device trunk)

Check if network device can be used as a VLAN trunk device.

Parameters
trunkTrunk network device
Return values
is_okTrunk network device is usable

VLAN devices will be created as Ethernet devices. (We cannot simply clone the link layer of the trunk network device, because this link layer may expect the network device structure to contain some link-layer-private data.) The trunk network device must therefore have a link layer that is in some sense 'compatible' with Ethernet; specifically, it must have link-layer addresses that are the same length as Ethernet link-layer addresses.

As an additional check, and primarily to assist with the sanity of the FCoE code, we refuse to allow nested VLANs.

Definition at line 329 of file vlan.c.

329  {
330 
331  return ( ( trunk->ll_protocol->ll_addr_len == ETH_ALEN ) &&
332  ( trunk->op != &vlan_operations ) );
333 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:51
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:170
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
#define ETH_ALEN
Definition: if_ether.h:8
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372

References ETH_ALEN, ll_protocol::ll_addr_len, net_device::ll_protocol, net_device::op, vlan_device::trunk, and vlan_operations.

Referenced by fcoe_expired(), fcoe_reset(), vlan_create(), and vlan_probe().

◆ vlan_create()

int vlan_create ( struct net_device trunk,
unsigned int  tag,
unsigned int  priority 
)

Create VLAN device.

Parameters
trunkTrunk network device
tagVLAN tag
priorityDefault VLAN priority
Return values
rcReturn status code

Definition at line 343 of file vlan.c.

344  {
345  struct net_device *netdev;
346  struct vlan_device *vlan;
347  int rc;
348 
349  /* If VLAN already exists, just update the priority */
350  if ( ( netdev = vlan_find ( trunk, tag ) ) != NULL ) {
351  vlan = netdev->priv;
352  if ( priority != vlan->priority ) {
353  DBGC ( netdev, "VLAN %s priority changed from %d to "
354  "%d\n", netdev->name, vlan->priority, priority );
355  }
356  vlan->priority = priority;
357  return 0;
358  }
359 
360  /* Sanity checks */
361  if ( ! vlan_can_be_trunk ( trunk ) ) {
362  DBGC ( trunk, "VLAN %s cannot create VLAN on non-trunk "
363  "device\n", trunk->name );
364  rc = -ENOTTY;
365  goto err_sanity;
366  }
367  if ( ! VLAN_TAG_IS_VALID ( tag ) ) {
368  DBGC ( trunk, "VLAN %s cannot create VLAN with invalid tag "
369  "%d\n", trunk->name, tag );
370  rc = -EINVAL;
371  goto err_sanity;
372  }
373  if ( ! VLAN_PRIORITY_IS_VALID ( priority ) ) {
374  DBGC ( trunk, "VLAN %s cannot create VLAN with invalid "
375  "priority %d\n", trunk->name, priority );
376  rc = -EINVAL;
377  goto err_sanity;
378  }
379 
380  /* Allocate and initialise structure */
381  netdev = alloc_etherdev ( sizeof ( *vlan ) );
382  if ( ! netdev ) {
383  rc = -ENOMEM;
384  goto err_alloc_etherdev;
385  }
387  netdev->dev = trunk->dev;
389  vlan = netdev->priv;
390  vlan->trunk = netdev_get ( trunk );
391  vlan->tag = tag;
392  vlan->priority = priority;
393 
394  /* Construct VLAN device name */
395  snprintf ( netdev->name, sizeof ( netdev->name ), "%s-%d",
396  trunk->name, vlan->tag );
397 
398  /* Mark device as not supporting interrupts, if applicable */
399  if ( ! netdev_irq_supported ( trunk ) )
401 
402  /* Register VLAN device */
403  if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
404  DBGC ( netdev, "VLAN %s could not register: %s\n",
405  netdev->name, strerror ( rc ) );
406  goto err_register;
407  }
408 
409  /* Synchronise with trunk device */
410  vlan_sync ( netdev );
411 
412  DBGC ( netdev, "VLAN %s created with tag %d and priority %d\n",
413  netdev->name, vlan->tag, vlan->priority );
414 
415  return 0;
416 
418  err_register:
420  netdev_put ( netdev );
421  netdev_put ( trunk );
422  err_alloc_etherdev:
423  err_sanity:
424  return rc;
425 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct net_device * trunk
Trunk network device.
Definition: vlan.c:51
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:170
VLAN device private data.
Definition: vlan.c:49
#define DBGC(...)
Definition: compiler.h:505
unsigned int state
Current device state.
Definition: netdevice.h:395
#define VLAN_TAG_IS_VALID(tag)
Check VLAN tag is valid.
Definition: vlan.h:54
struct net_device * vlan_find(struct net_device *trunk, unsigned int tag)
Identify VLAN device.
Definition: vlan.c:208
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
#define VLAN_PRIORITY_IS_VALID(priority)
Check VLAN priority is valid.
Definition: vlan.h:62
void * priv
Driver private data.
Definition: netdevice.h:431
static void vlan_sync(struct net_device *netdev)
Synchronise VLAN device.
Definition: vlan.c:183
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:561
#define ETH_ALEN
Definition: if_ether.h:8
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
unsigned int tag
VLAN tag.
Definition: vlan.c:53
int vlan_can_be_trunk(struct net_device *trunk)
Check if network device can be used as a VLAN trunk device.
Definition: vlan.c:329
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
uint16_t priority
Priotity.
Definition: stp.h:12
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
unsigned int priority
Default priority.
Definition: vlan.c:55
uint64_t tag
Identity tag.
Definition: edd.h:30
#define NETDEV_IRQ_UNSUPPORTED
Network device interrupts are unsupported.
Definition: netdevice.h:452
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static int netdev_irq_supported(struct net_device *netdev)
Check whether or not network device supports interrupts.
Definition: netdevice.h:669

References alloc_etherdev(), DBGC, net_device::dev, EINVAL, ENOMEM, ENOTTY, ETH_ALEN, net_device::hw_addr, net_device::ll_addr, memcpy(), net_device::name, netdev, netdev_get(), netdev_init(), netdev_irq_supported(), NETDEV_IRQ_UNSUPPORTED, netdev_nullify(), netdev_put(), NULL, priority, vlan_device::priority, net_device::priv, rc, register_netdev(), snprintf(), net_device::state, strerror(), tag, vlan_device::tag, vlan_device::trunk, unregister_netdev(), vlan_can_be_trunk(), vlan_find(), vlan_operations, VLAN_PRIORITY_IS_VALID, vlan_sync(), and VLAN_TAG_IS_VALID.

Referenced by efi_vlan_set(), fcoe_fip_rx_vlan(), vcreate_exec(), and vlan_probe().

◆ vlan_destroy()

int vlan_destroy ( struct net_device netdev)

Destroy VLAN device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 433 of file vlan.c.

433  {
434  struct vlan_device *vlan = netdev->priv;
435  struct net_device *trunk;
436 
437  /* Sanity check */
438  if ( netdev->op != &vlan_operations ) {
439  DBGC ( netdev, "VLAN %s cannot destroy non-VLAN device\n",
440  netdev->name );
441  return -ENOTTY;
442  }
443 
444  DBGC ( netdev, "VLAN %s destroyed\n", netdev->name );
445 
446  /* Remove VLAN device */
448  trunk = vlan->trunk;
450  netdev_put ( netdev );
451  netdev_put ( trunk );
452 
453  return 0;
454 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:51
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:170
VLAN device private data.
Definition: vlan.c:49
#define DBGC(...)
Definition: compiler.h:505
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594

References DBGC, ENOTTY, net_device::name, netdev, netdev_nullify(), netdev_put(), net_device::op, net_device::priv, vlan_device::trunk, unregister_netdev(), and vlan_operations.

Referenced by efi_vlan_remove(), vdestroy_exec(), and vlan_remove_first().

◆ vlan_auto()

void vlan_auto ( const void *  ll_addr,
unsigned int  tag 
)

Configure automatic VLAN device.

Parameters
ll_addrLink-layer address
tagVLAN tag

Definition at line 462 of file vlan.c.

462  {
463 
464  /* Record link-layer address and VLAN tag */
466  vlan_auto_tag = tag;
467 }
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static uint8_t vlan_auto_ll_addr[ETH_ALEN]
Automatic VLAN device link-layer address.
Definition: vlan.c:59
#define ETH_ALEN
Definition: if_ether.h:8
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
uint64_t tag
Identity tag.
Definition: edd.h:30
static unsigned int vlan_auto_tag
Automatic VLAN tag.
Definition: vlan.c:62

References ETH_ALEN, net_device::ll_addr, memcpy(), tag, vlan_auto_ll_addr, and vlan_auto_tag.

Referenced by efi_set_autoboot_ll_addr().

◆ vlan_netdev_rx()

void vlan_netdev_rx ( struct net_device netdev,
unsigned int  tag,
struct io_buffer iobuf 
)

Add VLAN tag-stripped packet to queue (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer

Add VLAN tag-stripped packet to queue (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer

Definition at line 1209 of file netdevice.c.

1210  {
1211 
1212  if ( tag == 0 ) {
1213  netdev_rx ( netdev, iobuf );
1214  } else {
1215  netdev_rx_err ( netdev, iobuf, -ENODEV );
1216  }
1217 }
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
static struct net_device * netdev
Definition: gdbudp.c:52
#define ENODEV
No such device.
Definition: errno.h:509
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
uint64_t tag
Identity tag.
Definition: edd.h:30

References ENODEV, netdev, netdev_rx(), netdev_rx_err(), NULL, tag, and vlan_find().

Referenced by hermon_eth_complete_recv(), and intelxl_poll_rx().

◆ vlan_netdev_rx_err()

void vlan_netdev_rx_err ( struct net_device netdev,
unsigned int tag  ,
struct io_buffer iobuf,
int  rc 
)

Discard received VLAN tag-stripped packet (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer, or NULL
rcPacket status code

Discard received VLAN tag-stripped packet (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer, or NULL
rcPacket status code

Definition at line 1227 of file netdevice.c.

1229  {
1230 
1231  netdev_rx_err ( netdev, iobuf, rc );
1232 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
static struct net_device * netdev
Definition: gdbudp.c:52

References netdev, netdev_rx_err(), NULL, rc, tag, and vlan_find().

Referenced by hermon_eth_complete_recv(), and intelxl_poll_rx().