xref: /csrg-svn/sys/netinet/in.c (revision 58998)
1 /*
2  * Copyright (c) 1982, 1986, 1991 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)in.c	7.31 (Berkeley) 04/07/93
8  */
9 
10 #include <sys/param.h>
11 #include <sys/ioctl.h>
12 #include <sys/errno.h>
13 #include <sys/malloc.h>
14 #include <sys/socket.h>
15 #include <sys/socketvar.h>
16 
17 #include <net/if.h>
18 #include <net/route.h>
19 #include <net/af.h>
20 
21 #include <netinet/in_systm.h>
22 #include <netinet/in.h>
23 #include <netinet/in_var.h>
24 
25 #ifdef INET
26 /*
27  * Formulate an Internet address from network + host.
28  */
29 struct in_addr
30 in_makeaddr(net, host)
31 	u_long net, host;
32 {
33 	register struct in_ifaddr *ia;
34 	register u_long mask;
35 	u_long addr;
36 
37 	if (IN_CLASSA(net))
38 		mask = IN_CLASSA_HOST;
39 	else if (IN_CLASSB(net))
40 		mask = IN_CLASSB_HOST;
41 	else
42 		mask = IN_CLASSC_HOST;
43 	for (ia = in_ifaddr; ia; ia = ia->ia_next)
44 		if ((ia->ia_netmask & net) == ia->ia_net) {
45 			mask = ~ia->ia_subnetmask;
46 			break;
47 		}
48 	addr = htonl(net | (host & mask));
49 	return (*(struct in_addr *)&addr);
50 }
51 
52 /*
53  * Return the network number from an internet address.
54  */
55 u_long
56 in_netof(in)
57 	struct in_addr in;
58 {
59 	register u_long i = ntohl(in.s_addr);
60 	register u_long net;
61 	register struct in_ifaddr *ia;
62 
63 	if (IN_CLASSA(i))
64 		net = i & IN_CLASSA_NET;
65 	else if (IN_CLASSB(i))
66 		net = i & IN_CLASSB_NET;
67 	else if (IN_CLASSC(i))
68 		net = i & IN_CLASSC_NET;
69 	else if (IN_CLASSD(i))
70 		net = i & IN_CLASSD_NET;
71 	else
72 		return (0);
73 
74 	/*
75 	 * Check whether network is a subnet;
76 	 * if so, return subnet number.
77 	 */
78 	for (ia = in_ifaddr; ia; ia = ia->ia_next)
79 		if (net == ia->ia_net)
80 			return (i & ia->ia_subnetmask);
81 	return (net);
82 }
83 
84 /*
85  * Compute and save network mask as sockaddr from an internet address.
86  */
87 in_sockmaskof(in, sockmask)
88 	struct in_addr in;
89 	register struct sockaddr_in *sockmask;
90 {
91 	register u_long net;
92 	register u_long mask;
93     {
94 	register u_long i = ntohl(in.s_addr);
95 
96 	if (i == 0)
97 		net = 0, mask = 0;
98 	else if (IN_CLASSA(i))
99 		net = i & IN_CLASSA_NET, mask = IN_CLASSA_NET;
100 	else if (IN_CLASSB(i))
101 		net = i & IN_CLASSB_NET, mask = IN_CLASSB_NET;
102 	else if (IN_CLASSC(i))
103 		net = i & IN_CLASSC_NET, mask = IN_CLASSC_NET;
104 	else
105 		net = i, mask = -1;
106     }
107     {
108 	register struct in_ifaddr *ia;
109 	/*
110 	 * Check whether network is a subnet;
111 	 * if so, return subnet number.
112 	 */
113 	for (ia = in_ifaddr; ia; ia = ia->ia_next)
114 		if (net == ia->ia_net)
115 			mask =  ia->ia_subnetmask;
116     }
117     {
118 	register char *cpbase = (char *)&(sockmask->sin_addr);
119 	register char *cp = (char *)(1 + &(sockmask->sin_addr));
120 
121 	sockmask->sin_addr.s_addr = htonl(mask);
122 	sockmask->sin_len = 0;
123 	while (--cp >= cpbase)
124 		if (*cp) {
125 			sockmask->sin_len = 1 + cp - (caddr_t)sockmask;
126 			break;
127 		}
128     }
129 }
130 
131 #ifndef SUBNETSARELOCAL
132 #define	SUBNETSARELOCAL	1
133 #endif
134 int subnetsarelocal = SUBNETSARELOCAL;
135 /*
136  * Return 1 if an internet address is for a ``local'' host
137  * (one to which we have a connection).  If subnetsarelocal
138  * is true, this includes other subnets of the local net.
139  * Otherwise, it includes only the directly-connected (sub)nets.
140  */
141 in_localaddr(in)
142 	struct in_addr in;
143 {
144 	register u_long i = ntohl(in.s_addr);
145 	register struct in_ifaddr *ia;
146 
147 	if (subnetsarelocal) {
148 		for (ia = in_ifaddr; ia; ia = ia->ia_next)
149 			if ((i & ia->ia_netmask) == ia->ia_net)
150 				return (1);
151 	} else {
152 		for (ia = in_ifaddr; ia; ia = ia->ia_next)
153 			if ((i & ia->ia_subnetmask) == ia->ia_subnet)
154 				return (1);
155 	}
156 	return (0);
157 }
158 
159 /*
160  * Determine whether an IP address is in a reserved set of addresses
161  * that may not be forwarded, or whether datagrams to that destination
162  * may be forwarded.
163  */
164 in_canforward(in)
165 	struct in_addr in;
166 {
167 	register u_long i = ntohl(in.s_addr);
168 	register u_long net;
169 
170 	if (IN_EXPERIMENTAL(i) || IN_MULTICAST(i))
171 		return (0);
172 	if (IN_CLASSA(i)) {
173 		net = i & IN_CLASSA_NET;
174 		if (net == 0 || net == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT))
175 			return (0);
176 	}
177 	return (1);
178 }
179 
180 /*
181  * Trim a mask in a sockaddr
182  */
183 void
184 in_socktrim(ap)
185 struct sockaddr_in *ap;
186 {
187     register char *cplim = (char *) &ap->sin_addr;
188     register char *cp = (char *) (&ap->sin_addr + 1);
189 
190     ap->sin_len = 0;
191     while (--cp > cplim)
192         if (*cp) {
193 	    (ap)->sin_len = cp - (char *) (ap) + 1;
194 	    break;
195 	}
196 }
197 
198 int	in_interfaces;		/* number of external internet interfaces */
199 extern	struct ifnet loif;
200 
201 /*
202  * Generic internet control operations (ioctl's).
203  * Ifp is 0 if not an interface-specific ioctl.
204  */
205 /* ARGSUSED */
206 in_control(so, cmd, data, ifp)
207 	struct socket *so;
208 	int cmd;
209 	caddr_t data;
210 	register struct ifnet *ifp;
211 {
212 	register struct ifreq *ifr = (struct ifreq *)data;
213 	register struct in_ifaddr *ia = 0;
214 	register struct ifaddr *ifa;
215 	struct in_ifaddr *oia;
216 	struct in_aliasreq *ifra = (struct in_aliasreq *)data;
217 	struct sockaddr_in oldaddr;
218 	int error, hostIsNew, maskIsNew;
219 	u_long i;
220 
221 	/*
222 	 * Find address for this interface, if it exists.
223 	 */
224 	if (ifp)
225 		for (ia = in_ifaddr; ia; ia = ia->ia_next)
226 			if (ia->ia_ifp == ifp)
227 				break;
228 
229 	switch (cmd) {
230 
231 	case SIOCAIFADDR:
232 	case SIOCDIFADDR:
233 		if (ifra->ifra_addr.sin_family == AF_INET)
234 		    for (oia = ia; ia; ia = ia->ia_next) {
235 			if (ia->ia_ifp == ifp  &&
236 			    ia->ia_addr.sin_addr.s_addr ==
237 				ifra->ifra_addr.sin_addr.s_addr)
238 			    break;
239 		}
240 		if (cmd == SIOCDIFADDR && ia == 0)
241 			return (EADDRNOTAVAIL);
242 		/* FALLTHROUGH */
243 	case SIOCSIFADDR:
244 	case SIOCSIFNETMASK:
245 	case SIOCSIFDSTADDR:
246 		if ((so->so_state & SS_PRIV) == 0)
247 			return (EPERM);
248 
249 		if (ifp == 0)
250 			panic("in_control");
251 		if (ia == (struct in_ifaddr *)0) {
252 			oia = (struct in_ifaddr *)
253 				malloc(sizeof *oia, M_IFADDR, M_WAITOK);
254 			if (oia == (struct in_ifaddr *)NULL)
255 				return (ENOBUFS);
256 			bzero((caddr_t)oia, sizeof *oia);
257 			if (ia = in_ifaddr) {
258 				for ( ; ia->ia_next; ia = ia->ia_next)
259 					continue;
260 				ia->ia_next = oia;
261 			} else
262 				in_ifaddr = oia;
263 			ia = oia;
264 			if (ifa = ifp->if_addrlist) {
265 				for ( ; ifa->ifa_next; ifa = ifa->ifa_next)
266 					continue;
267 				ifa->ifa_next = (struct ifaddr *) ia;
268 			} else
269 				ifp->if_addrlist = (struct ifaddr *) ia;
270 			ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
271 			ia->ia_ifa.ifa_dstaddr
272 					= (struct sockaddr *)&ia->ia_dstaddr;
273 			ia->ia_ifa.ifa_netmask
274 					= (struct sockaddr *)&ia->ia_sockmask;
275 			ia->ia_sockmask.sin_len = 8;
276 			if (ifp->if_flags & IFF_BROADCAST) {
277 				ia->ia_broadaddr.sin_len = sizeof(ia->ia_addr);
278 				ia->ia_broadaddr.sin_family = AF_INET;
279 			}
280 			ia->ia_ifp = ifp;
281 			if (ifp != &loif)
282 				in_interfaces++;
283 		}
284 		break;
285 
286 	case SIOCSIFBRDADDR:
287 		if ((so->so_state & SS_PRIV) == 0)
288 			return (EPERM);
289 		/* FALLTHROUGH */
290 
291 	case SIOCGIFADDR:
292 	case SIOCGIFNETMASK:
293 	case SIOCGIFDSTADDR:
294 	case SIOCGIFBRDADDR:
295 		if (ia == (struct in_ifaddr *)0)
296 			return (EADDRNOTAVAIL);
297 		break;
298 	}
299 	switch (cmd) {
300 
301 	case SIOCGIFADDR:
302 		*((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_addr;
303 		break;
304 
305 	case SIOCGIFBRDADDR:
306 		if ((ifp->if_flags & IFF_BROADCAST) == 0)
307 			return (EINVAL);
308 		*((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_broadaddr;
309 		break;
310 
311 	case SIOCGIFDSTADDR:
312 		if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
313 			return (EINVAL);
314 		*((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_dstaddr;
315 		break;
316 
317 	case SIOCGIFNETMASK:
318 		*((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask;
319 		break;
320 
321 	case SIOCSIFDSTADDR:
322 		if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
323 			return (EINVAL);
324 		oldaddr = ia->ia_dstaddr;
325 		ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr;
326 		if (ifp->if_ioctl && (error = (*ifp->if_ioctl)
327 					(ifp, SIOCSIFDSTADDR, (caddr_t)ia))) {
328 			ia->ia_dstaddr = oldaddr;
329 			return (error);
330 		}
331 		if (ia->ia_flags & IFA_ROUTE) {
332 			ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr;
333 			rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
334 			ia->ia_ifa.ifa_dstaddr =
335 					(struct sockaddr *)&ia->ia_dstaddr;
336 			rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
337 		}
338 		break;
339 
340 	case SIOCSIFBRDADDR:
341 		if ((ifp->if_flags & IFF_BROADCAST) == 0)
342 			return (EINVAL);
343 		ia->ia_broadaddr = *(struct sockaddr_in *)&ifr->ifr_broadaddr;
344 		break;
345 
346 	case SIOCSIFADDR:
347 		return (in_ifinit(ifp, ia,
348 		    (struct sockaddr_in *) &ifr->ifr_addr, 1));
349 
350 	case SIOCSIFNETMASK:
351 		i = ifra->ifra_addr.sin_addr.s_addr;
352 		ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i);
353 		break;
354 
355 	case SIOCAIFADDR:
356 		maskIsNew = 0;
357 		hostIsNew = 1;
358 		error = 0;
359 		if (ia->ia_addr.sin_family == AF_INET) {
360 			if (ifra->ifra_addr.sin_len == 0) {
361 				ifra->ifra_addr = ia->ia_addr;
362 				hostIsNew = 0;
363 			} else if (ifra->ifra_addr.sin_addr.s_addr ==
364 					       ia->ia_addr.sin_addr.s_addr)
365 				hostIsNew = 0;
366 		}
367 		if (ifra->ifra_mask.sin_len) {
368 			in_ifscrub(ifp, ia);
369 			ia->ia_sockmask = ifra->ifra_mask;
370 			ia->ia_subnetmask =
371 			     ntohl(ia->ia_sockmask.sin_addr.s_addr);
372 			maskIsNew = 1;
373 		}
374 		if ((ifp->if_flags & IFF_POINTOPOINT) &&
375 		    (ifra->ifra_dstaddr.sin_family == AF_INET)) {
376 			in_ifscrub(ifp, ia);
377 			ia->ia_dstaddr = ifra->ifra_dstaddr;
378 			maskIsNew  = 1; /* We lie; but the effect's the same */
379 		}
380 		if (ifra->ifra_addr.sin_family == AF_INET &&
381 		    (hostIsNew || maskIsNew))
382 			error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);
383 		if ((ifp->if_flags & IFF_BROADCAST) &&
384 		    (ifra->ifra_broadaddr.sin_family == AF_INET))
385 			ia->ia_broadaddr = ifra->ifra_broadaddr;
386 		return (error);
387 
388 	case SIOCDIFADDR:
389 		in_ifscrub(ifp, ia);
390 		if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia)
391 			ifp->if_addrlist = ifa->ifa_next;
392 		else {
393 			while (ifa->ifa_next &&
394 			       (ifa->ifa_next != (struct ifaddr *)ia))
395 				    ifa = ifa->ifa_next;
396 			if (ifa->ifa_next)
397 				ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next;
398 			else
399 				printf("Couldn't unlink inifaddr from ifp\n");
400 		}
401 		oia = ia;
402 		if (oia == (ia = in_ifaddr))
403 			in_ifaddr = ia->ia_next;
404 		else {
405 			while (ia->ia_next && (ia->ia_next != oia))
406 				ia = ia->ia_next;
407 			if (ia->ia_next)
408 				ia->ia_next = oia->ia_next;
409 			else
410 				printf("Didn't unlink inifadr from list\n");
411 		}
412 		IFAFREE((&oia->ia_ifa));
413 		break;
414 
415 	default:
416 		if (ifp == 0 || ifp->if_ioctl == 0)
417 			return (EOPNOTSUPP);
418 		return ((*ifp->if_ioctl)(ifp, cmd, data));
419 	}
420 	return (0);
421 }
422 
423 /*
424  * Delete any existing route for an interface.
425  */
426 in_ifscrub(ifp, ia)
427 	register struct ifnet *ifp;
428 	register struct in_ifaddr *ia;
429 {
430 
431 	if ((ia->ia_flags & IFA_ROUTE) == 0)
432 		return;
433 	if (ifp->if_flags & (IFF_LOOPBACK|IFF_POINTOPOINT))
434 		rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
435 	else
436 		rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);
437 	ia->ia_flags &= ~IFA_ROUTE;
438 }
439 
440 /*
441  * Initialize an interface's internet address
442  * and routing table entry.
443  */
444 in_ifinit(ifp, ia, sin, scrub)
445 	register struct ifnet *ifp;
446 	register struct in_ifaddr *ia;
447 	struct sockaddr_in *sin;
448 	int scrub;
449 {
450 	register u_long i = ntohl(sin->sin_addr.s_addr);
451 	struct sockaddr_in oldaddr;
452 	int s = splimp(), flags = RTF_UP, error, ether_output();
453 	void arp_rtrequest();
454 
455 	oldaddr = ia->ia_addr;
456 	ia->ia_addr = *sin;
457 	/*
458 	 * Give the interface a chance to initialize
459 	 * if this is its first address,
460 	 * and to validate the address if necessary.
461 	 */
462 	if (ifp->if_ioctl &&
463 	    (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia))) {
464 		splx(s);
465 		ia->ia_addr = oldaddr;
466 		return (error);
467 	}
468 	if (ifp->if_output == ether_output) { /* XXX: Another Kludge */
469 		ia->ia_ifa.ifa_rtrequest = arp_rtrequest;
470 		ia->ia_ifa.ifa_flags |= RTF_CLONING;
471 	}
472 	splx(s);
473 	if (scrub) {
474 		ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
475 		in_ifscrub(ifp, ia);
476 		ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
477 	}
478 	if (IN_CLASSA(i))
479 		ia->ia_netmask = IN_CLASSA_NET;
480 	else if (IN_CLASSB(i))
481 		ia->ia_netmask = IN_CLASSB_NET;
482 	else
483 		ia->ia_netmask = IN_CLASSC_NET;
484 	ia->ia_net = i & ia->ia_netmask;
485 	/*
486 	 * The subnet mask includes at least the standard network part,
487 	 * but may already have been set to a larger value.
488 	 */
489 	ia->ia_subnetmask |= ia->ia_netmask;
490 	ia->ia_subnet = i & ia->ia_subnetmask;
491 	ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
492 	in_socktrim(&ia->ia_sockmask);
493 	/*
494 	 * Add route for the network.
495 	 */
496 	ia->ia_ifa.ifa_metric = ifp->if_metric;
497 	if (ifp->if_flags & IFF_BROADCAST) {
498 		ia->ia_broadaddr.sin_addr.s_addr =
499 			htonl(ia->ia_subnet | ~ia->ia_subnetmask);
500 		ia->ia_netbroadcast.s_addr =
501 			htonl(ia->ia_net | ~ ia->ia_netmask);
502 	} else if (ifp->if_flags & IFF_LOOPBACK) {
503 		ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr;
504 		flags |= RTF_HOST;
505 	} else if (ifp->if_flags & IFF_POINTOPOINT) {
506 		if (ia->ia_dstaddr.sin_family != AF_INET)
507 			return (0);
508 		flags |= RTF_HOST;
509 	}
510 	if ((error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, flags)) == 0)
511 		ia->ia_flags |= IFA_ROUTE;
512 	/*
513 	 * If the interface supports multicast, join the "all hosts"
514 	 * multicast group on that interface.
515 	 */
516 	if (ifp->if_flags & IFF_MULTICAST) {
517 		struct in_addr addr;
518 
519 		addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP);
520 		in_addmulti(&addr, ifp);
521 	}
522 	return (error);
523 }
524 
525 
526 /*
527  * Return 1 if the address might be a local broadcast address.
528  */
529 in_broadcast(in, ifp)
530 	struct in_addr in;
531         struct ifnet *ifp;
532 {
533 	register struct ifaddr *ifa;
534 	u_long t;
535 
536 	if (in.s_addr == INADDR_BROADCAST ||
537 	    in.s_addr == INADDR_ANY)
538 		return 1;
539 	if ((ifp->if_flags & IFF_BROADCAST) == 0)
540 		return 0;
541 	t = ntohl(in.s_addr);
542 	/*
543 	 * Look through the list of addresses for a match
544 	 * with a broadcast address.
545 	 */
546 #define ia ((struct in_ifaddr *)ifa)
547 	for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next)
548 		if (ifa->ifa_addr->sa_family == AF_INET &&
549 		    (in.s_addr == ia->ia_broadaddr.sin_addr.s_addr ||
550 		     in.s_addr == ia->ia_netbroadcast.s_addr ||
551 		     /*
552 		      * Check for old-style (host 0) broadcast.
553 		      */
554 		     t == ia->ia_subnet || t == ia->ia_net))
555 			    return 1;
556 	return 0;
557 #undef ia
558 }
559 /*
560  * Add an address to the list of IP multicast addresses for a given interface.
561  */
562 struct in_multi *
563 in_addmulti(ap, ifp)
564 	register struct in_addr *ap;
565 	register struct ifnet *ifp;
566 {
567 	register struct in_multi *inm;
568 	struct ifreq ifr;
569 	struct in_ifaddr *ia;
570 	int s = splnet();
571 
572 	/*
573 	 * See if address already in list.
574 	 */
575 	IN_LOOKUP_MULTI(*ap, ifp, inm);
576 	if (inm != NULL) {
577 		/*
578 		 * Found it; just increment the reference count.
579 		 */
580 		++inm->inm_refcount;
581 	}
582 	else {
583 		/*
584 		 * New address; allocate a new multicast record
585 		 * and link it into the interface's multicast list.
586 		 */
587 		inm = (struct in_multi *)malloc(sizeof(*inm),
588 		    M_IPMADDR, M_NOWAIT);
589 		if (inm == NULL) {
590 			splx(s);
591 			return (NULL);
592 		}
593 		inm->inm_addr = *ap;
594 		inm->inm_ifp = ifp;
595 		inm->inm_refcount = 1;
596 		IFP_TO_IA(ifp, ia);
597 		if (ia == NULL) {
598 			free(inm, M_IPMADDR);
599 			splx(s);
600 			return (NULL);
601 		}
602 		inm->inm_ia = ia;
603 		inm->inm_next = ia->ia_multiaddrs;
604 		ia->ia_multiaddrs = inm;
605 		/*
606 		 * Ask the network driver to update its multicast reception
607 		 * filter appropriately for the new address.
608 		 */
609 		((struct sockaddr_in *)&ifr.ifr_addr)->sin_family = AF_INET;
610 		((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr = *ap;
611 		if ((ifp->if_ioctl == NULL) ||
612 		    (*ifp->if_ioctl)(ifp, SIOCADDMULTI,(caddr_t)&ifr) != 0) {
613 			ia->ia_multiaddrs = inm->inm_next;
614 			free(inm, M_IPMADDR);
615 			splx(s);
616 			return (NULL);
617 		}
618 		/*
619 		 * Let IGMP know that we have joined a new IP multicast group.
620 		 */
621 		igmp_joingroup(inm);
622 	}
623 	splx(s);
624 	return (inm);
625 }
626 
627 /*
628  * Delete a multicast address record.
629  */
630 int
631 in_delmulti(inm)
632 	register struct in_multi *inm;
633 {
634 	register struct in_multi **p;
635 	struct ifreq ifr;
636 	int s = splnet();
637 
638 	if (--inm->inm_refcount == 0) {
639 		/*
640 		 * No remaining claims to this record; let IGMP know that
641 		 * we are leaving the multicast group.
642 		 */
643 		igmp_leavegroup(inm);
644 		/*
645 		 * Unlink from list.
646 		 */
647 		for (p = &inm->inm_ia->ia_multiaddrs;
648 		     *p != inm;
649 		     p = &(*p)->inm_next)
650 			 continue;
651 		*p = (*p)->inm_next;
652 		/*
653 		 * Notify the network driver to update its multicast reception
654 		 * filter.
655 		 */
656 		((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET;
657 		((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr =
658 								inm->inm_addr;
659 		(*inm->inm_ifp->if_ioctl)(inm->inm_ifp, SIOCDELMULTI,
660 							     (caddr_t)&ifr);
661 		free(inm, M_IPMADDR);
662 	}
663 	splx(s);
664 }
665 #endif
666