Annotation of embedaddon/igmpproxy/src/kern.c, revision 1.1.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>