Annotation of embedaddon/igmpproxy/src/kern.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** igmpproxy - IGMP proxy based multicast router
! 3: ** Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>
! 4: **
! 5: ** This program is free software; you can redistribute it and/or modify
! 6: ** it under the terms of the GNU General Public License as published by
! 7: ** the Free Software Foundation; either version 2 of the License, or
! 8: ** (at your option) any later version.
! 9: **
! 10: ** This program is distributed in the hope that it will be useful,
! 11: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 13: ** GNU General Public License for more details.
! 14: **
! 15: ** You should have received a copy of the GNU General Public License
! 16: ** along with this program; if not, write to the Free Software
! 17: ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 18: **
! 19: **----------------------------------------------------------------------------
! 20: **
! 21: ** This software is derived work from the following software. The original
! 22: ** source code has been modified from it's original state by the author
! 23: ** of igmpproxy.
! 24: **
! 25: ** smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>
! 26: ** - Licensed under the GNU General Public License, version 2
! 27: **
! 28: ** mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of
! 29: ** Leland Stanford Junior University.
! 30: ** - Original license can be found in the Stanford.txt file.
! 31: **
! 32: */
! 33:
! 34:
! 35: #include "igmpproxy.h"
! 36:
! 37: int curttl = 0;
! 38:
! 39: void k_set_rcvbuf(int bufsize, int minsize) {
! 40: int delta = bufsize / 2;
! 41: int iter = 0;
! 42:
! 43: /*
! 44: * Set the socket buffer. If we can't set it as large as we
! 45: * want, search around to try to find the highest acceptable
! 46: * value. The highest acceptable value being smaller than
! 47: * minsize is a fatal error.
! 48: */
! 49: if (setsockopt(MRouterFD, SOL_SOCKET, SO_RCVBUF,
! 50: (char *)&bufsize, sizeof(bufsize)) < 0) {
! 51: bufsize -= delta;
! 52: while (1) {
! 53: iter++;
! 54: if (delta > 1)
! 55: delta /= 2;
! 56:
! 57: if (setsockopt(MRouterFD, SOL_SOCKET, SO_RCVBUF,
! 58: (char *)&bufsize, sizeof(bufsize)) < 0) {
! 59: bufsize -= delta;
! 60: } else {
! 61: if (delta < 1024)
! 62: break;
! 63: bufsize += delta;
! 64: }
! 65: }
! 66: if (bufsize < minsize) {
! 67: my_log(LOG_ERR, 0, "OS-allowed buffer size %u < app min %u",
! 68: bufsize, minsize);
! 69: /*NOTREACHED*/
! 70: }
! 71: }
! 72: my_log(LOG_DEBUG, 0, "Got %d byte buffer size in %d iterations", bufsize, iter);
! 73: }
! 74:
! 75:
! 76: void k_hdr_include(int hdrincl) {
! 77: if (setsockopt(MRouterFD, IPPROTO_IP, IP_HDRINCL,
! 78: (char *)&hdrincl, sizeof(hdrincl)) < 0)
! 79: my_log(LOG_ERR, errno, "setsockopt IP_HDRINCL %u", hdrincl);
! 80: }
! 81:
! 82:
! 83: void k_set_ttl(int t) {
! 84: #ifndef RAW_OUTPUT_IS_RAW
! 85: u_char ttl;
! 86:
! 87: ttl = t;
! 88: if (setsockopt(MRouterFD, IPPROTO_IP, IP_MULTICAST_TTL,
! 89: (char *)&ttl, sizeof(ttl)) < 0)
! 90: my_log(LOG_ERR, errno, "setsockopt IP_MULTICAST_TTL %u", ttl);
! 91: #endif
! 92: curttl = t;
! 93: }
! 94:
! 95:
! 96: void k_set_loop(int l) {
! 97: u_char loop;
! 98:
! 99: loop = l;
! 100: if (setsockopt(MRouterFD, IPPROTO_IP, IP_MULTICAST_LOOP,
! 101: (char *)&loop, sizeof(loop)) < 0)
! 102: my_log(LOG_ERR, errno, "setsockopt IP_MULTICAST_LOOP %u", loop);
! 103: }
! 104:
! 105: void k_set_if(uint32_t ifa) {
! 106: struct in_addr adr;
! 107:
! 108: adr.s_addr = ifa;
! 109: if (setsockopt(MRouterFD, IPPROTO_IP, IP_MULTICAST_IF,
! 110: (char *)&adr, sizeof(adr)) < 0)
! 111: my_log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s",
! 112: inetFmt(ifa, s1));
! 113: }
! 114:
! 115: /*
! 116: void k_join(uint32_t grp, uint32_t ifa) {
! 117: struct ip_mreq mreq;
! 118:
! 119: mreq.imr_multiaddr.s_addr = grp;
! 120: mreq.imr_interface.s_addr = ifa;
! 121:
! 122: if (setsockopt(MRouterFD, IPPROTO_IP, IP_ADD_MEMBERSHIP,
! 123: (char *)&mreq, sizeof(mreq)) < 0)
! 124: my_log(LOG_WARNING, errno, "can't join group %s on interface %s",
! 125: inetFmt(grp, s1), inetFmt(ifa, s2));
! 126: }
! 127:
! 128:
! 129: void k_leave(uint32_t grp, uint32_t ifa) {
! 130: struct ip_mreq mreq;
! 131:
! 132: mreq.imr_multiaddr.s_addr = grp;
! 133: mreq.imr_interface.s_addr = ifa;
! 134:
! 135: if (setsockopt(MRouterFD, IPPROTO_IP, IP_DROP_MEMBERSHIP,
! 136: (char *)&mreq, sizeof(mreq)) < 0)
! 137: my_log(LOG_WARNING, errno, "can't leave group %s on interface %s",
! 138: inetFmt(grp, s1), inetFmt(ifa, s2));
! 139: }
! 140: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>