[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     ! 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