mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-05-11 09:48:24 +02:00
Major change in these patches for the user is the addition of a whitelist item for up and downstream interfaces. Excerpt from one of patches: Defines a whitelist for multicast groups. The network address must be in the following format 'a.b.c.d/n'. If you want to allow one single group use a network mask of /32, i.e. 'a.b.c.d/32'. By default all multicast groups are allowed on any downstream interface. If at least one whitelist entry is defined, all igmp membership reports for not explicitly whitelisted multicast groups will be ignored and therefore not be served by igmpproxy. This is especially useful, if your provider does only allow a predefined set of multicast groups. These whitelists are only obeyed by igmpproxy itself, they won't prevent any other igmp client running on the same machine as igmpproxy from requesting 'unallowed' multicast groups. You may specify as many whitelist entries as needed. Although you should keep it as simple as possible, as this list is parsed for every membership report and therefore this increases igmp response times. Often used or large groups should be defined first, as parsing ends as soon as a group matches an entry.
80 lines
3.0 KiB
Diff
80 lines
3.0 KiB
Diff
From fed8c3db10bc9d3a1e799a774924c00522595d0c Mon Sep 17 00:00:00 2001
|
|
From: Evgeny Yurchenko <evg.yurch@rogers.com>
|
|
Date: Mon, 4 Jan 2010 05:13:59 +0500
|
|
Subject: [PATCH] Send IGMP packets with IP Router Alert option [RFC 2113] included in IP header
|
|
|
|
---
|
|
src/igmp.c | 17 ++++++++++++-----
|
|
src/igmpproxy.h | 1 +
|
|
2 files changed, 13 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/igmp.c b/src/igmp.c
|
|
index a0cd27d..b547688 100644
|
|
--- a/src/igmp.c
|
|
+++ b/src/igmp.c
|
|
@@ -67,7 +67,7 @@ void initIgmp() {
|
|
* - Checksum (let the kernel fill it in)
|
|
*/
|
|
ip->ip_v = IPVERSION;
|
|
- ip->ip_hl = sizeof(struct ip) >> 2;
|
|
+ ip->ip_hl = (sizeof(struct ip) + 4) >> 2; /* +4 for Router Alert option */
|
|
ip->ip_tos = 0xc0; /* Internet Control */
|
|
ip->ip_ttl = MAXTTL; /* applies to unicasts only */
|
|
ip->ip_p = IPPROTO_IGMP;
|
|
@@ -213,7 +213,7 @@ void buildIgmp(uint32_t src, uint32_t dst, int type, int code, uint32_t group, i
|
|
ip = (struct ip *)send_buf;
|
|
ip->ip_src.s_addr = src;
|
|
ip->ip_dst.s_addr = dst;
|
|
- ip_set_len(ip, MIN_IP_HEADER_LEN + IGMP_MINLEN + datalen);
|
|
+ ip_set_len(ip, IP_HEADER_RAOPT_LEN + IGMP_MINLEN + datalen);
|
|
|
|
if (IN_MULTICAST(ntohl(dst))) {
|
|
ip->ip_ttl = curttl;
|
|
@@ -221,13 +221,20 @@ void buildIgmp(uint32_t src, uint32_t dst, int type, int code, uint32_t group, i
|
|
ip->ip_ttl = MAXTTL;
|
|
}
|
|
|
|
- igmp = (struct igmp *)(send_buf + MIN_IP_HEADER_LEN);
|
|
+ /* Add Router Alert option */
|
|
+ ((u_char*)send_buf+MIN_IP_HEADER_LEN)[0] = IPOPT_RA;
|
|
+ ((u_char*)send_buf+MIN_IP_HEADER_LEN)[1] = 0x04;
|
|
+ ((u_char*)send_buf+MIN_IP_HEADER_LEN)[2] = 0x00;
|
|
+ ((u_char*)send_buf+MIN_IP_HEADER_LEN)[3] = 0x00;
|
|
+
|
|
+ igmp = (struct igmp *)(send_buf + IP_HEADER_RAOPT_LEN);
|
|
igmp->igmp_type = type;
|
|
igmp->igmp_code = code;
|
|
igmp->igmp_group.s_addr = group;
|
|
igmp->igmp_cksum = 0;
|
|
igmp->igmp_cksum = inetChksum((u_short *)igmp,
|
|
- IGMP_MINLEN + datalen);
|
|
+ IP_HEADER_RAOPT_LEN + datalen);
|
|
+
|
|
}
|
|
|
|
/*
|
|
@@ -257,7 +264,7 @@ void sendIgmp(uint32_t src, uint32_t dst, int type, int code, uint32_t group, in
|
|
#endif
|
|
sdst.sin_addr.s_addr = dst;
|
|
if (sendto(MRouterFD, send_buf,
|
|
- MIN_IP_HEADER_LEN + IGMP_MINLEN + datalen, 0,
|
|
+ IP_HEADER_RAOPT_LEN + IGMP_MINLEN + datalen, 0,
|
|
(struct sockaddr *)&sdst, sizeof(sdst)) < 0) {
|
|
if (errno == ENETDOWN)
|
|
my_log(LOG_ERR, errno, "Sender VIF was down.");
|
|
diff --git a/src/igmpproxy.h b/src/igmpproxy.h
|
|
index 0de7791..4df8a79 100644
|
|
--- a/src/igmpproxy.h
|
|
+++ b/src/igmpproxy.h
|
|
@@ -64,6 +64,7 @@
|
|
#define MAX_IP_PACKET_LEN 576
|
|
#define MIN_IP_HEADER_LEN 20
|
|
#define MAX_IP_HEADER_LEN 60
|
|
+#define IP_HEADER_RAOPT_LEN 24
|
|
|
|
#define MAX_MC_VIFS 32 // !!! check this const in the specific includes
|
|
|
|
--
|
|
1.7.2.5
|
|
|