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