diff options
Diffstat (limited to 'usr.sbin/mrouted/kern.c')
-rw-r--r-- | usr.sbin/mrouted/kern.c | 344 |
1 files changed, 0 insertions, 344 deletions
diff --git a/usr.sbin/mrouted/kern.c b/usr.sbin/mrouted/kern.c deleted file mode 100644 index 716b479..0000000 --- a/usr.sbin/mrouted/kern.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * The mrouted program is covered by the license in the accompanying file - * named "LICENSE". Use of the mrouted program represents acceptance of - * the terms and conditions listed in that file. - * - * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of - * Leland Stanford Junior University. - * - * - * kern.c,v 3.8.4.10 1998/01/06 02:00:51 fenner Exp - */ - -#ifndef lint -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -#include "defs.h" - -int curttl = 0; - -void k_set_rcvbuf(bufsize, minsize) - int bufsize; - int minsize; -{ - int delta = bufsize / 2; - int iter = 0; - - /* - * Set the socket buffer. If we can't set it as large as we - * want, search around to try to find the highest acceptable - * value. The highest acceptable value being smaller than - * minsize is a fatal error. - */ - if (setsockopt(igmp_socket, SOL_SOCKET, SO_RCVBUF, - (char *)&bufsize, sizeof(bufsize)) < 0) { - bufsize -= delta; - while (1) { - iter++; - if (delta > 1) - delta /= 2; - - if (setsockopt(igmp_socket, SOL_SOCKET, SO_RCVBUF, - (char *)&bufsize, sizeof(bufsize)) < 0) { - bufsize -= delta; - } else { - if (delta < 1024) - break; - bufsize += delta; - } - } - if (bufsize < minsize) { - log(LOG_ERR, 0, "OS-allowed buffer size %u < app min %u", - bufsize, minsize); - /*NOTREACHED*/ - } - } - IF_DEBUG(DEBUG_KERN) - log(LOG_DEBUG, 0, "Got %d byte buffer size in %d iterations", - bufsize, iter); -} - - -void k_hdr_include(bool) - int bool; -{ -#ifdef IP_HDRINCL - if (setsockopt(igmp_socket, IPPROTO_IP, IP_HDRINCL, - (char *)&bool, sizeof(bool)) < 0) - log(LOG_ERR, errno, "setsockopt IP_HDRINCL %u", bool); -#endif -} - - -void k_set_ttl(t) - int t; -{ -#ifndef RAW_OUTPUT_IS_RAW - u_char ttl; - - ttl = t; - if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_TTL, - (char *)&ttl, sizeof(ttl)) < 0) - log(LOG_ERR, errno, "setsockopt IP_MULTICAST_TTL %u", ttl); -#endif - curttl = t; -} - - -void k_set_loop(l) - int l; -{ - u_char loop; - - loop = l; - if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_LOOP, - (char *)&loop, sizeof(loop)) < 0) - log(LOG_ERR, errno, "setsockopt IP_MULTICAST_LOOP %u", loop); -} - - -void k_set_if(ifa) - u_int32 ifa; -{ - struct in_addr adr; - - adr.s_addr = ifa; - if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_IF, - (char *)&adr, sizeof(adr)) < 0) - log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s", - inet_fmt(ifa, s1)); -} - - -void k_join(grp, ifa) - u_int32 grp; - u_int32 ifa; -{ - struct ip_mreq mreq; - - mreq.imr_multiaddr.s_addr = grp; - mreq.imr_interface.s_addr = ifa; - - if (setsockopt(igmp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (char *)&mreq, sizeof(mreq)) < 0) - log(LOG_WARNING, errno, "can't join group %s on interface %s", - inet_fmt(grp, s1), inet_fmt(ifa, s2)); -} - - -void k_leave(grp, ifa) - u_int32 grp; - u_int32 ifa; -{ - struct ip_mreq mreq; - - mreq.imr_multiaddr.s_addr = grp; - mreq.imr_interface.s_addr = ifa; - - if (setsockopt(igmp_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, - (char *)&mreq, sizeof(mreq)) < 0) - log(LOG_WARNING, errno, "can't leave group %s on interface %s", - inet_fmt(grp, s1), inet_fmt(ifa, s2)); -} - - -void k_init_dvmrp() -{ -#ifdef OLD_KERNEL - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_INIT, - (char *)NULL, 0) < 0) -#else - int v=1; - - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_INIT, - (char *)&v, sizeof(int)) < 0) -#endif - log(LOG_ERR, errno, "can't enable Multicast routing in kernel"); -} - - -void k_stop_dvmrp() -{ - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_DONE, - (char *)NULL, 0) < 0) - log(LOG_WARNING, errno, "can't disable Multicast routing in kernel"); -} - - -void k_add_vif(vifi, v) - vifi_t vifi; - struct uvif *v; -{ - struct vifctl vc; - - vc.vifc_vifi = vifi; - vc.vifc_flags = v->uv_flags & VIFF_KERNEL_FLAGS; - vc.vifc_threshold = v->uv_threshold; - vc.vifc_rate_limit = v->uv_rate_limit; - vc.vifc_lcl_addr.s_addr = v->uv_lcl_addr; - vc.vifc_rmt_addr.s_addr = v->uv_rmt_addr; - - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_VIF, - (char *)&vc, sizeof(vc)) < 0) - log(LOG_ERR, errno, "setsockopt MRT_ADD_VIF on vif %d", vifi); -} - - -void k_del_vif(vifi) - vifi_t vifi; -{ - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_VIF, - (char *)&vifi, sizeof(vifi)) < 0) - log(LOG_ERR, errno, "setsockopt MRT_DEL_VIF on vif %d", vifi); -} - - -/* - * Adds a (source, mcastgrp) entry to the kernel - */ -void k_add_rg(origin, g) - u_int32 origin; - struct gtable *g; -{ - struct mfcctl mc; - vifi_t i; - -#ifdef DEBUG_MFC - md_log(MD_ADD, origin, g->gt_mcastgrp); -#endif - /* copy table values so that setsockopt can process it */ - mc.mfcc_origin.s_addr = origin; -#ifdef OLD_KERNEL - mc.mfcc_originmask.s_addr = 0xffffffff; -#endif - mc.mfcc_mcastgrp.s_addr = g->gt_mcastgrp; - mc.mfcc_parent = g->gt_route ? g->gt_route->rt_parent : NO_VIF; - for (i = 0; i < numvifs; i++) - mc.mfcc_ttls[i] = g->gt_ttls[i]; - - /* write to kernel space */ - if (setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_MFC, - (char *)&mc, sizeof(mc)) < 0) { -#ifdef DEBUG_MFC - md_log(MD_ADD_FAIL, origin, g->gt_mcastgrp); -#endif - log(LOG_WARNING, errno, "setsockopt MRT_ADD_MFC", - inet_fmt(origin, s1), inet_fmt(g->gt_mcastgrp, s2)); - } -} - - -/* - * Deletes a (source, mcastgrp) entry from the kernel - */ -int k_del_rg(origin, g) - u_int32 origin; - struct gtable *g; -{ - struct mfcctl mc; - int retval; - -#ifdef DEBUG_MFC - md_log(MD_DEL, origin, g->gt_mcastgrp); -#endif - /* copy table values so that setsockopt can process it */ - mc.mfcc_origin.s_addr = origin; -#ifdef OLD_KERNEL - mc.mfcc_originmask.s_addr = 0xffffffff; -#endif - mc.mfcc_mcastgrp.s_addr = g->gt_mcastgrp; - - /* write to kernel space */ - if ((retval = setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_MFC, - (char *)&mc, sizeof(mc))) < 0) { -#ifdef DEBUG_MFC - md_log(MD_DEL_FAIL, origin, g->gt_mcastgrp); -#endif - log(LOG_WARNING, errno, "setsockopt MRT_DEL_MFC of (%s %s)", - inet_fmt(origin, s1), inet_fmt(g->gt_mcastgrp, s2)); - } - - return retval; -} - -/* - * Get the kernel's idea of what version of mrouted needs to run with it. - */ -int k_get_version() -{ -#ifdef OLD_KERNEL - return -1; -#else - int vers; - int len = sizeof(vers); - - if (getsockopt(igmp_socket, IPPROTO_IP, MRT_VERSION, - (char *)&vers, &len) < 0) - log(LOG_ERR, errno, - "getsockopt MRT_VERSION: perhaps your kernel is too old"); - - return vers; -#endif -} - -#if 0 -/* - * Get packet counters - */ -int -k_get_vif_count(vifi, icount, ocount, ibytes, obytes) - vifi_t vifi; - int *icount, *ocount, *ibytes, *obytes; -{ - struct sioc_vif_req vreq; - int retval = 0; - - vreq.vifi = vifi; - if (ioctl(udp_socket, SIOCGETVIFCNT, (char *)&vreq) < 0) { - log(LOG_WARNING, errno, "SIOCGETVIFCNT on vif %d", vifi); - vreq.icount = vreq.ocount = vreq.ibytes = - vreq.obytes = 0xffffffff; - retval = 1; - } - if (icount) - *icount = vreq.icount; - if (ocount) - *ocount = vreq.ocount; - if (ibytes) - *ibytes = vreq.ibytes; - if (obytes) - *obytes = vreq.obytes; - return retval; -} - -/* - * Get counters for a desired source and group. - */ -int -k_get_sg_count(src, grp, pktcnt, bytecnt, wrong_if) - u_int32 src; - u_int32 grp; - struct sg_count *retval; -{ - struct sioc_sg_req sgreq; - int retval = 0; - - sgreq.src.s_addr = src; - sgreq.grp.s_addr = grp; - if (ioctl(udp_socket, SIOCGETSGCNT, (char *)&sgreq) < 0) { - log(LOG_WARNING, errno, "SIOCGETSGCNT on (%s %s)", - inet_fmt(src, s1), inet_fmt(grp, s2)); - sgreq.pktcnt = sgreq.bytecnt = sgreq.wrong_if = 0xffffffff; - return 1; - } - if (pktcnt) - *pktcnt = sgreq.pktcnt; - if (bytecnt) - *bytecnt = sgreq.bytecnt; - if (wrong_if) - *wrong_if = sgreq.wrong_if; - return retval; -} -#endif |