ETHERSUBR(9) | Kernel Developer's Manual | ETHERSUBR(9)

# NAME

`ethersubr`, `ether_ifattach`, `ether_addmulti`, `ether_delmulti`, `ETHER_FIRST_MULTI`, `ETHER_NEXT_MULTI`, `ETHER_IS_MULTICAST` — Ethernet driver support functions and macros

# SYNOPSIS

`#include <net/if_ether.h>`

void
`ether_ifattach`(struct ifnet *ifp, uint8_t *lla);

int
`ether_addmulti`(const struct sockaddr *sa, struct ethercom *ec);

int
`ether_delmulti`(const struct sockaddr *sa, struct ethercom *ec);

void
`ETHER_FIRST_MULTI`(struct ether_multistep step, struct ethercom *ec, struct ether_multi *enm);

void
`ETHER_NEXT_MULTI`(struct ether_multistep step, struct ether_multi *enm);

int
`ETHER_IS_MULTICAST`(uint8_t *addr);

# DESCRIPTION

The `ethersubr` functions provide the interface between the `ethersubr` module and the network drivers which need Ethernet support. Such drivers must request the ether attribute in their files declaration and call the appropriate functions as specified below.

Note that you also need the arp(9) stuff to support IPv4 on your hardware.

`ether_ifattach`(ifp, lla)
  Perform the device-independent, but Ethernet-specific initialization of the interface pointed to by ifp.

  Among other duties, this function creates a record for the link level address in the interface's address list and records the link level address pointed to by lla there. Drivers can initialize the link level address by themselves by calling the function with lla as `NULL` and calling `if_set_sadl`().

  This function must be called from the driver's attach function.

`ether_addmulti`(sa, ec)
`ether_delmulti`(sa, ec)
  Add (`ether_addmulti`()) or delete (`ether_delmulti`()) the address described by the sa pointer to the Ethernet multicast list belonging to ec.

  These functions must be called from the driver's ioctl function to handle `SIOCADDMULTI` and `SIOCDELMULTI` requests. If these return `ENETRESET`, the hardware multicast filter must be reinitialized.

  These functions accept `AF_UNSPEC` addresses, which are interpreted as Ethernet addresses, or `AF_INET` addresses. In the latter case, `INADDR_ANY` is mapped to a range describing all the Ethernet address space reserved for IPv4 multicast addresses.

  The `ether_addmulti`() returns `EAFNOSUPPORT` if an unsupported address family is specified, `EINVAL` if a non-multicast address is specified, or `ENETRESET` if the multicast list really changed and the driver should synchronize its hardware filter with it.

  The `ether_delmulti`() returns, in addition to the above errors, `ENXIO` if the specified address can't be found in the list of multicast addresses.

`ETHER_NEXT_MULTI`(step, enm)
  A macro to step through all of the ether_multi records, one at a time. The current position is remembered in step, which the caller must provide.
`ETHER_FIRST_MULTI`(step, ec, enm)
  A macro that must be called to initialize step and get the first record. Both macros return a `NULL` enm when there are no remaining records.
`ETHER_IS_MULTICAST`(addr)
  A macro that returns 1, if addr points to an Ethernet/FDDI multicast (or broadcast) address.

# CODE REFERENCES

Ethernet support functions are declared in `<net/if_ether.h>` and defined (if not implemented as macro) in sys/net/if_ethersubr.c.

# SEE ALSO

arp(9)

# HISTORY

Rewritten to attach to the new ARP system in NetBSD 1.3.

# AUTHORS

UCB CSRG (original implementation)

Ignatios Souvatzis (support for new ARP system)

January 19, 2020 | NetBSD 11.0