Deleted Added
full compact
ip_mroute.c (38373) ip_mroute.c (38482)
1/*
2 * IP multicast forwarding procedures
3 *
4 * Written by David Waitzman, BBN Labs, August 1988.
5 * Modified by Steve Deering, Stanford, February 1989.
6 * Modified by Mark J. Steiglitz, Stanford, May, 1991
7 * Modified by Van Jacobson, LBL, January 1993
8 * Modified by Ajit Thyagarajan, PARC, August 1993
9 * Modified by Bill Fenner, PARC, April 1995
10 *
11 * MROUTING Revision: 3.5
1/*
2 * IP multicast forwarding procedures
3 *
4 * Written by David Waitzman, BBN Labs, August 1988.
5 * Modified by Steve Deering, Stanford, February 1989.
6 * Modified by Mark J. Steiglitz, Stanford, May, 1991
7 * Modified by Van Jacobson, LBL, January 1993
8 * Modified by Ajit Thyagarajan, PARC, August 1993
9 * Modified by Bill Fenner, PARC, April 1995
10 *
11 * MROUTING Revision: 3.5
12 * $Id: ip_mroute.c,v 1.47 1998/06/30 10:56:31 phk Exp $
12 * $Id: ip_mroute.c,v 1.48 1998/08/17 01:05:24 bde Exp $
13 */
14
15#include "opt_mrouting.h"
16
17#include <sys/param.h>
18#include <sys/systm.h>
19#include <sys/mbuf.h>
20#include <sys/socket.h>

--- 28 unchanged lines hidden (view full) ---

49#endif
50#endif
51
52#ifndef MROUTING
53extern u_long _ip_mcast_src __P((int vifi));
54extern int _ip_mforward __P((struct ip *ip, struct ifnet *ifp,
55 struct mbuf *m, struct ip_moptions *imo));
56extern int _ip_mrouter_done __P((void));
13 */
14
15#include "opt_mrouting.h"
16
17#include <sys/param.h>
18#include <sys/systm.h>
19#include <sys/mbuf.h>
20#include <sys/socket.h>

--- 28 unchanged lines hidden (view full) ---

49#endif
50#endif
51
52#ifndef MROUTING
53extern u_long _ip_mcast_src __P((int vifi));
54extern int _ip_mforward __P((struct ip *ip, struct ifnet *ifp,
55 struct mbuf *m, struct ip_moptions *imo));
56extern int _ip_mrouter_done __P((void));
57extern int _ip_mrouter_get __P((int cmd, struct socket *so,
58 struct mbuf **m));
59extern int _ip_mrouter_set __P((int cmd, struct socket *so,
60 struct mbuf *m));
57extern int _ip_mrouter_get __P((struct socket *so, struct sockopt *sopt));
58extern int _ip_mrouter_set __P((struct socket *so, struct sockopt *sopt));
61extern int _mrt_ioctl __P((int req, caddr_t data, struct proc *p));
62
63/*
64 * Dummy routines and globals used when multicast routing is not compiled in.
65 */
66
67struct socket *ip_mrouter = NULL;
68static u_int ip_mrtproto = 0;
69static struct mrtstat mrtstat;
70u_int rsvpdebug = 0;
71
72int
59extern int _mrt_ioctl __P((int req, caddr_t data, struct proc *p));
60
61/*
62 * Dummy routines and globals used when multicast routing is not compiled in.
63 */
64
65struct socket *ip_mrouter = NULL;
66static u_int ip_mrtproto = 0;
67static struct mrtstat mrtstat;
68u_int rsvpdebug = 0;
69
70int
73_ip_mrouter_set(cmd, so, m)
74 int cmd;
71_ip_mrouter_set(so, sopt)
75 struct socket *so;
72 struct socket *so;
76 struct mbuf *m;
73 struct sockopt *sopt;
77{
78 return(EOPNOTSUPP);
79}
80
74{
75 return(EOPNOTSUPP);
76}
77
81int (*ip_mrouter_set)(int, struct socket *, struct mbuf *) = _ip_mrouter_set;
78int (*ip_mrouter_set)(struct socket *, struct sockopt *) = _ip_mrouter_set;
82
83
84int
79
80
81int
85_ip_mrouter_get(cmd, so, m)
86 int cmd;
82_ip_mrouter_get(so, sopt)
87 struct socket *so;
83 struct socket *so;
88 struct mbuf **m;
84 struct sockopt *sopt;
89{
90 return(EOPNOTSUPP);
91}
92
85{
86 return(EOPNOTSUPP);
87}
88
93int (*ip_mrouter_get)(int, struct socket *, struct mbuf **) = _ip_mrouter_get;
89int (*ip_mrouter_get)(struct socket *, struct sockopt *) = _ip_mrouter_get;
94
95int
96_ip_mrouter_done()
97{
98 return(0);
99}
100
101int (*ip_mrouter_done)(void) = _ip_mrouter_done;

