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