xref: /netbsd-src/usr.sbin/mrouted/kern.c (revision ce0bb6e8d2e560ecacbe865a848624f94498063b)
1 /*
2  * The mrouted program is covered by the license in the accompanying file
3  * named "LICENSE".  Use of the mrouted program represents acceptance of
4  * the terms and conditions listed in that file.
5  *
6  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
7  * Leland Stanford Junior University.
8  *
9  *
10  * from: Id: kern.c,v 1.3 1993/05/30 01:36:38 deering Exp
11  *      $Id: kern.c,v 1.1 1994/01/11 20:15:56 brezak Exp $
12  */
13 
14 #ifndef lint
15 static char rcsid[] = "$Id: kern.c,v 1.1 1994/01/11 20:15:56 brezak Exp $";
16 #endif
17 
18 #include "defs.h"
19 
20 
21 void k_set_rcvbuf(bufsize)
22     int bufsize;
23 {
24     if (setsockopt(igmp_socket, SOL_SOCKET, SO_RCVBUF,
25 			(char *)&bufsize, sizeof(bufsize)) < 0)
26 	log(LOG_ERR, errno, "setsockopt SO_RCVBUF %u", bufsize);
27 }
28 
29 
30 void k_hdr_include(bool)
31     int bool;
32 {
33 #ifdef IP_HDRINCL
34     if (setsockopt(igmp_socket, IPPROTO_IP, IP_HDRINCL,
35 			(char *)&bool, sizeof(bool)) < 0)
36 	log(LOG_ERR, errno, "setsockopt IP_HDRINCL %u", bool);
37 #endif
38 }
39 
40 
41 void k_set_ttl(t)
42     int t;
43 {
44     u_char ttl;
45 
46     ttl = t;
47     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_TTL,
48 		   (char *)&ttl, sizeof(ttl)) < 0)
49 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_TTL %u", ttl);
50 }
51 
52 
53 void k_set_loop(l)
54     int l;
55 {
56     u_char loop;
57 
58     loop = l;
59     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_LOOP,
60 		   (char *)&loop, sizeof(loop)) < 0)
61 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_LOOP %u", loop);
62 }
63 
64 
65 void k_set_if(ifa)
66     u_long ifa;
67 {
68     struct in_addr adr;
69 
70     adr.s_addr = ifa;
71     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_IF,
72 		   (char *)&adr, sizeof(adr)) < 0)
73 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s",
74 	    		    inet_fmt(ifa, s1));
75 }
76 
77 
78 void k_join(grp, ifa)
79     u_long grp;
80     u_long ifa;
81 {
82     struct ip_mreq mreq;
83 
84     mreq.imr_multiaddr.s_addr = grp;
85     mreq.imr_interface.s_addr = ifa;
86 
87     if (setsockopt(igmp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
88 		   (char *)&mreq, sizeof(mreq)) < 0)
89 	log(LOG_WARNING, errno, "can't join group %s on interface %s",
90 				inet_fmt(grp, s1), inet_fmt(ifa, s2));
91 }
92 
93 
94 void k_leave(grp, ifa)
95     u_long grp;
96     u_long ifa;
97 {
98     struct ip_mreq mreq;
99 
100     mreq.imr_multiaddr.s_addr = grp;
101     mreq.imr_interface.s_addr = ifa;
102 
103     if (setsockopt(igmp_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP,
104 		   (char *)&mreq, sizeof(mreq)) < 0)
105 	log(LOG_WARNING, errno, "can't leave group %s on interface %s",
106 				inet_fmt(grp, s1), inet_fmt(ifa, s2));
107 }
108 
109 
110 void k_init_dvmrp()
111 {
112     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_INIT,
113 			(char *)NULL, 0) < 0)
114 	log(LOG_ERR, errno, "can't enable DVMRP routing in kernel");
115 }
116 
117 
118 void k_stop_dvmrp()
119 {
120     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_DONE,
121 			(char *)NULL, 0) < 0)
122 	log(LOG_WARNING, errno, "can't disable DVMRP routing in kernel");
123 }
124 
125 
126 void k_add_vif(vifi, v)
127     vifi_t vifi;
128     struct uvif *v;
129 {
130     struct vifctl vc;
131 
132     vc.vifc_vifi            = vifi;
133     vc.vifc_flags           = v->uv_flags & VIFF_KERNEL_FLAGS;
134     vc.vifc_threshold       = v->uv_threshold;
135     vc.vifc_lcl_addr.s_addr = v->uv_lcl_addr;
136     vc.vifc_rmt_addr.s_addr = v->uv_rmt_addr;
137 
138     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_ADD_VIF,
139 			(char *)&vc, sizeof(vc)) < 0)
140 	log(LOG_ERR, errno, "setsockopt DVMRP_ADD_VIF");
141 }
142 
143 
144 void k_del_vif(vifi)
145     vifi_t vifi;
146 {
147     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_DEL_VIF,
148 			(char *)&vifi, sizeof(vifi)) < 0)
149 	log(LOG_ERR, errno, "setsockopt DVMRP_DEL_VIF");
150 }
151 
152 
153 void k_add_group(vifi, group)
154     vifi_t vifi;
155     u_long group;
156 {
157     struct lgrplctl lc;
158 
159     lc.lgc_vifi         = vifi;
160     lc.lgc_gaddr.s_addr = group;
161 
162     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_ADD_LGRP,
163 			(char *)&lc, sizeof(lc)) < 0)
164 	log(LOG_WARNING, errno, "setsockopt DVMRP_ADD_LGRP");
165 }
166 
167 
168 void k_del_group(vifi, group)
169     vifi_t vifi;
170     u_long group;
171 {
172     struct lgrplctl lc;
173 
174     lc.lgc_vifi         = vifi;
175     lc.lgc_gaddr.s_addr = group;
176 
177     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_DEL_LGRP,
178 			(char *)&lc, sizeof(lc)) < 0)
179 	log(LOG_WARNING, errno, "setsockopt DVMRP_DEL_LGRP");
180 }
181 
182 
183 void k_add_route(r)
184     struct rtentry *r;
185 {
186     struct mrtctl mc;
187 
188     mc.mrtc_origin.s_addr     = r->rt_origin;
189     mc.mrtc_originmask.s_addr = r->rt_originmask;
190     mc.mrtc_parent            = r->rt_parent;
191     VIFM_COPY(r->rt_children, mc.mrtc_children);
192     VIFM_COPY(r->rt_leaves,   mc.mrtc_leaves);
193 
194     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_ADD_MRT,
195 			(char *)&mc, sizeof(mc)) < 0)
196 	log(LOG_WARNING, errno, "setsockopt DVMRP_ADD_MRT");
197 }
198 
199 
200 void k_update_route(r)
201     struct rtentry *r;
202 {
203     k_add_route(r);
204 }
205 
206 
207 void k_del_route(r)
208     struct rtentry *r;
209 {
210     struct in_addr orig;
211 
212     orig.s_addr = r->rt_origin;
213 
214     if (setsockopt(igmp_socket, IPPROTO_IP, DVMRP_DEL_MRT,
215 			(char *)&orig, sizeof(orig)) < 0)
216 	log(LOG_WARNING, errno, "setsockopt DVMRP_DEL_MRT");
217 }
218