--- 54 unchanged lines hidden (view full) ---

156 * just in case it does get called, the code a little lower in ip_output
157 * will assign the packet a local address.
158 */
159u_long
160_ip_mcast_src(int vifi) { return INADDR_ANY; }
161u_long (*ip_mcast_src)(int) = _ip_mcast_src;
162
163int
90
91int
92_ip_mrouter_done()
93{
94 return(0);
95}
96
97int (*ip_mrouter_done)(void) = _ip_mrouter_done;

--- 54 unchanged lines hidden (view full) ---

152 * just in case it does get called, the code a little lower in ip_output
153 * will assign the packet a local address.
154 */
155u_long
156_ip_mcast_src(int vifi) { return INADDR_ANY; }
157u_long (*ip_mcast_src)(int) = _ip_mcast_src;
158
159int
164ip_rsvp_vif_init(so, m)
160ip_rsvp_vif_init(so, sopt)
165 struct socket *so;
161 struct socket *so;
166 struct mbuf *m;
162 struct sockopt *sopt;
167{
168 return(EINVAL);
169}
170
171int
163{
164 return(EINVAL);
165}
166
167int
172ip_rsvp_vif_done(so, m)
168ip_rsvp_vif_done(so, sopt)
173 struct socket *so;
169 struct socket *so;
174 struct mbuf *m;
170 struct sockopt *sopt;
175{
176 return(EINVAL);
177}
178
179void
180ip_rsvp_force_done(so)
181 struct socket *so;
182{

--- 91 unchanged lines hidden (view full) ---

274 * given a datagram's src ip address.
275 */
276static u_long last_encap_src;
277static struct vif *last_encap_vif;
278
279static u_long X_ip_mcast_src __P((int vifi));
280static int X_ip_mforward __P((struct ip *ip, struct ifnet *ifp, struct mbuf *m, struct ip_moptions *imo));
281static int X_ip_mrouter_done __P((void));
171{
172 return(EINVAL);
173}
174
175void
176ip_rsvp_force_done(so)
177 struct socket *so;
178{

--- 91 unchanged lines hidden (view full) ---

270 * given a datagram's src ip address.
271 */
272static u_long last_encap_src;
273static struct vif *last_encap_vif;
274
275static u_long X_ip_mcast_src __P((int vifi));
276static int X_ip_mforward __P((struct ip *ip, struct ifnet *ifp, struct mbuf *m, struct ip_moptions *imo));
277static int X_ip_mrouter_done __P((void));
282static int X_ip_mrouter_get __P((int cmd, struct socket *so, struct mbuf **m));
283static int X_ip_mrouter_set __P((int cmd, struct socket *so, struct mbuf *m));
278static int X_ip_mrouter_get __P((struct socket *so, struct sockopt *m));
279static int X_ip_mrouter_set __P((struct socket *so, struct sockopt *m));
284static int X_legal_vif_num __P((int vif));
285static int X_mrt_ioctl __P((int cmd, caddr_t data));
286
287static int get_sg_cnt(struct sioc_sg_req *);
288static int get_vif_cnt(struct sioc_vif_req *);
280static int X_legal_vif_num __P((int vif));
281static int X_mrt_ioctl __P((int cmd, caddr_t data));
282
283static int get_sg_cnt(struct sioc_sg_req *);
284static int get_vif_cnt(struct sioc_vif_req *);
289static int ip_mrouter_init(struct socket *, struct mbuf *);
285static int ip_mrouter_init(struct socket *, int);
290static int add_vif(struct vifctl *);
286static int add_vif(struct vifctl *);
291static int del_vif(vifi_t *);
287static int del_vif(vifi_t);
292static int add_mfc(struct mfcctl *);
293static int del_mfc(struct mfcctl *);
294static int socket_send(struct socket *, struct mbuf *, struct sockaddr_in *);
288static int add_mfc(struct mfcctl *);
289static int del_mfc(struct mfcctl *);
290static int socket_send(struct socket *, struct mbuf *, struct sockaddr_in *);
295static int get_version(struct mbuf *);
296static int get_assert(struct mbuf *);
297static int set_assert(int *);
291static int set_assert(int);
298static void expire_upcalls(void *);
299static int ip_mdq(struct mbuf *, struct ifnet *, struct mfc *,
300 vifi_t);
301static void phyint_send(struct ip *, struct vif *, struct mbuf *);
302static void encap_send(struct ip *, struct vif *, struct mbuf *);
303static void tbf_control(struct vif *, struct mbuf *, struct ip *, u_long);
304static void tbf_queue(struct vif *, struct mbuf *);
305static void tbf_process_q(struct vif *);

--- 75 unchanged lines hidden (view full) ---

381static void collate(struct timeval *);
382#endif /* UPCALL_TIMING */
383
384
385/*
386 * Handle MRT setsockopt commands to modify the multicast routing tables.
387 */
388static int
292static void expire_upcalls(void *);
293static int ip_mdq(struct mbuf *, struct ifnet *, struct mfc *,
294 vifi_t);
295static void phyint_send(struct ip *, struct vif *, struct mbuf *);
296static void encap_send(struct ip *, struct vif *, struct mbuf *);
297static void tbf_control(struct vif *, struct mbuf *, struct ip *, u_long);
298static void tbf_queue(struct vif *, struct mbuf *);
299static void tbf_process_q(struct vif *);

--- 75 unchanged lines hidden (view full) ---

375static void collate(struct timeval *);
376#endif /* UPCALL_TIMING */
377
378
379/*
380 * Handle MRT setsockopt commands to modify the multicast routing tables.
381 */
382static int
389X_ip_mrouter_set(cmd, so, m)
390 int cmd;
391 struct socket *so;
392 struct mbuf *m;
383X_ip_mrouter_set(so, sopt)
384 struct socket *so;
385 struct sockopt *sopt;
393{
386{
394 if (cmd != MRT_INIT && so != ip_mrouter) return EACCES;
387 int error, optval;
388 vifi_t vifi;
389 struct vifctl vifc;
390 struct mfcctl mfc;
395
391
396 switch (cmd) {
397 case MRT_INIT: return ip_mrouter_init(so, m);
398 case MRT_DONE: return ip_mrouter_done();
399 case MRT_ADD_VIF: return add_vif (mtod(m, struct vifctl *));
400 case MRT_DEL_VIF: return del_vif (mtod(m, vifi_t *));
401 case MRT_ADD_MFC: return add_mfc (mtod(m, struct mfcctl *));
402 case MRT_DEL_MFC: return del_mfc (mtod(m, struct mfcctl *));
403 case MRT_ASSERT: return set_assert(mtod(m, int *));
404 default: return EOPNOTSUPP;
405 }
392 if (so != ip_mrouter && sopt->sopt_name != MRT_INIT)
393 return (EPERM);
394
395 error = 0;
396 switch (sopt->sopt_name) {
397 case MRT_INIT:
398 error = sooptcopyin(sopt, &optval, sizeof optval,
399 sizeof optval);
400 if (error)
401 break;
402 error = ip_mrouter_init(so, optval);
403 break;
404
405 case MRT_DONE:
406 error = ip_mrouter_done();
407 break;
408
409 case MRT_ADD_VIF:
410 error = sooptcopyin(sopt, &vifc, sizeof vifc, sizeof vifc);
411 if (error)
412 break;
413 error = add_vif(&vifc);
414 break;
415
416 case MRT_DEL_VIF:
417 error = sooptcopyin(sopt, &vifi, sizeof vifi, sizeof vifi);
418 if (error)
419 break;
420 error = del_vif(vifi);
421 break;
422
423 case MRT_ADD_MFC:
424 case MRT_DEL_MFC:
425 error = sooptcopyin(sopt, &mfc, sizeof mfc, sizeof mfc);
426 if (error)
427 break;
428 if (sopt->sopt_name == MRT_ADD_MFC)
429 error = add_mfc(&mfc);
430 else
431 error = del_mfc(&mfc);
432
433 case MRT_ASSERT:
434 error = sooptcopyin(sopt, &optval, sizeof optval,
435 sizeof optval);
436 if (error)
437 break;
438 set_assert(optval);
439
440 default:
441 error = EOPNOTSUPP;
442 break;
443 }
444 return (error);
406}
407
408#ifndef MROUTE_LKM
445}
446
447#ifndef MROUTE_LKM
409int (*ip_mrouter_set)(int, struct socket *, struct mbuf *) = X_ip_mrouter_set;
448int (*ip_mrouter_set)(struct socket *, struct sockopt *) = X_ip_mrouter_set;
410#endif
411
412/*
413 * Handle MRT getsockopt commands
414 */
415static int
449#endif
450
451/*
452 * Handle MRT getsockopt commands
453 */
454static int
416X_ip_mrouter_get(cmd, so, m)
417 int cmd;
418 struct socket *so;
419 struct mbuf **m;
455X_ip_mrouter_get(so, sopt)
456 struct socket *so;
457 struct sockopt *sopt;
420{
458{
421 struct mbuf *mb;
459 int error;
460 static int version = 0x0305; /* !!! why is this here? XXX */
422
461
423 if (so != ip_mrouter) return EACCES;
462 switch (sopt->sopt_name) {
463 case MRT_VERSION:
464 error = sooptcopyout(sopt, &version, sizeof version);
465 break;
424
466
425 *m = mb = m_get(M_WAIT, MT_SOOPTS);
426
427 switch (cmd) {
428 case MRT_VERSION: return get_version(mb);
429 case MRT_ASSERT: return get_assert(mb);
430 default: return EOPNOTSUPP;
431 }
467 case MRT_ASSERT:
468 error = sooptcopyout(sopt, &pim_assert, sizeof pim_assert);
469 break;
470 default:
471 error = EOPNOTSUPP;
472 break;
473 }
474 return (error);
432}
433
434#ifndef MROUTE_LKM
475}
476
477#ifndef MROUTE_LKM
435int (*ip_mrouter_get)(int, struct socket *, struct mbuf **) = X_ip_mrouter_get;
478int (*ip_mrouter_get)(struct socket *, struct sockopt *) = X_ip_mrouter_get;
436#endif
437
438/*
439 * Handle ioctl commands to obtain information from the cache
440 */
441static int
442X_mrt_ioctl(cmd, data)
443 int cmd;

--- 60 unchanged lines hidden (view full) ---

504
505 return 0;
506}
507
508/*
509 * Enable multicast routing
510 */
511static int
479#endif
480
481/*
482 * Handle ioctl commands to obtain information from the cache
483 */
484static int
485X_mrt_ioctl(cmd, data)
486 int cmd;

--- 60 unchanged lines hidden (view full) ---

547
548 return 0;
549}
550
551/*
552 * Enable multicast routing
553 */
554static int
512ip_mrouter_init(so, m)
555ip_mrouter_init(so, version)
513 struct socket *so;
556 struct socket *so;
514 struct mbuf *m;
557 int version;
515{
516 int *v;
517
518 if (mrtdebug)
519 log(LOG_DEBUG,"ip_mrouter_init: so_type = %d, pr_protocol = %d\n",
520 so->so_type, so->so_proto->pr_protocol);
521
522 if (so->so_type != SOCK_RAW ||
523 so->so_proto->pr_protocol != IPPROTO_IGMP) return EOPNOTSUPP;
524
558{
559 int *v;
560
561 if (mrtdebug)
562 log(LOG_DEBUG,"ip_mrouter_init: so_type = %d, pr_protocol = %d\n",
563 so->so_type, so->so_proto->pr_protocol);
564
565 if (so->so_type != SOCK_RAW ||
566 so->so_proto->pr_protocol != IPPROTO_IGMP) return EOPNOTSUPP;
567
525 if (!m || (m->m_len != sizeof(int *)))
568 if (version != 1)
526 return ENOPROTOOPT;
527
569 return ENOPROTOOPT;
570
528 v = mtod(m, int *);
529 if (*v != 1)
530 return ENOPROTOOPT;
531
532 if (ip_mrouter != NULL) return EADDRINUSE;
533
534 ip_mrouter = so;
535
536 bzero((caddr_t)mfctable, sizeof(mfctable));
537 bzero((caddr_t)nexpire, sizeof(nexpire));
538
539 pim_assert = 0;

--- 81 unchanged lines hidden (view full) ---

621
622 return 0;
623}
624
625#ifndef MROUTE_LKM
626int (*ip_mrouter_done)(void) = X_ip_mrouter_done;
627#endif
628
571 if (ip_mrouter != NULL) return EADDRINUSE;
572
573 ip_mrouter = so;
574
575 bzero((caddr_t)mfctable, sizeof(mfctable));
576 bzero((caddr_t)nexpire, sizeof(nexpire));
577
578 pim_assert = 0;

--- 81 unchanged lines hidden (view full) ---

660
661 return 0;
662}
663
664#ifndef MROUTE_LKM
665int (*ip_mrouter_done)(void) = X_ip_mrouter_done;
666#endif
667
629static int
630get_version(mb)
631 struct mbuf *mb;
632{
633 int *v;
634
635 v = mtod(mb, int *);
636
637 *v = 0x0305; /* XXX !!!! */
638 mb->m_len = sizeof(int);
639
640 return 0;
641}
642
643/*
644 * Set PIM assert processing global
645 */
646static int
647set_assert(i)
668/*
669 * Set PIM assert processing global
670 */
671static int
672set_assert(i)
648 int *i;
673 int i;
649{
674{
650 if ((*i != 1) && (*i != 0))
675 if ((i != 1) && (i != 0))
651 return EINVAL;
652
676 return EINVAL;
677
653 pim_assert = *i;
678 pim_assert = i;
654
655 return 0;
656}
657
658/*
679
680 return 0;
681}
682
683/*
659 * Get PIM assert processing global
660 */
661static int
662get_assert(m)
663 struct mbuf *m;
664{
665 int *i;
666
667 i = mtod(m, int *);
668
669 *i = pim_assert;
670
671 return 0;
672}
673
674/*
675 * Add a vif to the vif table
676 */
677static int
678add_vif(vifcp)
679 register struct vifctl *vifcp;
680{
681 register struct vif *vifp = viftable + vifcp->vifc_vifi;
682 static struct sockaddr_in sin = {sizeof sin, AF_INET};

--- 89 unchanged lines hidden (view full) ---

772
773 return 0;
774}
775
776/*
777 * Delete a vif from the vif table
778 */
779static int
684 * Add a vif to the vif table
685 */
686static int
687add_vif(vifcp)
688 register struct vifctl *vifcp;
689{
690 register struct vif *vifp = viftable + vifcp->vifc_vifi;
691 static struct sockaddr_in sin = {sizeof sin, AF_INET};

--- 89 unchanged lines hidden (view full) ---

781
782 return 0;
783}
784
785/*
786 * Delete a vif from the vif table
787 */
788static int
780del_vif(vifip)
781 vifi_t *vifip;
789del_vif(vifi)
790 vifi_t vifi;
782{
791{
783 register struct vif *vifp = viftable + *vifip;
784 register vifi_t vifi;
792 register struct vif *vifp = &viftable[vifi];
785 register struct mbuf *m;
786 struct ifnet *ifp;
787 struct ifreq ifr;
788 int s;
789
793 register struct mbuf *m;
794 struct ifnet *ifp;
795 struct ifreq ifr;
796 int s;
797
790 if (*vifip >= numvifs) return EINVAL;
798 if (vifi >= numvifs) return EINVAL;
791 if (vifp->v_lcl_addr.s_addr == 0) return EADDRNOTAVAIL;
792
793 s = splnet();
794
795 if (!(vifp->v_flags & VIFF_TUNNEL)) {
796 ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET;
797 ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr.s_addr = INADDR_ANY;
798 ifp = vifp->v_ifp;

--- 12 unchanged lines hidden (view full) ---

811 m = vifp->v_tbf->tbf_q;
812 vifp->v_tbf->tbf_q = m->m_act;
813 m_freem(m);
814 }
815
816 bzero((caddr_t)vifp->v_tbf, sizeof(*(vifp->v_tbf)));
817 bzero((caddr_t)vifp, sizeof (*vifp));
818
799 if (vifp->v_lcl_addr.s_addr == 0) return EADDRNOTAVAIL;
800
801 s = splnet();
802
803 if (!(vifp->v_flags & VIFF_TUNNEL)) {
804 ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET;
805 ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr.s_addr = INADDR_ANY;
806 ifp = vifp->v_ifp;

--- 12 unchanged lines hidden (view full) ---

819 m = vifp->v_tbf->tbf_q;
820 vifp->v_tbf->tbf_q = m->m_act;
821 m_freem(m);
822 }
823
824 bzero((caddr_t)vifp->v_tbf, sizeof(*(vifp->v_tbf)));
825 bzero((caddr_t)vifp, sizeof (*vifp));
826
827 if (mrtdebug)
828 log(LOG_DEBUG, "del_vif %d, numvifs %d\n", vifi, numvifs);
829
819 /* Adjust numvifs down */
820 for (vifi = numvifs; vifi > 0; vifi--)
821 if (viftable[vifi-1].v_lcl_addr.s_addr != 0) break;
822 numvifs = vifi;
823
824 splx(s);
825
830 /* Adjust numvifs down */
831 for (vifi = numvifs; vifi > 0; vifi--)
832 if (viftable[vifi-1].v_lcl_addr.s_addr != 0) break;
833 numvifs = vifi;
834
835 splx(s);
836
826 if (mrtdebug)
827 log(LOG_DEBUG, "del_vif %d, numvifs %d\n", *vifip, numvifs);
828
829 return 0;
830}
831
832/*
833 * Add an mfc entry
834 */
835static int
836add_mfc(mfccp)

--- 1167 unchanged lines hidden (view full) ---

2004 return prio;
2005}
2006
2007/*
2008 * End of token bucket filter modifications
2009 */
2010
2011int
837 return 0;
838}
839
840/*
841 * Add an mfc entry
842 */
843static int
844add_mfc(mfccp)

