iPXE
Functions | Variables
ethernet.h File Reference

Ethernet protocol. More...

#include <stdint.h>
#include <ipxe/netdevice.h>
#include <ipxe/iobuf.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static int is_zero_ether_addr (const void *addr)
 Check if Ethernet address is all zeroes.
static int is_multicast_ether_addr (const void *addr)
 Check if Ethernet address is a multicast address.
static int is_local_ether_addr (const void *addr)
 Check if Ethernet address is locally assigned.
static int is_broadcast_ether_addr (const void *addr)
 Check if Ethernet address is the broadcast address.
static int is_valid_ether_addr (const void *addr)
 Check if Ethernet address is valid.
int eth_push (struct net_device *netdev, struct io_buffer *iobuf, const void *ll_dest, const void *ll_source, uint16_t net_proto)
int eth_pull (struct net_device *netdev, struct io_buffer *iobuf, const void **ll_dest, const void **ll_source, uint16_t *net_proto, unsigned int *flags)
void eth_init_addr (const void *hw_addr, void *ll_addr)
 Initialise Ethernet address.
void eth_random_addr (void *hw_addr)
 Generate random Ethernet address.
const char * eth_ntoa (const void *ll_addr)
 Transcribe Ethernet address.
int eth_mc_hash (unsigned int af, const void *net_addr, void *ll_addr)
 Hash multicast address.
int eth_eth_addr (const void *ll_addr, void *eth_addr)
 Generate Ethernet-compatible compressed link-layer address.
int eth_eui64 (const void *ll_addr, void *eui64)
 Generate EUI-64 address.
struct net_devicealloc_etherdev (size_t priv_size)
 Allocate Ethernet device.

Variables

uint8_t eth_broadcast []
 Ethernet broadcast MAC address.
struct ll_protocol
ethernet_protocol 
__ll_protocol
 Ethernet protocol.

Detailed Description

Ethernet protocol.

Definition in file ethernet.h.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static int is_zero_ether_addr ( const void *  addr) [inline, static]

Check if Ethernet address is all zeroes.

Parameters:
addrEthernet address
Return values:
is_zeroAddress is all zeroes

Definition at line 22 of file ethernet.h.

References addr.

Referenced by is_valid_ether_addr().

                                                          {
        const uint8_t *addr_bytes = addr;

        return ( ! ( addr_bytes[0] | addr_bytes[1] | addr_bytes[2] |
                     addr_bytes[3] | addr_bytes[4] | addr_bytes[5] ) );
}
static int is_multicast_ether_addr ( const void *  addr) [inline, static]

Check if Ethernet address is a multicast address.

Parameters:
addrEthernet address
Return values:
is_mcastAddress is a multicast address

Note that the broadcast address is also a multicast address.

Definition at line 37 of file ethernet.h.

References addr.

Referenced by eoib_tx_av(), eth_pull(), ipoib_find_remac(), ipoib_transmit(), is_valid_ether_addr(), and net80211_ll_pull().

                                                               {
        const uint8_t *addr_bytes = addr;

        return ( addr_bytes[0] & 0x01 );
}
static int is_local_ether_addr ( const void *  addr) [inline, static]

Check if Ethernet address is locally assigned.

Parameters:
addrEthernet address
Return values:
is_localAddress is locally assigned

Definition at line 49 of file ethernet.h.

References addr.

                                                           {
        const uint8_t *addr_bytes = addr;

        return ( addr_bytes[0] & 0x02 );
}
static int is_broadcast_ether_addr ( const void *  addr) [inline, static]

Check if Ethernet address is the broadcast address.

Parameters:
addrEthernet address
Return values:
is_bcastAddress is the broadcast address

Definition at line 61 of file ethernet.h.

References addr.

Referenced by eth_pull(), and net80211_ll_pull().

                                                               {
        const uint8_t *addr_bytes = addr;

        return ( ( addr_bytes[0] & addr_bytes[1] & addr_bytes[2] &
                   addr_bytes[3] & addr_bytes[4] & addr_bytes[5] ) == 0xff );
}
static int is_valid_ether_addr ( const void *  addr) [inline, static]

Check if Ethernet address is valid.

Parameters:
addrEthernet address
Return values:
is_validAddress is valid

Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not a multicast address, and is not ff:ff:ff:ff:ff:ff.

Definition at line 77 of file ethernet.h.

References is_multicast_ether_addr(), and is_zero_ether_addr().

Referenced by __vxge_hw_vpath_addr_get(), igbvf_probe(), igbvf_reset(), intel_fetch_mac(), intelx_try_fetch_mac(), intelxl_fetch_mac(), nv_setup_mac_addr(), pcnet32_setup_mac_addr(), smscusb_eeprom_fetch_mac(), smscusb_otp_fetch_mac(), tg3_get_device_address(), and virtnet_probe_modern().

                                                           {
        return ( ( ! is_multicast_ether_addr ( addr ) ) &&
                 ( ! is_zero_ether_addr ( addr ) ) );
}
int eth_push ( struct net_device netdev,
struct io_buffer iobuf,
const void *  ll_dest,
const void *  ll_source,
uint16_t  net_proto 
)
int eth_pull ( struct net_device netdev,
struct io_buffer iobuf,
const void **  ll_dest,
const void **  ll_source,
uint16_t net_proto,
unsigned int *  flags 
)
void eth_init_addr ( const void *  hw_addr,
void *  ll_addr 
)

Initialise Ethernet address.

Parameters:
hw_addrHardware address
ll_addrLink-layer address

Definition at line 150 of file ethernet.c.

References ETH_ALEN, and memcpy().

void eth_random_addr ( void *  hw_addr)

Generate random Ethernet address.

Parameters:
hw_addrGenerated hardware address

Definition at line 159 of file ethernet.c.

