kern.c revision 1.1 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