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)
 
 FILE_SECBOOT (PERMITTED)
 
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 30 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 38 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 47 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 55 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 63 of file vlan.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ 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 302 of file vlan.c.

302  {
303  struct vlan_device *vlan;
304 
305  if ( netdev->op == &vlan_operations ) {
306  vlan = netdev->priv;
307  return ( VLAN_TCI ( vlan->tag, vlan->priority ) );
308  } else {
309  return 0;
310  }
311 }
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:171
#define VLAN_TCI(tag, priority)
Construct VLAN tag control information.
Definition: vlan.h:47
VLAN device private data.
Definition: vlan.c:50
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:370
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int tag
VLAN tag.
Definition: vlan.c:54
unsigned int priority
Default priority.
Definition: vlan.c:56

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 74 of file vlan.h.

74  {
75  return VLAN_TAG ( vlan_tci ( netdev ) );
76 }
#define VLAN_TAG(tci)
Extract VLAN tag from tag control information.
Definition: vlan.h:30
unsigned int vlan_tci(struct net_device *netdev)
Get the VLAN tag control information.
Definition: vlan.c:302
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(), efi_path_net_probe(), 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 209 of file vlan.c.

209  {
210  struct net_device *netdev;
211  struct vlan_device *vlan;
212 
213  for_each_netdev ( netdev ) {
214  if ( netdev->op != &vlan_operations )
215  continue;
216  vlan = netdev->priv;
217  if ( ( vlan->trunk == trunk ) && ( vlan->tag == tag ) )
218  return netdev;
219  }
220  return NULL;
221 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:52
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:171
VLAN device private data.
Definition: vlan.c:50
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:370
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:547
A network device.
Definition: netdevice.h:353
unsigned int tag
VLAN tag.
Definition: vlan.c:54
uint64_t tag
Identity tag.
Definition: edd.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

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 330 of file vlan.c.

330  {
331 
332  return ( ( trunk->ll_protocol->ll_addr_len == ETH_ALEN ) &&
333  ( trunk->op != &vlan_operations ) );
334 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:52
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:199
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:171
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:370
#define ETH_ALEN
Definition: if_ether.h:9
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:373

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 344 of file vlan.c.

345  {
346  struct net_device *netdev;
347  struct vlan_device *vlan;
348  int rc;
349 
350  /* If VLAN already exists, just update the priority */
351  if ( ( netdev = vlan_find ( trunk, tag ) ) != NULL ) {
352  vlan = netdev->priv;
353  if ( priority != vlan->priority ) {
354  DBGC ( netdev, "VLAN %s priority changed from %d to "
355  "%d\n", netdev->name, vlan->priority, priority );
356  }
357  vlan->priority = priority;
358  return 0;
359  }
360 
361  /* Sanity checks */
362  if ( ! vlan_can_be_trunk ( trunk ) ) {
363  DBGC ( trunk, "VLAN %s cannot create VLAN on non-trunk "
364  "device\n", trunk->name );
365  rc = -ENOTTY;
366  goto err_sanity;
367  }
368  if ( ! VLAN_TAG_IS_VALID ( tag ) ) {
369  DBGC ( trunk, "VLAN %s cannot create VLAN with invalid tag "
370  "%d\n", trunk->name, tag );
371  rc = -EINVAL;
372  goto err_sanity;
373  }
374  if ( ! VLAN_PRIORITY_IS_VALID ( priority ) ) {
375  DBGC ( trunk, "VLAN %s cannot create VLAN with invalid "
376  "priority %d\n", trunk->name, priority );
377  rc = -EINVAL;
378  goto err_sanity;
379  }
380 
381  /* Allocate and initialise structure */
382  netdev = alloc_etherdev ( sizeof ( *vlan ) );
383  if ( ! netdev ) {
384  rc = -ENOMEM;
385  goto err_alloc_etherdev;
386  }
388  netdev->dev = trunk->dev;
390  vlan = netdev->priv;
391  vlan->trunk = netdev_get ( trunk );
392  vlan->tag = tag;
393  vlan->priority = priority;
394 
395  /* Construct VLAN device name */
396  snprintf ( netdev->name, sizeof ( netdev->name ), "%s-%d",
397  trunk->name, vlan->tag );
398 
399  /* Mark device as not supporting interrupts, if applicable */
400  if ( ! netdev_irq_supported ( trunk ) )
402 
403  /* Register VLAN device */
404  if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
405  DBGC ( netdev, "VLAN %s could not register: %s\n",
406  netdev->name, strerror ( rc ) );
407  goto err_register;
408  }
409 
410  /* Synchronise with trunk device */
411  vlan_sync ( netdev );
412 
413  DBGC ( netdev, "VLAN %s created with tag %d and priority %d\n",
414  netdev->name, vlan->tag, vlan->priority );
415 
416  return 0;
417 
419  err_register:
421  netdev_put ( netdev );
422  netdev_put ( trunk );
423  err_alloc_etherdev:
424  err_sanity:
425  return rc;
426 }
#define EINVAL
Invalid argument.
Definition: errno.h:429
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct net_device * trunk
Trunk network device.
Definition: vlan.c:52
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:171
VLAN device private data.
Definition: vlan.c:50
#define DBGC(...)
Definition: compiler.h:505
unsigned int state
Current device state.
Definition: netdevice.h:396
#define VLAN_TAG_IS_VALID(tag)
Check VLAN tag is valid.
Definition: vlan.h:55
struct net_device * vlan_find(struct net_device *trunk, unsigned int tag)
Identify VLAN device.
Definition: vlan.c:209
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:519
#define ENOMEM
Not enough space.
Definition: errno.h:535
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:576
#define VLAN_PRIORITY_IS_VALID(priority)
Check VLAN priority is valid.
Definition: vlan.h:63
void * priv
Driver private data.
Definition: netdevice.h:432
static void vlan_sync(struct net_device *netdev)
Synchronise VLAN device.
Definition: vlan.c:184
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:760
A network device.
Definition: netdevice.h:353
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:565
#define ETH_ALEN
Definition: if_ether.h:9
struct device * dev
Underlying hardware device.
Definition: netdevice.h:365
unsigned int tag
VLAN tag.
Definition: vlan.c:54
int vlan_can_be_trunk(struct net_device *trunk)
Check if network device can be used as a VLAN trunk device.
Definition: vlan.c:330
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:363
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
uint16_t priority
Priotity.
Definition: stp.h:13
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:265
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:383
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:388
unsigned int priority
Default priority.
Definition: vlan.c:56
uint64_t tag
Identity tag.
Definition: edd.h:31
#define NETDEV_IRQ_UNSUPPORTED
Network device interrupts are unsupported.
Definition: netdevice.h:453
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:382
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
static int netdev_irq_supported(struct net_device *netdev)
Check whether or not network device supports interrupts.
Definition: netdevice.h:673

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 434 of file vlan.c.

434  {
435  struct vlan_device *vlan = netdev->priv;
436  struct net_device *trunk;
437 
438  /* Sanity check */
439  if ( netdev->op != &vlan_operations ) {
440  DBGC ( netdev, "VLAN %s cannot destroy non-VLAN device\n",
441  netdev->name );
442  return -ENOTTY;
443  }
444 
445  DBGC ( netdev, "VLAN %s destroyed\n", netdev->name );
446 
447  /* Remove VLAN device */
449  trunk = vlan->trunk;
451  netdev_put ( netdev );
452  netdev_put ( trunk );
453 
454  return 0;
455 }
struct net_device * trunk
Trunk network device.
Definition: vlan.c:52
static struct net_device_operations vlan_operations
VLAN device operations.
Definition: vlan.c:171
VLAN device private data.
Definition: vlan.c:50
#define DBGC(...)
Definition: compiler.h:505
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:370
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
A network device.
Definition: netdevice.h:353
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:363
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595

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 463 of file vlan.c.

463  {
464 
465  /* Record link-layer address and VLAN tag */
467  vlan_auto_tag = tag;
468 }
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:60
#define ETH_ALEN
Definition: if_ether.h:9
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:388
uint64_t tag
Identity tag.
Definition: edd.h:31
static unsigned int vlan_auto_tag
Automatic VLAN tag.
Definition: vlan.c:63

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 1210 of file netdevice.c.

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

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 1228 of file netdevice.c.

1230  {
1231 
1232  netdev_rx_err ( netdev, iobuf, rc );
1233 }
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:587
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().