References addr, ETH_ALEN, and random().

Referenced by igbvf_probe(), intelvf_mbox_reset(), lan78xx_fetch_mac(), smsc95xx_fetch_mac(), and txnic_bgx_mac().

                                       {
        uint8_t *addr = hw_addr;
        unsigned int i;

        for ( i = 0 ; i < ETH_ALEN ; i++ )
                addr[i] = random();
        addr[0] &= ~0x01; /* Clear multicast bit */
        addr[0] |= 0x02; /* Set locally-assigned bit */
}
const char* eth_ntoa ( const void *  ll_addr)

Transcribe Ethernet address.

Parameters:
ll_addrLink-layer address
Return values:
stringLink-layer address in human-readable format

Definition at line 175 of file ethernet.c.

References sprintf.

Referenced by amd8111e_get_mac_address(), b44_probe(), bnx2_probe(), bofm_en(), bofm_test(), corkscrew_probe1(), cs89x0_probe(), davicom_probe(), dmfe_probe(), eepro_probe(), ena_get_device_attributes(), eoib_create(), eoib_rx_av(), eoib_tx_av(), epic100_probe(), eth_probe(), eth_slow_lacp_dump(), eth_slow_marker_dump(), exanic_probe(), fcoe_expired(), fcoe_fip_rx(), fcoe_fip_rx_advertisement(), fcoe_fip_rx_els_response(), fcoe_fip_rx_vlan(), fcoe_rx(), hermon_bofm_harvest(), hermon_bofm_update(), ibft_fill_nic(), intel_fetch_mac(), intel_fetch_mac_eeprom(), intelvf_mbox_reset(), intelx_try_fetch_mac(), intelxl_fetch_mac(), ipoib_find_remac(), ipoib_translate_tx_arp(), ipoib_transmit(), iwlist(), lan78xx_fetch_mac(), ne_probe(), net80211_probe_step(), net80211_step_associate(), nv_setup_mac_addr(), pcnet32_probe(), phantom_add_macaddr(), phantom_del_macaddr(), phantom_get_macaddr(), prism2_probe(), smc9000_probe(), smsc95xx_fetch_mac(), smsc95xx_vm3_fetch_mac(), smscusb_eeprom_fetch_mac(), smscusb_otp_fetch_mac(), stp_rx(), t595_probe(), t5x9_probe(), tlan_probe(), tulip_probe(), txnic_lmac_probe(), undinet_probe(), virtnet_probe_legacy(), virtnet_probe_modern(), vxge_probe(), w89c840_probe(), wpa_derive_ptk(), xsmp_rx_xve_install(), and xve_create().

                                              {
        static char buf[18]; /* "00:00:00:00:00:00" */
        const uint8_t *eth_addr = ll_addr;

        sprintf ( buf, "%02x:%02x:%02x:%02x:%02x:%02x",
                  eth_addr[0], eth_addr[1], eth_addr[2],
                  eth_addr[3], eth_addr[4], eth_addr[5] );
        return buf;
}
int eth_mc_hash ( unsigned int  af,
const void *  net_addr,
void *  ll_addr 
)

Hash multicast address.

Parameters:
afAddress family
net_addrNetwork-layer address
ll_addrLink-layer address to fill in
Return values:
rcReturn status code

Definition at line 193 of file ethernet.c.

References AF_INET, AF_INET6, ENOTSUP, and memcpy().

                                                                         {
        const uint8_t *net_addr_bytes = net_addr;
        uint8_t *ll_addr_bytes = ll_addr;

        switch ( af ) {
        case AF_INET:
                ll_addr_bytes[0] = 0x01;
                ll_addr_bytes[1] = 0x00;
                ll_addr_bytes[2] = 0x5e;
                ll_addr_bytes[3] = net_addr_bytes[1] & 0x7f;
                ll_addr_bytes[4] = net_addr_bytes[2];
                ll_addr_bytes[5] = net_addr_bytes[3];
                return 0;
        case AF_INET6:
                ll_addr_bytes[0] = 0x33;
                ll_addr_bytes[1] = 0x33;
                memcpy ( &ll_addr_bytes[2], &net_addr_bytes[12], 4 );
                return 0;
        default:
                return -ENOTSUP;
        }
}
int eth_eth_addr ( const void *  ll_addr,
void *  eth_addr 
)

Generate Ethernet-compatible compressed link-layer address.

Parameters:
ll_addrLink-layer address
eth_addrEthernet-compatible address to fill in

Definition at line 222 of file ethernet.c.

References ETH_ALEN, and memcpy().

                                                         {
        memcpy ( eth_addr, ll_addr, ETH_ALEN );
        return 0;
}
int eth_eui64 ( const void *  ll_addr,
void *  eui64 
)

Generate EUI-64 address.

Parameters:
ll_addrLink-layer address
eui64EUI-64 address to fill in
Return values:
rcReturn status code

Definition at line 234 of file ethernet.c.

References htons, and memcpy().

                                                   {

        memcpy ( ( eui64 + 0 ), ( ll_addr + 0 ), 3 );
        memcpy ( ( eui64 + 5 ), ( ll_addr + 3 ), 3 );
        *( ( uint16_t * ) ( eui64 + 3 ) ) = htons ( 0xfffe );
        return 0;
}
struct net_device* alloc_etherdev ( size_t  priv_size) [read]

Variable Documentation

Ethernet broadcast MAC address.

Definition at line 47 of file ethernet.c.

Referenced by alloc_etherdev(), alloc_ipoibdev(), ath9k_init_misc(), ipoib_complete_recv(), net80211_alloc(), and net80211_probe_step().

struct ll_protocol ethernet_protocol __ll_protocol

Ethernet protocol.

Definition at line 243 of file ethernet.c.