summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2010-02-03 16:29:37 +0100
committerDavid Lamparter <equinox@diac24.net>2010-02-04 03:12:39 +0100
commit168595ff42c4046167b0fbae2770c037c854abd0 (patch)
tree1d080009b23fb65eb822bbdf2dd80e4a307844aa
parentbc3f098ff9f358dd459058a4cc3d7fc0d09a45f4 (diff)
downloadquagga-168595ff42c4046167b0fbae2770c037c854abd0.tar.bz2
quagga-168595ff42c4046167b0fbae2770c037c854abd0.tar.xz
dn42: pimd: vifctln support
-rw-r--r--pimd/pim_mroute.c15
-rw-r--r--pimd/pim_mroute.h5
2 files changed, 14 insertions, 6 deletions
diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c
index c76ba525..f9c291dd 100644
--- a/pimd/pim_mroute.c
+++ b/pimd/pim_mroute.c
@@ -327,7 +327,7 @@ int pim_mroute_socket_disable()
*/
int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
{
- struct vifctl vc;
+ struct vifctl_ext vc;
int err;
if (PIM_MROUTE_IS_DISABLED) {
@@ -337,11 +337,12 @@ int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
}
memset(&vc, 0, sizeof(vc));
- vc.vifc_vifi = vif_index;
- vc.vifc_flags = 0;
- vc.vifc_threshold = PIM_MROUTE_MIN_TTL;
- vc.vifc_rate_limit = 0;
- memcpy(&vc.vifc_lcl_addr, &ifaddr, sizeof(vc.vifc_lcl_addr));
+ vc.vc.vifc_vifi = vif_index;
+ vc.vc.vifc_flags = 0;
+ vc.vc.vifc_threshold = PIM_MROUTE_MIN_TTL;
+ vc.vc.vifc_rate_limit = 0;
+ vc.ifindex = vif_index;
+ memcpy(&vc.vc.vifc_lcl_addr, &ifaddr, sizeof(vc.vc.vifc_lcl_addr));
#ifdef PIM_DVMRP_TUNNEL
if (vc.vifc_flags & VIFF_TUNNEL) {
@@ -350,6 +351,8 @@ int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
#endif
err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_VIF, (void*) &vc, sizeof(vc));
+ if (err)
+ err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_VIF, (void*) &vc, sizeof(vc.vc));
if (err) {
char ifaddr_str[100];
int e = errno;
diff --git a/pimd/pim_mroute.h b/pimd/pim_mroute.h
index 350b1e37..9aa48a43 100644
--- a/pimd/pim_mroute.h
+++ b/pimd/pim_mroute.h
@@ -82,6 +82,11 @@ struct vifctl {
};
#endif
+struct vifctl_ext {
+ struct vifctl vc; /* vifctl */
+ int ifindex; /* interface index */
+};
+
#ifndef HAVE_STRUCT_MFCCTL
struct mfcctl {
struct in_addr mfcc_origin; /* Origin of mcast */