1 | /* |
---|
2 | * Copyright (c) 1982, 1986, 1993 |
---|
3 | * The Regents of the University of California. All rights reserved. |
---|
4 | * |
---|
5 | * Redistribution and use in source and binary forms, with or without |
---|
6 | * modification, are permitted provided that the following conditions |
---|
7 | * are met: |
---|
8 | * 1. Redistributions of source code must retain the above copyright |
---|
9 | * notice, this list of conditions and the following disclaimer. |
---|
10 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
11 | * notice, this list of conditions and the following disclaimer in the |
---|
12 | * documentation and/or other materials provided with the distribution. |
---|
13 | * 3. All advertising materials mentioning features or use of this software |
---|
14 | * must display the following acknowledgement: |
---|
15 | * This product includes software developed by the University of |
---|
16 | * California, Berkeley and its contributors. |
---|
17 | * 4. Neither the name of the University nor the names of its contributors |
---|
18 | * may be used to endorse or promote products derived from this software |
---|
19 | * without specific prior written permission. |
---|
20 | * |
---|
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
---|
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
---|
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
31 | * SUCH DAMAGE. |
---|
32 | * |
---|
33 | * @(#)if_ether.h 8.3 (Berkeley) 5/2/95 |
---|
34 | * $Id$ |
---|
35 | */ |
---|
36 | |
---|
37 | #ifndef _NETINET_IF_ETHER_H_ |
---|
38 | #define _NETINET_IF_ETHER_H_ |
---|
39 | |
---|
40 | #include <net/ethernet.h> |
---|
41 | |
---|
42 | #define ETHERTYPE_PUP 0x0200 /* PUP protocol */ |
---|
43 | #define ETHERTYPE_IP 0x0800 /* IP protocol */ |
---|
44 | #define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ |
---|
45 | #define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ |
---|
46 | |
---|
47 | /* |
---|
48 | * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have |
---|
49 | * (type-ETHERTYPE_TRAIL)*512 bytes of data followed |
---|
50 | * by an ETHER type (as given above) and then the (variable-length) header. |
---|
51 | */ |
---|
52 | #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ |
---|
53 | #define ETHERTYPE_NTRAILER 16 |
---|
54 | |
---|
55 | #define ETHERMTU (ETHER_MAX_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) |
---|
56 | #define ETHERMIN (ETHER_MIN_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) |
---|
57 | |
---|
58 | #ifdef KERNEL |
---|
59 | /* |
---|
60 | * Macro to map an IP multicast address to an Ethernet multicast address. |
---|
61 | * The high-order 25 bits of the Ethernet address are statically assigned, |
---|
62 | * and the low-order 23 bits are taken from the low end of the IP address. |
---|
63 | */ |
---|
64 | #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ |
---|
65 | /* struct in_addr *ipaddr; */ \ |
---|
66 | /* u_char enaddr[ETHER_ADDR_LEN]; */ \ |
---|
67 | { \ |
---|
68 | (enaddr)[0] = 0x01; \ |
---|
69 | (enaddr)[1] = 0x00; \ |
---|
70 | (enaddr)[2] = 0x5e; \ |
---|
71 | (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ |
---|
72 | (enaddr)[4] = ((u_char *)ipaddr)[2]; \ |
---|
73 | (enaddr)[5] = ((u_char *)ipaddr)[3]; \ |
---|
74 | } |
---|
75 | #endif |
---|
76 | |
---|
77 | /* |
---|
78 | * Ethernet Address Resolution Protocol. |
---|
79 | * |
---|
80 | * See RFC 826 for protocol description. Structure below is adapted |
---|
81 | * to resolving internet addresses. Field names used correspond to |
---|
82 | * RFC 826. |
---|
83 | */ |
---|
84 | struct ether_arp { |
---|
85 | struct arphdr ea_hdr; /* fixed-size header */ |
---|
86 | u_char arp_sha[ETHER_ADDR_LEN]; /* sender hardware address */ |
---|
87 | u_char arp_spa[4]; /* sender protocol address */ |
---|
88 | u_char arp_tha[ETHER_ADDR_LEN]; /* target hardware address */ |
---|
89 | u_char arp_tpa[4]; /* target protocol address */ |
---|
90 | }; |
---|
91 | #define arp_hrd ea_hdr.ar_hrd |
---|
92 | #define arp_pro ea_hdr.ar_pro |
---|
93 | #define arp_hln ea_hdr.ar_hln |
---|
94 | #define arp_pln ea_hdr.ar_pln |
---|
95 | #define arp_op ea_hdr.ar_op |
---|
96 | |
---|
97 | |
---|
98 | /* |
---|
99 | * Structure shared between the ethernet driver modules and |
---|
100 | * the address resolution code. For example, each ec_softc or il_softc |
---|
101 | * begins with this structure. |
---|
102 | */ |
---|
103 | struct arpcom { |
---|
104 | /* |
---|
105 | * The ifnet struct _must_ be at the head of this structure. |
---|
106 | */ |
---|
107 | struct ifnet ac_if; /* network-visible interface */ |
---|
108 | u_char ac_enaddr[ETHER_ADDR_LEN]; /* ethernet hardware address */ |
---|
109 | struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */ |
---|
110 | int ac_multicnt; /* length of ac_multiaddrs list */ |
---|
111 | }; |
---|
112 | |
---|
113 | struct sockaddr_inarp { |
---|
114 | u_char sin_len; |
---|
115 | u_char sin_family; |
---|
116 | u_short sin_port; |
---|
117 | struct in_addr sin_addr; |
---|
118 | struct in_addr sin_srcaddr; |
---|
119 | u_short sin_tos; |
---|
120 | u_short sin_other; |
---|
121 | #define SIN_PROXY 1 |
---|
122 | }; |
---|
123 | /* |
---|
124 | * IP and ethernet specific routing flags |
---|
125 | */ |
---|
126 | #define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ |
---|
127 | #define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ |
---|
128 | |
---|
129 | #ifdef KERNEL |
---|
130 | extern u_char etherbroadcastaddr[ETHER_ADDR_LEN]; |
---|
131 | extern u_char ether_ipmulticast_min[ETHER_ADDR_LEN]; |
---|
132 | extern u_char ether_ipmulticast_max[ETHER_ADDR_LEN]; |
---|
133 | extern struct ifqueue arpintrq; |
---|
134 | |
---|
135 | int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *, |
---|
136 | struct sockaddr *, u_char *, struct rtentry *)); |
---|
137 | void arp_ifinit __P((struct arpcom *, struct ifaddr *)); |
---|
138 | int ether_addmulti __P((struct ifreq *, struct arpcom *)); |
---|
139 | int ether_delmulti __P((struct ifreq *, struct arpcom *)); |
---|
140 | |
---|
141 | /* |
---|
142 | * Ethernet multicast address structure. There is one of these for each |
---|
143 | * multicast address or range of multicast addresses that we are supposed |
---|
144 | * to listen to on a particular interface. They are kept in a linked list, |
---|
145 | * rooted in the interface's arpcom structure. (This really has nothing to |
---|
146 | * do with ARP, or with the Internet address family, but this appears to be |
---|
147 | * the minimally-disrupting place to put it.) |
---|
148 | */ |
---|
149 | struct ether_multi { |
---|
150 | u_char enm_addrlo[ETHER_ADDR_LEN]; /* low or only address of range */ |
---|
151 | u_char enm_addrhi[ETHER_ADDR_LEN]; /* high or only address of range */ |
---|
152 | struct arpcom *enm_ac; /* back pointer to arpcom */ |
---|
153 | u_int enm_refcount; /* no. claims to this addr/range */ |
---|
154 | struct ether_multi *enm_next; /* ptr to next ether_multi */ |
---|
155 | }; |
---|
156 | |
---|
157 | /* |
---|
158 | * Structure used by macros below to remember position when stepping through |
---|
159 | * all of the ether_multi records. |
---|
160 | */ |
---|
161 | struct ether_multistep { |
---|
162 | struct ether_multi *e_enm; |
---|
163 | }; |
---|
164 | |
---|
165 | /* |
---|
166 | * Macro for looking up the ether_multi record for a given range of Ethernet |
---|
167 | * multicast addresses connected to a given arpcom structure. If no matching |
---|
168 | * record is found, "enm" returns NULL. |
---|
169 | */ |
---|
170 | #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ |
---|
171 | /* u_char addrlo[ETHER_ADDR_LEN]; */ \ |
---|
172 | /* u_char addrhi[ETHER_ADDR_LEN]; */ \ |
---|
173 | /* struct arpcom *ac; */ \ |
---|
174 | /* struct ether_multi *enm; */ \ |
---|
175 | { \ |
---|
176 | for ((enm) = (ac)->ac_multiaddrs; \ |
---|
177 | (enm) != NULL && \ |
---|
178 | (bcmp((enm)->enm_addrlo, (addrlo), ETHER_ADDR_LEN) != 0 || \ |
---|
179 | bcmp((enm)->enm_addrhi, (addrhi), ETHER_ADDR_LEN) != 0); \ |
---|
180 | (enm) = (enm)->enm_next); \ |
---|
181 | } |
---|
182 | |
---|
183 | /* |
---|
184 | * Macro to step through all of the ether_multi records, one at a time. |
---|
185 | * The current position is remembered in "step", which the caller must |
---|
186 | * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" |
---|
187 | * and get the first record. Both macros return a NULL "enm" when there |
---|
188 | * are no remaining records. |
---|
189 | */ |
---|
190 | #define ETHER_NEXT_MULTI(step, enm) \ |
---|
191 | /* struct ether_multistep step; */ \ |
---|
192 | /* struct ether_multi *enm; */ \ |
---|
193 | { \ |
---|
194 | if (((enm) = (step).e_enm) != NULL) \ |
---|
195 | (step).e_enm = (enm)->enm_next; \ |
---|
196 | } |
---|
197 | |
---|
198 | #define ETHER_FIRST_MULTI(step, ac, enm) \ |
---|
199 | /* struct ether_multistep step; */ \ |
---|
200 | /* struct arpcom *ac; */ \ |
---|
201 | /* struct ether_multi *enm; */ \ |
---|
202 | { \ |
---|
203 | (step).e_enm = (ac)->ac_multiaddrs; \ |
---|
204 | ETHER_NEXT_MULTI((step), (enm)); \ |
---|
205 | } |
---|
206 | |
---|
207 | #endif |
---|
208 | |
---|
209 | #endif |
---|