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>