[BACK]Return to if_ether.h CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/if_ether.h, Revision 1.1.1.1

1.1       nbrk        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_ */

CVSweb