mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 11:18:43 +00:00
pimd: relegate pim_igmp_join.c into a header file
pim_igmp_join.c only exists to make some portability hacks available to test_igmpv3_join. The function only has 1 call site in each pimd and the test tool, so it's nicely served as a simple static function in a header file. This removes a MTYPE related compiler/linker issue from referencing lib/if.h in a binary that doesn't link libzebra, as test_igmpv3_join is now fully independent of lib/. (Fix by Christian Franke: remove stray leftover ifindex_t) Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
d6f4a61dde
commit
5ef104fc41
@ -43,7 +43,7 @@ AM_CFLAGS = $(WERROR)
|
|||||||
|
|
||||||
noinst_LIBRARIES = libpim.a
|
noinst_LIBRARIES = libpim.a
|
||||||
sbin_PROGRAMS = pimd
|
sbin_PROGRAMS = pimd
|
||||||
bin_PROGRAMS = test_igmpv3_join
|
noinst_PROGRAMS = test_igmpv3_join
|
||||||
|
|
||||||
libpim_a_SOURCES = \
|
libpim_a_SOURCES = \
|
||||||
pimd.c pim_version.c pim_cmd.c pim_signals.c pim_iface.c \
|
pimd.c pim_version.c pim_cmd.c pim_signals.c pim_iface.c \
|
||||||
@ -52,7 +52,7 @@ libpim_a_SOURCES = \
|
|||||||
pim_oil.c pim_zlookup.c pim_pim.c pim_tlv.c pim_neighbor.c \
|
pim_oil.c pim_zlookup.c pim_pim.c pim_tlv.c pim_neighbor.c \
|
||||||
pim_hello.c pim_ifchannel.c pim_join.c pim_assert.c \
|
pim_hello.c pim_ifchannel.c pim_join.c pim_assert.c \
|
||||||
pim_msg.c pim_upstream.c pim_rpf.c pim_macro.c \
|
pim_msg.c pim_upstream.c pim_rpf.c pim_macro.c \
|
||||||
pim_igmp_join.c pim_ssmpingd.c pim_int.c pim_rp.c \
|
pim_ssmpingd.c pim_int.c pim_rp.c \
|
||||||
pim_static.c pim_br.c pim_register.c pim_routemap.c
|
pim_static.c pim_br.c pim_register.c pim_routemap.c
|
||||||
|
|
||||||
noinst_HEADERS = \
|
noinst_HEADERS = \
|
||||||
@ -69,7 +69,7 @@ pimd_SOURCES = \
|
|||||||
pim_main.c $(libpim_a_SOURCES)
|
pim_main.c $(libpim_a_SOURCES)
|
||||||
|
|
||||||
test_igmpv3_join_SOURCES = \
|
test_igmpv3_join_SOURCES = \
|
||||||
test_igmpv3_join.c pim_igmp_join.c
|
test_igmpv3_join.c
|
||||||
|
|
||||||
pimd_LDADD = ../lib/libzebra.la @LIBCAP@
|
pimd_LDADD = ../lib/libzebra.la @LIBCAP@
|
||||||
test_igmpv3_join_LDADD = ../lib/libzebra.la
|
test_igmpv3_join_LDADD = ../lib/libzebra.la
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
PIM for Quagga
|
|
||||||
Copyright (C) 2008 Everton da Silva Marques
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; see the file COPYING; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
|
||||||
MA 02110-1301 USA
|
|
||||||
|
|
||||||
$QuaggaId: $Format:%an, %ai, %h$ $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <zebra.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "pim_igmp_join.h"
|
|
||||||
|
|
||||||
#ifndef SOL_IP
|
|
||||||
#define SOL_IP IPPROTO_IP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MCAST_JOIN_SOURCE_GROUP
|
|
||||||
#define MCAST_JOIN_SOURCE_GROUP 46
|
|
||||||
struct group_source_req
|
|
||||||
{
|
|
||||||
uint32_t gsr_interface;
|
|
||||||
struct sockaddr_storage gsr_group;
|
|
||||||
struct sockaddr_storage gsr_source;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int pim_igmp_join_source(int fd, int ifindex,
|
|
||||||
struct in_addr group_addr,
|
|
||||||
struct in_addr source_addr)
|
|
||||||
{
|
|
||||||
struct group_source_req req;
|
|
||||||
struct sockaddr_in group;
|
|
||||||
struct sockaddr_in source;
|
|
||||||
|
|
||||||
memset(&group, 0, sizeof(group));
|
|
||||||
group.sin_family = AF_INET;
|
|
||||||
group.sin_addr = group_addr;
|
|
||||||
group.sin_port = htons(0);
|
|
||||||
memcpy(&req.gsr_group, &group, sizeof(struct sockaddr_in));
|
|
||||||
|
|
||||||
memset(&source, 0, sizeof(source));
|
|
||||||
source.sin_family = AF_INET;
|
|
||||||
source.sin_addr = source_addr;
|
|
||||||
source.sin_port = htons(0);
|
|
||||||
memcpy(&req.gsr_source, &source, sizeof(struct sockaddr_in));
|
|
||||||
|
|
||||||
req.gsr_interface = ifindex;
|
|
||||||
|
|
||||||
return setsockopt(fd, SOL_IP, MCAST_JOIN_SOURCE_GROUP,
|
|
||||||
&req, sizeof(req));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -23,10 +23,48 @@
|
|||||||
#ifndef PIM_IGMP_JOIN_H
|
#ifndef PIM_IGMP_JOIN_H
|
||||||
#define PIM_IGMP_JOIN_H
|
#define PIM_IGMP_JOIN_H
|
||||||
|
|
||||||
#include <netinet/in.h>
|
/* required headers #include'd by caller */
|
||||||
|
|
||||||
int pim_igmp_join_source(int fd, int ifindex,
|
#ifndef SOL_IP
|
||||||
|
#define SOL_IP IPPROTO_IP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MCAST_JOIN_SOURCE_GROUP
|
||||||
|
#define MCAST_JOIN_SOURCE_GROUP 46
|
||||||
|
struct group_source_req
|
||||||
|
{
|
||||||
|
uint32_t gsr_interface;
|
||||||
|
struct sockaddr_storage gsr_group;
|
||||||
|
struct sockaddr_storage gsr_source;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int pim_igmp_join_source(int fd, int ifindex,
|
||||||
struct in_addr group_addr,
|
struct in_addr group_addr,
|
||||||
struct in_addr source_addr);
|
struct in_addr source_addr)
|
||||||
|
{
|
||||||
|
struct group_source_req req;
|
||||||
|
struct sockaddr_in group;
|
||||||
|
struct sockaddr_in source;
|
||||||
|
|
||||||
|
memset(&group, 0, sizeof(group));
|
||||||
|
group.sin_family = AF_INET;
|
||||||
|
group.sin_addr = group_addr;
|
||||||
|
group.sin_port = htons(0);
|
||||||
|
memcpy(&req.gsr_group, &group, sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
|
memset(&source, 0, sizeof(source));
|
||||||
|
source.sin_family = AF_INET;
|
||||||
|
source.sin_addr = source_addr;
|
||||||
|
source.sin_port = htons(0);
|
||||||
|
memcpy(&req.gsr_source, &source, sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
|
req.gsr_interface = ifindex;
|
||||||
|
|
||||||
|
return setsockopt(fd, SOL_IP, MCAST_JOIN_SOURCE_GROUP,
|
||||||
|
&req, sizeof(req));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* PIM_IGMP_JOIN_H */
|
#endif /* PIM_IGMP_JOIN_H */
|
||||||
|
@ -30,10 +30,8 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
#include "thread.h"
|
|
||||||
#include "pim_igmp_join.h"
|
#include "pim_igmp_join.h"
|
||||||
|
|
||||||
struct thread_master *master;
|
|
||||||
const char *prog_name = 0;
|
const char *prog_name = 0;
|
||||||
|
|
||||||
static int iface_solve_index(const char *ifname)
|
static int iface_solve_index(const char *ifname)
|
||||||
|
Loading…
Reference in New Issue
Block a user