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