root/netinet/if_ether.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: if_ether.h,v 1.39 2007/05/16 09:24:07 dlg Exp $       */
    2 /*      $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $    */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)if_ether.h  8.1 (Berkeley) 6/10/93
   33  */
   34 
   35 #ifndef _NETINET_IF_ETHER_H_
   36 #define _NETINET_IF_ETHER_H_
   37 
   38 /*
   39  * Some basic Ethernet constants.
   40  */
   41 #define ETHER_ADDR_LEN  6       /* Ethernet address length              */
   42 #define ETHER_TYPE_LEN  2       /* Ethernet type field length           */
   43 #define ETHER_CRC_LEN   4       /* Ethernet CRC length                  */
   44 #define ETHER_HDR_LEN   ((ETHER_ADDR_LEN * 2) + ETHER_TYPE_LEN)
   45 #define ETHER_MIN_LEN   64      /* Minimum frame length, CRC included   */
   46 #define ETHER_MAX_LEN   1518    /* Maximum frame length, CRC included   */
   47 #define ETHER_MAX_DIX_LEN       1536    /* Maximum DIX frame length     */
   48 
   49 /*
   50  * Some Ethernet extensions.
   51  */
   52 #define ETHER_VLAN_ENCAP_LEN    4       /* len of 802.1Q VLAN encapsulation */
   53 
   54 /*
   55  * Mbuf adjust factor to force 32-bit alignment of IP header.
   56  * Drivers should do m_adj(m, ETHER_ALIGN) when setting up a
   57  * receive so the upper layers get the IP header properly aligned
   58  * past the 14-byte Ethernet header.
   59  */
   60 #define ETHER_ALIGN     2       /* driver adjust for IP hdr alignment */
   61 
   62 /*
   63  * Ethernet address - 6 octets
   64  */
   65 struct ether_addr {
   66         u_int8_t ether_addr_octet[ETHER_ADDR_LEN];
   67 };
   68 
   69 /*
   70  * The length of the combined header.
   71  */
   72 struct  ether_header {
   73         u_int8_t  ether_dhost[ETHER_ADDR_LEN];
   74         u_int8_t  ether_shost[ETHER_ADDR_LEN];
   75         u_int16_t ether_type;
   76 };
   77 
   78 #include <net/ethertypes.h>
   79 
   80 #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
   81 
   82 #define ETHERMTU        (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   83 #define ETHERMIN        (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
   84 
   85 /*
   86  * Ethernet CRC32 polynomials (big- and little-endian verions).
   87  */
   88 #define ETHER_CRC_POLY_LE       0xedb88320
   89 #define ETHER_CRC_POLY_BE       0x04c11db6
   90 
   91 /*
   92  * Ethernet-specific mbuf flags.
   93  */
   94 #define M_HASFCS        M_LINK0 /* FCS included at end of frame */
   95 
   96 #ifdef _KERNEL
   97 /*
   98  * Macro to map an IP multicast address to an Ethernet multicast address.
   99  * The high-order 25 bits of the Ethernet address are statically assigned,
  100  * and the low-order 23 bits are taken from the low end of the IP address.
  101  */
  102 #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                          \
  103         /* struct in_addr *ipaddr; */                                   \
  104         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  105 {                                                                       \
  106         (enaddr)[0] = 0x01;                                             \
  107         (enaddr)[1] = 0x00;                                             \
  108         (enaddr)[2] = 0x5e;                                             \
  109         (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f;                   \
  110         (enaddr)[4] = ((u_int8_t *)ipaddr)[2];                          \
  111         (enaddr)[5] = ((u_int8_t *)ipaddr)[3];                          \
  112 }
  113 
  114 /*
  115  * Macro to map an IPv6 multicast address to an Ethernet multicast address.
  116  * The high-order 16 bits of the Ethernet address are statically assigned,
  117  * and the low-order 32 bits are taken from the low end of the IPv6 address.
  118  */
  119 #define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr)                       \
  120         /* struct in6_addr *ip6addr; */                                 \
  121         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
  122 {                                                                       \
  123         (enaddr)[0] = 0x33;                                             \
  124         (enaddr)[1] = 0x33;                                             \
  125         (enaddr)[2] = ((u_int8_t *)ip6addr)[12];                        \
  126         (enaddr)[3] = ((u_int8_t *)ip6addr)[13];                        \
  127         (enaddr)[4] = ((u_int8_t *)ip6addr)[14];                        \
  128         (enaddr)[5] = ((u_int8_t *)ip6addr)[15];                        \
  129 }
  130 #endif
  131 
  132 /*
  133  * Ethernet Address Resolution Protocol.
  134  *
  135  * See RFC 826 for protocol description.  Structure below is adapted
  136  * to resolving internet addresses.  Field names used correspond to
  137  * RFC 826.
  138  */
  139 struct  ether_arp {
  140         struct   arphdr ea_hdr;                 /* fixed-size header */
  141         u_int8_t arp_sha[ETHER_ADDR_LEN];       /* sender hardware address */
  142         u_int8_t arp_spa[4];                    /* sender protocol address */
  143         u_int8_t arp_tha[ETHER_ADDR_LEN];       /* target hardware address */
  144         u_int8_t arp_tpa[4];                    /* target protocol address */
  145 };
  146 #define arp_hrd ea_hdr.ar_hrd
  147 #define arp_pro ea_hdr.ar_pro
  148 #define arp_hln ea_hdr.ar_hln
  149 #define arp_pln ea_hdr.ar_pln
  150 #define arp_op  ea_hdr.ar_op
  151 
  152 /*
  153  * Structure shared between the ethernet driver modules and
  154  * the address resolution code.  For example, each ec_softc or il_softc
  155  * begins with this structure.
  156  */
  157 struct  arpcom {
  158         struct   ifnet ac_if;                   /* network-visible interface */
  159         u_int8_t ac_enaddr[ETHER_ADDR_LEN];     /* ethernet hardware address */
  160         char     ac__pad[2];                    /* pad for some machines */
  161         LIST_HEAD(, ether_multi) ac_multiaddrs; /* list of multicast addrs */
  162         int      ac_multicnt;                   /* length of ac_multiaddrs */
  163         int      ac_multirangecnt;              /* number of mcast ranges */
  164 
  165 };
  166 
  167 struct llinfo_arp {
  168         LIST_ENTRY(llinfo_arp) la_list;
  169         struct  rtentry *la_rt;
  170         struct  mbuf *la_hold;          /* last packet until resolved/timeout */
  171         long    la_asked;               /* last time we QUERIED for this addr */
  172 #define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */
  173 };
  174 
  175 struct sockaddr_inarp {
  176         u_int8_t  sin_len;
  177         u_int8_t  sin_family;
  178         u_int16_t sin_port;
  179         struct    in_addr sin_addr;
  180         struct    in_addr sin_srcaddr;
  181         u_int16_t sin_tos;
  182         u_int16_t sin_other;
  183 #define SIN_PROXY 1
  184 };
  185 
  186 /*
  187  * IP and ethernet specific routing flags
  188  */
  189 #define RTF_USETRAILERS   RTF_PROTO1    /* use trailers */
  190 #define RTF_ANNOUNCE      RTF_PROTO2    /* announce new arp entry */
  191 #define RTF_PERMANENT_ARP RTF_PROTO3    /* only manual overwrite of entry */
  192 
  193 #ifdef  _KERNEL
  194 extern u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN];
  195 extern u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
  196 extern u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
  197 extern struct ifqueue arpintrq;
  198 
  199 void    arpwhohas(struct arpcom *, struct in_addr *);
  200 void    arpintr(void);
  201 int     arpresolve(struct arpcom *,
  202             struct rtentry *, struct mbuf *, struct sockaddr *, u_char *);
  203 void    arp_ifinit(struct arpcom *, struct ifaddr *);
  204 void    arp_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
  205 
  206 int     ether_addmulti(struct ifreq *, struct arpcom *);
  207 int     ether_delmulti(struct ifreq *, struct arpcom *);
  208 int     ether_multiaddr(struct sockaddr *, u_int8_t[], u_int8_t[]);
  209 #endif /* _KERNEL */
  210 
  211 /*
  212  * Ethernet multicast address structure.  There is one of these for each
  213  * multicast address or range of multicast addresses that we are supposed
  214  * to listen to on a particular interface.  They are kept in a linked list,
  215  * rooted in the interface's arpcom structure.  (This really has nothing to
  216  * do with ARP, or with the Internet address family, but this appears to be
  217  * the minimally-disrupting place to put it.)
  218  */
  219 struct ether_multi {
  220         u_int8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
  221         u_int8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
  222         struct   arpcom *enm_ac;        /* back pointer to arpcom */
  223         u_int    enm_refcount;          /* no. claims to this addr/range */
  224         LIST_ENTRY(ether_multi) enm_list;
  225 };
  226 
  227 /*
  228  * Structure used by macros below to remember position when stepping through
  229  * all of the ether_multi records.
  230  */
  231 struct ether_multistep {
  232         struct ether_multi  *e_enm;
  233 };
  234 
  235 /*
  236  * Macro for looking up the ether_multi record for a given range of Ethernet
  237  * multicast addresses connected to a given arpcom structure.  If no matching
  238  * record is found, "enm" returns NULL.
  239  */
  240 #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm)                     \
  241         /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                          \
  242         /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                          \
  243         /* struct arpcom *ac; */                                        \
  244         /* struct ether_multi *enm; */                                  \
  245 {                                                                       \
  246         for ((enm) = LIST_FIRST(&(ac)->ac_multiaddrs);                  \
  247             (enm) != LIST_END(&(ac)->ac_multiaddrs) &&                  \
  248             (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||  \
  249              bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);   \
  250                 (enm) = LIST_NEXT((enm), enm_list));                    \
  251 }
  252 
  253 /*
  254  * Macro to step through all of the ether_multi records, one at a time.
  255  * The current position is remembered in "step", which the caller must
  256  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  257  * and get the first record.  Both macros return a NULL "enm" when there
  258  * are no remaining records.
  259  */
  260 #define ETHER_NEXT_MULTI(step, enm) \
  261         /* struct ether_multistep step; */  \
  262         /* struct ether_multi *enm; */  \
  263 { \
  264         if (((enm) = (step).e_enm) != NULL) \
  265                 (step).e_enm = LIST_NEXT((enm), enm_list); \
  266 }
  267 
  268 #define ETHER_FIRST_MULTI(step, ac, enm) \
  269         /* struct ether_multistep step; */ \
  270         /* struct arpcom *ac; */ \
  271         /* struct ether_multi *enm; */ \
  272 { \
  273         (step).e_enm = LIST_FIRST(&(ac)->ac_multiaddrs); \
  274         ETHER_NEXT_MULTI((step), (enm)); \
  275 }
  276 
  277 #ifdef _KERNEL
  278 
  279 extern struct ifnet *myip_ifp;
  280 
  281 int arpioctl(u_long, caddr_t);
  282 void arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *);
  283 void revarpinput(struct mbuf *);
  284 void in_revarpinput(struct mbuf *);
  285 void revarprequest(struct ifnet *);
  286 int revarpwhoarewe(struct ifnet *, struct in_addr *, struct in_addr *);
  287 int revarpwhoami(struct in_addr *, struct ifnet *);
  288 int db_show_arptab(void);
  289 
  290 u_int32_t ether_crc32_le(const u_int8_t *, size_t);
  291 u_int32_t ether_crc32_be(const u_int8_t *, size_t);
  292 
  293 #else
  294 
  295 __BEGIN_DECLS
  296 char *ether_ntoa(struct ether_addr *);
  297 struct ether_addr *ether_aton(const char *);
  298 int ether_ntohost(char *, struct ether_addr *);
  299 int ether_hostton(const char *, struct ether_addr *);
  300 int ether_line(const char *, struct ether_addr *, char *);
  301 __END_DECLS
  302 
  303 #endif /* _KERNEL */
  304 #endif /* _NETINET_IF_ETHER_H_ */

/* [<][>][^][v][top][bottom][index][help] */