]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libstand/if_ether.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libstand / if_ether.h
1 /*      $NetBSD: if_ether.h,v 1.25 1997/01/17 17:06:06 mikel Exp $      */
2
3 /*
4  * Copyright (c) 1982, 1986, 1993
5  *      The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 4. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *      @(#)if_ether.h  8.1 (Berkeley) 6/10/93
32  *
33  * $FreeBSD$
34  */
35
36 /*
37  * Ethernet address - 6 octets
38  * this is only used by the ethers(3) functions.
39  */
40 struct ether_addr {
41         u_int8_t ether_addr_octet[6];
42 };
43
44 /*
45  * Structure of a 10Mb/s Ethernet header.
46  */
47 #define ETHER_ADDR_LEN  6
48
49 struct  ether_header {
50         u_int8_t  ether_dhost[ETHER_ADDR_LEN];
51         u_int8_t  ether_shost[ETHER_ADDR_LEN];
52         u_int16_t ether_type;
53 };
54
55 #define ETHERTYPE_PUP           0x0200  /* PUP protocol */
56 #define ETHERTYPE_IP            0x0800  /* IP protocol */
57 #define ETHERTYPE_ARP           0x0806  /* address resolution protocol */
58 #define ETHERTYPE_REVARP        0x8035  /* reverse addr resolution protocol */
59
60 /*
61  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
62  * (type-ETHERTYPE_TRAIL)*512 bytes of data followed
63  * by an ETHER type (as given above) and then the (variable-length) header.
64  */
65 #define ETHERTYPE_TRAIL         0x1000          /* Trailer packet */
66 #define ETHERTYPE_NTRAILER      16
67
68 #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */
69
70 #define ETHERMTU        1500
71 #define ETHERMIN        (60-14)
72
73 #ifdef _KERNEL
74 /*
75  * Macro to map an IP multicast address to an Ethernet multicast address.
76  * The high-order 25 bits of the Ethernet address are statically assigned,
77  * and the low-order 23 bits are taken from the low end of the IP address.
78  */
79 #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)                          \
80         /* struct in_addr *ipaddr; */                                   \
81         /* u_int8_t enaddr[ETHER_ADDR_LEN]; */                          \
82 {                                                                       \
83         (enaddr)[0] = 0x01;                                             \
84         (enaddr)[1] = 0x00;                                             \
85         (enaddr)[2] = 0x5e;                                             \
86         (enaddr)[3] = ((u_int8_t *)ipaddr)[1] & 0x7f;                   \
87         (enaddr)[4] = ((u_int8_t *)ipaddr)[2];                          \
88         (enaddr)[5] = ((u_int8_t *)ipaddr)[3];                          \
89 }
90 #endif
91
92 /*
93  * Ethernet Address Resolution Protocol.
94  *
95  * See RFC 826 for protocol description.  Structure below is adapted
96  * to resolving internet addresses.  Field names used correspond to 
97  * RFC 826.
98  */
99 struct  ether_arp {
100         struct   arphdr ea_hdr;                 /* fixed-size header */
101         u_int8_t arp_sha[ETHER_ADDR_LEN];       /* sender hardware address */
102         u_int8_t arp_spa[4];                    /* sender protocol address */
103         u_int8_t arp_tha[ETHER_ADDR_LEN];       /* target hardware address */
104         u_int8_t arp_tpa[4];                    /* target protocol address */
105 };
106 #define arp_hrd ea_hdr.ar_hrd
107 #define arp_pro ea_hdr.ar_pro
108 #define arp_hln ea_hdr.ar_hln
109 #define arp_pln ea_hdr.ar_pln
110 #define arp_op  ea_hdr.ar_op
111
112 /*
113  * Structure shared between the ethernet driver modules and
114  * the address resolution code.  For example, each ec_softc or il_softc
115  * begins with this structure.
116  */
117 struct  arpcom {
118         struct   ifnet ac_if;                   /* network-visible interface */
119         u_int8_t ac_enaddr[ETHER_ADDR_LEN];     /* ethernet hardware address */
120         char     ac__pad[2];                    /* be nice to m68k ports */
121         LIST_HEAD(, ether_multi) ac_multiaddrs; /* list of ether multicast addrs */
122         int      ac_multicnt;                   /* length of ac_multiaddrs list */
123 };
124
125 struct llinfo_arp {
126         LIST_ENTRY(llinfo_arp) la_list;
127         struct  rtentry *la_rt;
128         struct  mbuf *la_hold;          /* last packet until resolved/timeout */
129         long    la_asked;               /* last time we QUERIED for this addr */
130 #define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */
131 };
132
133 struct sockaddr_inarp {
134         u_int8_t  sin_len;
135         u_int8_t  sin_family;
136         u_int16_t sin_port;
137         struct    in_addr sin_addr;
138         struct    in_addr sin_srcaddr;
139         u_int16_t sin_tos;
140         u_int16_t sin_other;
141 #define SIN_PROXY 1
142 };
143
144 /*
145  * IP and ethernet specific routing flags
146  */
147 #define RTF_USETRAILERS RTF_PROTO1      /* use trailers */
148 #define RTF_ANNOUNCE    RTF_PROTO2      /* announce new arp entry */
149
150 #ifdef  _KERNEL
151 u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN];
152 u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
153 u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
154 struct  ifqueue arpintrq;
155
156 void    arpwhohas(struct arpcom *, struct in_addr *);
157 void    arpintr(void);
158 int     arpresolve(struct arpcom *,
159             struct rtentry *, struct mbuf *, struct sockaddr *, u_char *, struct llentry **);
160 void    arp_ifinit(struct arpcom *, struct ifaddr *);
161 void    arp_rtrequest(int, struct rtentry *, struct sockaddr *);
162
163 int     ether_addmulti(struct ifreq *, struct arpcom *);
164 int     ether_delmulti(struct ifreq *, struct arpcom *);
165 #endif /* _KERNEL */
166
167 /*
168  * Ethernet multicast address structure.  There is one of these for each
169  * multicast address or range of multicast addresses that we are supposed
170  * to listen to on a particular interface.  They are kept in a linked list,
171  * rooted in the interface's arpcom structure.  (This really has nothing to
172  * do with ARP, or with the Internet address family, but this appears to be
173  * the minimally-disrupting place to put it.)
174  */
175 struct ether_multi {
176         u_int8_t enm_addrlo[ETHER_ADDR_LEN]; /* low  or only address of range */
177         u_int8_t enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */
178         struct   arpcom *enm_ac;        /* back pointer to arpcom */
179         u_int    enm_refcount;          /* no. claims to this addr/range */
180         LIST_ENTRY(ether_multi) enm_list;
181 };
182
183 /*
184  * Structure used by macros below to remember position when stepping through
185  * all of the ether_multi records.
186  */
187 struct ether_multistep {
188         struct ether_multi  *e_enm;
189 };
190
191 /*
192  * Macro for looking up the ether_multi record for a given range of Ethernet
193  * multicast addresses connected to a given arpcom structure.  If no matching
194  * record is found, "enm" returns NULL.
195  */
196 #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm)                     \
197         /* u_int8_t addrlo[ETHER_ADDR_LEN]; */                          \
198         /* u_int8_t addrhi[ETHER_ADDR_LEN]; */                          \
199         /* struct arpcom *ac; */                                        \
200         /* struct ether_multi *enm; */                                  \
201 {                                                                       \
202         for ((enm) = (ac)->ac_multiaddrs.lh_first;                      \
203             (enm) != NULL &&                                            \
204             (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 ||  \
205              bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0);   \
206                 (enm) = (enm)->enm_list.le_next);                       \
207 }
208
209 /*
210  * Macro to step through all of the ether_multi records, one at a time.
211  * The current position is remembered in "step", which the caller must
212  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
213  * and get the first record.  Both macros return a NULL "enm" when there
214  * are no remaining records.
215  */
216 #define ETHER_NEXT_MULTI(step, enm) \
217         /* struct ether_multistep step; */  \
218         /* struct ether_multi *enm; */  \
219 { \
220         if (((enm) = (step).e_enm) != NULL) \
221                 (step).e_enm = (enm)->enm_list.le_next; \
222 }
223
224 #define ETHER_FIRST_MULTI(step, ac, enm) \
225         /* struct ether_multistep step; */ \
226         /* struct arpcom *ac; */ \
227         /* struct ether_multi *enm; */ \
228 { \
229         (step).e_enm = (ac)->ac_multiaddrs.lh_first; \
230         ETHER_NEXT_MULTI((step), (enm)); \
231 }
232
233 #ifdef _KERNEL
234 void arp_rtrequest(int, struct rtentry *, struct sockaddr *);
235 int arpresolve(struct arpcom *, struct rtentry *, struct mbuf *,
236                     struct sockaddr *, u_char *, struct llentry **);
237 void arpintr(void);
238 int arpioctl(u_long, caddr_t);
239 void arp_ifinit(struct arpcom *, struct ifaddr *);
240 void revarpinput(struct mbuf *);
241 void in_revarpinput(struct mbuf *);
242 void revarprequest(struct ifnet *);
243 int revarpwhoarewe(struct ifnet *, struct in_addr *, struct in_addr *);
244 int revarpwhoami(struct in_addr *, struct ifnet *);
245 int db_show_arptab(void);
246 #endif
247
248 /*
249  * Prototype ethers(3) functions.
250  */
251 #ifndef _KERNEL
252 #include <sys/cdefs.h>
253 __BEGIN_DECLS
254 char *  ether_ntoa(struct ether_addr *);
255 struct ether_addr *
256         ether_aton(char *);
257 int     ether_ntohost(char *, struct ether_addr *);
258 int     ether_hostton(char *, struct ether_addr *);
259 int     ether_line(char *, struct ether_addr *, char *);
260 __END_DECLS
261 #endif