--- 1167 unchanged lines hidden (view full) ---

2012 return prio;
2013}
2014
2015/*
2016 * End of token bucket filter modifications
2017 */
2018
2019int
2012ip_rsvp_vif_init(so, m)
2013 struct socket *so;
2014 struct mbuf *m;
2020ip_rsvp_vif_init(so, sopt)
2021 struct socket *so;
2022 struct sockopt *sopt;
2015{
2023{
2016 int i;
2017 register int s;
2024 int error, i, s;
2018
2019 if (rsvpdebug)
2020 printf("ip_rsvp_vif_init: so_type = %d, pr_protocol = %d\n",
2021 so->so_type, so->so_proto->pr_protocol);
2022
2023 if (so->so_type != SOCK_RAW || so->so_proto->pr_protocol != IPPROTO_RSVP)
2024 return EOPNOTSUPP;
2025
2026 /* Check mbuf. */
2025
2026 if (rsvpdebug)
2027 printf("ip_rsvp_vif_init: so_type = %d, pr_protocol = %d\n",
2028 so->so_type, so->so_proto->pr_protocol);
2029
2030 if (so->so_type != SOCK_RAW || so->so_proto->pr_protocol != IPPROTO_RSVP)
2031 return EOPNOTSUPP;
2032
2033 /* Check mbuf. */
2027 if (m == NULL || m->m_len != sizeof(int)) {
2028 return EINVAL;
2029 }
2030 i = *(mtod(m, int *));
2034 error = sooptcopyin(sopt, &i, sizeof i, sizeof i);
2035 if (error)
2036 return (error);
2031
2032 if (rsvpdebug)
2037
2038 if (rsvpdebug)
2033 printf("ip_rsvp_vif_init: vif = %d rsvp_on = %d\n",i,rsvp_on);
2039 printf("ip_rsvp_vif_init: vif = %d rsvp_on = %d\n", i, rsvp_on);
2034
2035 s = splnet();
2036
2037 /* Check vif. */
2038 if (!legal_vif_num(i)) {
2039 splx(s);
2040 return EADDRNOTAVAIL;
2041 }

--- 13 unchanged lines hidden (view full) ---

2055 rsvp_on++;
2056 }
2057
2058 splx(s);
2059 return 0;
2060}
2061
2062int
2040
2041 s = splnet();
2042
2043 /* Check vif. */
2044 if (!legal_vif_num(i)) {
2045 splx(s);
2046 return EADDRNOTAVAIL;
2047 }

