2 * $Id: multicast.c,v 1.8 2001-12-10 20:16:55 srittau Exp $
4 * Copyright (c) 1990,1993 Regents of The University of Michigan.
5 * All Rights Reserved. See COPYRIGHT.
10 #endif /* HAVE_CONFIG_H */
15 #include <sys/param.h>
16 #include <sys/types.h>
17 #include <sys/ioctl.h>
18 #include <sys/socket.h>
21 #include <net/route.h>
26 /* work around for FreeBSD */
27 #if defined(__FreeBSD__) && (__FreeBSD__ >= 2)
28 #include <osreldate.h>
29 #if __FreeBSD_version >= 300000
30 #include <net/if_dl.h>
31 #define NO_DATA_LINK_PASSTHROUGH
32 #endif /* __FreeBSD_version >= 300000 */
33 #endif /* __FreeBSD__ */
36 #include <sys/sockio.h>
39 #include <atalk/util.h>
40 #include <netatalk/endian.h>
46 static const unsigned char ethermulti[ 6 ] = {
47 0x09, 0x00, 0x07, 0xff, 0xff, 0xff,
50 static const unsigned char ethermultitab[ 253 ][ 6 ] = {
51 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x00, },
52 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x01, },
53 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x02, },
54 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x03, },
55 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x04, },
56 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x05, },
57 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x06, },
58 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x07, },
59 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x08, },
60 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x09, },
61 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0a, },
62 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0b, },
63 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0c, },
64 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0d, },
65 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0e, },
66 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x0f, },
67 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x10, },
68 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x11, },
69 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x12, },
70 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x13, },
71 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x14, },
72 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x15, },
73 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x16, },
74 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x17, },
75 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x18, },
76 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x19, },
77 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1a, },
78 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1b, },
79 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1c, },
80 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1d, },
81 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1e, },
82 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x1f, },
83 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x20, },
84 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x21, },
85 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x22, },
86 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x23, },
87 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x24, },
88 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x25, },
89 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x26, },
90 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x27, },
91 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x28, },
92 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x29, },
93 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2a, },
94 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2b, },
95 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2c, },
96 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2d, },
97 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2e, },
98 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x2f, },
99 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x30, },
100 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x31, },
101 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x32, },
102 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x33, },
103 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x34, },
104 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x35, },
105 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x36, },
106 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x37, },
107 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x38, },
108 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x39, },
109 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3a, },
110 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3b, },
111 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3c, },
112 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3d, },
113 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3e, },
114 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x3f, },
115 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x40, },
116 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x41, },
117 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x42, },
118 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x43, },
119 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x44, },
120 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x45, },
121 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x46, },
122 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x47, },
123 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x48, },
124 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x49, },
125 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4a, },
126 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4b, },
127 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4c, },
128 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4d, },
129 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4e, },
130 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x4f, },
131 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x50, },
132 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x51, },
133 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x52, },
134 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x53, },
135 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x54, },
136 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x55, },
137 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x56, },
138 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x57, },
139 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x58, },
140 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x59, },
141 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5a, },
142 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5b, },
143 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5c, },
144 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5d, },
145 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5e, },
146 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x5f, },
147 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x60, },
148 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x61, },
149 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x62, },
150 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x63, },
151 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x64, },
152 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x65, },
153 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x66, },
154 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x67, },
155 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x68, },
156 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x69, },
157 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6a, },
158 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6b, },
159 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6c, },
160 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6d, },
161 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6e, },
162 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x6f, },
163 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x70, },
164 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x71, },
165 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x72, },
166 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x73, },
167 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x74, },
168 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x75, },
169 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x76, },
170 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x77, },
171 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x78, },
172 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x79, },
173 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7a, },
174 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7b, },
175 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7c, },
176 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7d, },
177 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7e, },
178 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x7f, },
179 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x80, },
180 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x81, },
181 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x82, },
182 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x83, },
183 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x84, },
184 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x85, },
185 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x86, },
186 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x87, },
187 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x88, },
188 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x89, },
189 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8a, },
190 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8b, },
191 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8c, },
192 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8d, },
193 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8e, },
194 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x8f, },
195 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x90, },
196 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x91, },
197 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x92, },
198 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x93, },
199 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x94, },
200 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x95, },
201 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x96, },
202 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x97, },
203 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x98, },
204 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x99, },
205 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9a, },
206 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9b, },
207 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9c, },
208 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9d, },
209 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9e, },
210 { 0x09, 0x00, 0x07, 0x00, 0x00, 0x9f, },
211 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa0, },
212 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa1, },
213 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa2, },
214 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa3, },
215 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa4, },
216 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa5, },
217 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa6, },
218 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa7, },
219 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa8, },
220 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xa9, },
221 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xaa, },
222 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xab, },
223 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xac, },
224 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xad, },
225 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xae, },
226 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xaf, },
227 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb0, },
228 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb1, },
229 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb2, },
230 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb3, },
231 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb4, },
232 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb5, },
233 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb6, },
234 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb7, },
235 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb8, },
236 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xb9, },
237 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xba, },
238 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xbb, },
239 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xbc, },
240 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xbd, },
241 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xbe, },
242 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xbf, },
243 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc0, },
244 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc1, },
245 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc2, },
246 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc3, },
247 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc4, },
248 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc5, },
249 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc6, },
250 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc7, },
251 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc8, },
252 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xc9, },
253 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xca, },
254 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xcb, },
255 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xcc, },
256 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xcd, },
257 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xce, },
258 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xcf, },
259 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd0, },
260 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd1, },
261 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd2, },
262 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd3, },
263 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd4, },
264 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd5, },
265 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd6, },
266 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd7, },
267 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd8, },
268 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xd9, },
269 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xda, },
270 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xdb, },
271 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xdc, },
272 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xdd, },
273 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xde, },
274 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xdf, },
275 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe0, },
276 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe1, },
277 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe2, },
278 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe3, },
279 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe4, },
280 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe5, },
281 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe6, },
282 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe7, },
283 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe8, },
284 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xe9, },
285 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xea, },
286 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xeb, },
287 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xec, },
288 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xed, },
289 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xee, },
290 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xef, },
291 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf0, },
292 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf1, },
293 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf2, },
294 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf3, },
295 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf4, },
296 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf5, },
297 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf6, },
298 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf7, },
299 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf8, },
300 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xf9, },
301 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xfa, },
302 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xfb, },
303 { 0x09, 0x00, 0x07, 0x00, 0x00, 0xfc, },
306 static const unsigned char tokenmulti[ 6 ] = {
307 0xc0, 0x00, 0x40, 0x00, 0x00, 0x00,
310 static const unsigned char tokenmultitab[ 19 ][ 6 ] = {
311 { 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, },
312 { 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, },
313 { 0xc0, 0x00, 0x00, 0x00, 0x20, 0x00, },
314 { 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, },
315 { 0xc0, 0x00, 0x00, 0x00, 0x80, 0x00, },
316 { 0xc0, 0x00, 0x00, 0x01, 0x00, 0x00, },
317 { 0xc0, 0x00, 0x00, 0x02, 0x00, 0x00, },
318 { 0xc0, 0x00, 0x00, 0x04, 0x00, 0x00, },
319 { 0xc0, 0x00, 0x00, 0x08, 0x00, 0x00, },
320 { 0xc0, 0x00, 0x00, 0x10, 0x00, 0x00, },
321 { 0xc0, 0x00, 0x00, 0x20, 0x00, 0x00, },
322 { 0xc0, 0x00, 0x00, 0x40, 0x00, 0x00, },
323 { 0xc0, 0x00, 0x00, 0x80, 0x00, 0x00, },
324 { 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, },
325 { 0xc0, 0x00, 0x02, 0x00, 0x00, 0x00, },
326 { 0xc0, 0x00, 0x04, 0x00, 0x00, 0x00, },
327 { 0xc0, 0x00, 0x08, 0x00, 0x00, 0x00, },
328 { 0xc0, 0x00, 0x10, 0x00, 0x00, 0x00, },
329 { 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, },
334 /* configure multicast for a given named interface */
335 int addmulti(const char *name, const unsigned char *data)
337 #ifdef NO_DATA_LINK_PASSTHROUGH
338 struct sockaddr_dl sa;
339 #else /* NO_DATA_LINK_PASSTHROUGH */
341 #endif /* NO_DATA_LINK_PASSTHROUGH */
343 memset(&sa, 0, sizeof(sa));
344 #ifdef NO_DATA_LINK_PASSTHROUGH
345 sa.sdl_family = AF_LINK;
346 memcpy(LLADDR(&sa), data ? data : ethermulti, sizeof(ethermulti));
347 sa.sdl_alen = sizeof(ethermulti);
348 sa.sdl_len = sizeof(sa);
349 #else /* NO_DATA_LINK_PASSTHROUGH */
350 memcpy(sa.sa_data, data ? data : ethermulti, sizeof(ethermulti));
351 #endif /* NO_DATA_LINK_PASSTHROUGH */
352 if (ifconfig(name, SIOCADDMULTI, (struct sockaddr_at *)&sa))
359 atalk_cksum( data, len )
366 for ( end = data + len; data < end; data++ ) {
367 cksum = ( cksum + *data ) << 1;
368 if ( cksum & 0x00010000 ) {
378 return( (u_int16_t) cksum );
382 * Fill in multicast for zone. There is a general issue here: how can
383 * we tell the type of interface we're configuring for? E.g. Is it
384 * ethernet, tokenring, or FDDI? (Of course, FDDI and Ethernet look just
396 (zt->zt_bcast = (u_char *) malloc(sizeof( ethermulti ))) == NULL) {
397 syslog( LOG_ERR, "zone_bcast malloc: %s", strerror(errno) );
401 for ( i = 0; i < zt->zt_len; i++ ) {
402 uname[ i ] = diatoupper((int) zt->zt_name[ i ]);
404 cksum = atalk_cksum( uname, zt->zt_len );
405 #define elements(a) (sizeof(a)/sizeof((a)[0]))
406 memcpy(zt->zt_bcast, ethermultitab[ cksum % elements( ethermultitab ) ],
407 sizeof( ethermulti ));