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