--- 13 unchanged lines hidden (view full) ---

2061 rsvp_on++;
2062 }
2063
2064 splx(s);
2065 return 0;
2066}
2067
2068int
2063ip_rsvp_vif_done(so, m)
2064 struct socket *so;
2065 struct mbuf *m;
2069ip_rsvp_vif_done(so, sopt)
2070 struct socket *so;
2071 struct sockopt *sopt;
2066{
2072{
2067 int i;
2068 register int s;
2073 int error, i, s;
2069
2074
2070 if (rsvpdebug)
2071 printf("ip_rsvp_vif_done: so_type = %d, pr_protocol = %d\n",
2072 so->so_type, so->so_proto->pr_protocol);
2075 if (rsvpdebug)
2076 printf("ip_rsvp_vif_done: so_type = %d, pr_protocol = %d\n",
2077 so->so_type, so->so_proto->pr_protocol);
2073
2078
2074 if (so->so_type != SOCK_RAW || so->so_proto->pr_protocol != IPPROTO_RSVP)
2075 return EOPNOTSUPP;
2079 if (so->so_type != SOCK_RAW ||
2080 so->so_proto->pr_protocol != IPPROTO_RSVP)
2081 return EOPNOTSUPP;
2076
2082
2077 /* Check mbuf. */
2078 if (m == NULL || m->m_len != sizeof(int)) {
2079 return EINVAL;
2080 }
2081 i = *(mtod(m, int *));
2083 error = sooptcopyin(sopt, &i, sizeof i, sizeof i);
2084 if (error)
2085 return (error);
2082
2086
2083 s = splnet();
2087 s = splnet();
2084
2088
2085 /* Check vif. */
2086 if (!legal_vif_num(i)) {
2087 splx(s);
2088 return EADDRNOTAVAIL;
2089 }
2089 /* Check vif. */
2090 if (!legal_vif_num(i)) {
2091 splx(s);
2092 return EADDRNOTAVAIL;
2093 }
2090
2094
2091 if (rsvpdebug)
2092 printf("ip_rsvp_vif_done: v_rsvpd = %p so = %p\n",
2093 viftable[i].v_rsvpd, so);
2095 if (rsvpdebug)
2096 printf("ip_rsvp_vif_done: v_rsvpd = %p so = %p\n",
2097 viftable[i].v_rsvpd, so);
2094
2098
2095 viftable[i].v_rsvpd = NULL;
2096 /* This may seem silly, but we need to be sure we don't over-decrement
2097 * the RSVP counter, in case something slips up.
2098 */
2099 if (viftable[i].v_rsvp_on) {
2100 viftable[i].v_rsvp_on = 0;
2101 rsvp_on--;
2102 }
2099 viftable[i].v_rsvpd = NULL;
2100 /*
2101 * This may seem silly, but we need to be sure we don't over-decrement
2102 * the RSVP counter, in case something slips up.
2103 */
2104 if (viftable[i].v_rsvp_on) {
2105 viftable[i].v_rsvp_on = 0;
2106 rsvp_on--;
2107 }
2103
2108
2104 splx(s);
2105 return 0;
2109 splx(s);
2110 return 0;
2106}
2107
2108void
2109ip_rsvp_force_done(so)
2110 struct socket *so;
2111{
2112 int vifi;
2113 register int s;

--- 187 unchanged lines hidden ---
2111}
2112
2113void
2114ip_rsvp_force_done(so)
2115 struct socket *so;
2116{
2117 int vifi;
2118 register int s;

--- 187 unchanged lines hidden ---