diff -ur pimd-2.1.0-alpha29.18/defs.h pimd-2.1.0-alpha29.18-ifi/defs.h --- pimd-2.1.0-alpha29.18/defs.h Wed May 21 12:40:27 2003 +++ pimd-2.1.0-alpha29.18-ifi/defs.h Fri Aug 19 03:07:40 2005 @@ -498,7 +498,8 @@ extern void init_igmp __P(()); extern void send_igmp __P((char *buf, u_int32 src, u_int32 dst, int type, int code, - u_int32 group, int datalen)); + u_int32 group, int datalen, + struct uvif *vif)); /* igmp_proto.c */ extern void query_groups __P((struct uvif *v)); @@ -526,7 +527,7 @@ extern void k_hdr_include __P((int socket, int bool)); extern void k_set_ttl __P((int socket, int t)); extern void k_set_loop __P((int socket, int l)); -extern void k_set_if __P((int socket, u_int32 ifa)); +extern void k_set_if __P((int socket, struct uvif *v)); extern void k_join __P((int socket, u_int32 grp, struct uvif *v)); extern void k_leave __P((int socket, u_int32 grp, @@ -573,7 +574,7 @@ extern void init_pim __P(()); extern void send_pim __P((char *buf, u_int32 src, u_int32 dst, int type, - int datalen)); + int datalen, struct uvif *vif)); extern void send_pim_unicast __P((char *buf, u_int32 src, u_int32 dst, int type, int datalen)); Only in pimd-2.1.0-alpha29.18-ifi/: defs.h.orig diff -ur pimd-2.1.0-alpha29.18/igmp.c pimd-2.1.0-alpha29.18-ifi/igmp.c --- pimd-2.1.0-alpha29.18/igmp.c Thu Sep 26 02:59:29 2002 +++ pimd-2.1.0-alpha29.18-ifi/igmp.c Sat Aug 23 09:27:46 2003 @@ -292,12 +292,13 @@ } void -send_igmp(buf, src, dst, type, code, group, datalen) +send_igmp(buf, src, dst, type, code, group, datalen, vif) char *buf; u_int32 src, dst; int type, code; u_int32 group; int datalen; + struct uvif *vif; { struct sockaddr_in sdst; struct ip *ip; @@ -327,7 +328,7 @@ IGMP_MINLEN + datalen); if (IN_MULTICAST(ntohl(dst))){ - k_set_if(igmp_socket, src); + k_set_if(igmp_socket, vif); if (type != IGMP_DVMRP || dst == allhosts_group) { setloop = 1; k_set_loop(igmp_socket, TRUE); diff -ur pimd-2.1.0-alpha29.18/igmp_proto.c pimd-2.1.0-alpha29.18-ifi/igmp_proto.c --- pimd-2.1.0-alpha29.18/igmp_proto.c Mon Sep 10 22:31:36 2001 +++ pimd-2.1.0-alpha29.18-ifi/igmp_proto.c Sat Aug 23 09:30:25 2003 @@ -76,7 +76,7 @@ send_igmp(igmp_send_buf, v->uv_lcl_addr, allhosts_group, IGMP_MEMBERSHIP_QUERY, (v->uv_flags & VIFF_IGMPV1) ? 0 : - IGMP_MAX_HOST_REPORT_DELAY * IGMP_TIMER_SCALE, 0, 0); + IGMP_MAX_HOST_REPORT_DELAY * IGMP_TIMER_SCALE, 0, 0, v); /* * Decrement the old-hosts-present timer for each * active group on that vif. @@ -357,7 +357,7 @@ send_igmp(igmp_send_buf, v->uv_lcl_addr, g->al_addr, IGMP_MEMBERSHIP_QUERY, IGMP_LAST_MEMBER_QUERY_INTERVAL * IGMP_TIMER_SCALE, - g->al_addr, 0); + g->al_addr, 0, v); g->al_query = SetQueryTimer(g, vifi, IGMP_LAST_MEMBER_QUERY_INTERVAL, IGMP_LAST_MEMBER_QUERY_INTERVAL * IGMP_TIMER_SCALE); @@ -445,7 +445,7 @@ if (v->uv_flags & VIFF_QUERIER) send_igmp(igmp_send_buf, v->uv_lcl_addr, cbk->g->al_addr, IGMP_MEMBERSHIP_QUERY, - cbk->q_time, cbk->g->al_addr, 0); + cbk->q_time, cbk->g->al_addr, 0, v); cbk->g->al_query = 0; free(cbk); } diff -ur pimd-2.1.0-alpha29.18/kern.c pimd-2.1.0-alpha29.18-ifi/kern.c --- pimd-2.1.0-alpha29.18/kern.c Wed Feb 12 22:56:55 2003 +++ pimd-2.1.0-alpha29.18-ifi/kern.c Sat Aug 23 09:38:07 2003 @@ -247,17 +247,35 @@ /* * Set the IP_MULTICAST_IF option on local interface ifa. */ -void k_set_if(socket, ifa) +void k_set_if(socket, v) int socket; - u_int32 ifa; + struct uvif *v; { struct in_addr adr; - adr.s_addr = ifa; + if (v) + adr.s_addr = v->uv_lcl_addr; + else + adr.s_addr = INADDR_ANY; + +#ifdef Linux + struct ip_mreqn mreq; + mreq.imr_multiaddr.s_addr = 0; + mreq.imr_address = adr; + mreq.imr_ifindex = v ? v->uv_ifindex : 0; + + if (setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, + (char *) &mreq, sizeof (mreq)) < 0) + log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s", + inet_fmt(adr.s_addr, s1)); +#else + + adr.s_addr = adr; if (setsockopt(socket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&adr, sizeof(adr)) < 0) log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s", - inet_fmt(ifa, s1)); + inet_fmt(adr.s_addr, s1)); +#endif } diff -ur pimd-2.1.0-alpha29.18/pim.c pimd-2.1.0-alpha29.18-ifi/pim.c --- pimd-2.1.0-alpha29.18/pim.c Thu Sep 26 02:59:30 2002 +++ pimd-2.1.0-alpha29.18-ifi/pim.c Sat Aug 23 09:29:22 2003 @@ -227,10 +227,11 @@ * and data length (after the PIM header) = "datalen" */ void -send_pim(buf, src, dst, type, datalen) +send_pim(buf, src, dst, type, datalen, vif) char *buf; u_int32 src, dst; int type, datalen; + struct uvif *vif; { struct sockaddr_in sdst; struct ip *ip; @@ -265,7 +266,7 @@ sizeof(pim_header_t) + datalen); if (IN_MULTICAST(ntohl(dst))) { - k_set_if(pim_socket, src); + k_set_if(pim_socket, vif); if ((dst == allhosts_group) || (dst == allrouters_group) || (dst == allpimrouters_group)) { setloop = 1; diff -ur pimd-2.1.0-alpha29.18/pim_proto.c pimd-2.1.0-alpha29.18-ifi/pim_proto.c --- pimd-2.1.0-alpha29.18/pim_proto.c Mon Jul 8 19:24:06 2002 +++ pimd-2.1.0-alpha29.18-ifi/pim_proto.c Sat Aug 23 09:39:12 2003 @@ -443,7 +443,7 @@ datalen = data_ptr - (u_int8 *)buf; send_pim(pim_send_buf, v->uv_lcl_addr, allpimrouters_group, PIM_HELLO, - datalen); + datalen, v); SET_TIMER(v->uv_pim_hello_timer, PIM_TIMER_HELLO_PERIOD); return(TRUE); } @@ -2415,7 +2415,7 @@ bcopy(pim_nbr->build_jp_message->jp_message, pim_send_buf + sizeof(struct ip) + sizeof(pim_header_t), datalen); send_pim(pim_send_buf, uvifs[vifi].uv_lcl_addr, allpimrouters_group, - PIM_JOIN_PRUNE, datalen); + PIM_JOIN_PRUNE, datalen, uvifs + vifi); return_jp_working_buff(pim_nbr); } @@ -2762,7 +2762,7 @@ PUT_HOSTLONG(local_preference, data_ptr); PUT_HOSTLONG(local_metric, data_ptr); send_pim(pim_send_buf, uvifs[vifi].uv_lcl_addr, allpimrouters_group, - PIM_ASSERT, data_ptr - data_start_ptr); + PIM_ASSERT, data_ptr - data_start_ptr, uvifs + vifi); return (TRUE); } @@ -2972,7 +2972,7 @@ bcopy(pim_message, (char *)(pim_send_buf + sizeof(struct ip)), datalen); send_pim(pim_send_buf, uvifs[vifi].uv_lcl_addr, allpimrouters_group, - PIM_BOOTSTRAP, datalen - sizeof(pim_header_t)); + PIM_BOOTSTRAP, datalen - sizeof(pim_header_t), uvifs + vifi); } max_data_ptr = (u_int8 *)pim_message + datalen; @@ -3153,7 +3153,7 @@ VIFF_REGISTER)) continue; send_pim(pim_send_buf, uvifs[vifi].uv_lcl_addr, - allpimrouters_group, PIM_BOOTSTRAP, datalen); + allpimrouters_group, PIM_BOOTSTRAP, datalen, uvifs + vifi); } } } diff -ur pimd-2.1.0-alpha29.18/trace.c pimd-2.1.0-alpha29.18-ifi/trace.c --- pimd-2.1.0-alpha29.18/trace.c Thu Sep 26 02:59:30 2002 +++ pimd-2.1.0-alpha29.18-ifi/trace.c Sat Aug 23 09:37:15 2003 @@ -388,7 +388,7 @@ inet_fmt(uvifs[phys_vif].uv_lcl_addr, s2)); k_set_ttl(igmp_socket, qry->tr_rttl); send_igmp(igmp_send_buf, uvifs[phys_vif].uv_lcl_addr, dst, - resptype, no, group, datalen); + resptype, no, group, datalen, uvifs + phys_vif); k_set_ttl(igmp_socket, 1); } else log(LOG_INFO, 0, "No enabled phyints -- %s", @@ -399,7 +399,7 @@ resptype == IGMP_MTRACE_RESP ? "reply" : "request on", inet_fmt(dst, s1), inet_fmt(src, s2)); - send_igmp(igmp_send_buf, src, dst, resptype, no, group, datalen); + send_igmp(igmp_send_buf, src, dst, resptype, no, group, datalen, NULL); } return; } @@ -443,7 +443,7 @@ /* Make sure that there's room for this neighbor... */ if (datalen + (ncount == 0 ? 4 + 3 + 4 : 4) > MAX_DVMRP_DATA_LEN) { send_igmp(igmp_send_buf, INADDR_ANY, them, IGMP_DVMRP, - DVMRP_NEIGHBORS, htonl(PIMD_LEVEL), datalen); + DVMRP_NEIGHBORS, htonl(PIMD_LEVEL), datalen, NULL); p = (u_char *) (igmp_send_buf + MIN_IP_HEADER_LEN + IGMP_MINLEN); datalen = 0; ncount = 0; @@ -467,7 +467,7 @@ if (datalen != 0) send_igmp(igmp_send_buf, INADDR_ANY, them, IGMP_DVMRP, DVMRP_NEIGHBORS, - htonl(PIMD_LEVEL), datalen); + htonl(PIMD_LEVEL), datalen, NULL); } @@ -521,7 +521,7 @@ rflags |= DVMRP_NF_DOWN; if (datalen > MAX_DVMRP_DATA_LEN - 12) { send_igmp(igmp_send_buf, INADDR_ANY, them, IGMP_DVMRP, - DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen); + DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen, NULL); p = (u_char *) (igmp_send_buf + MIN_IP_HEADER_LEN + IGMP_MINLEN); datalen = 0; } @@ -539,7 +539,7 @@ /* Make sure that there's room for this neighbor... */ if (datalen + (ncount == 0 ? 4+4+4 : 4) > MAX_DVMRP_DATA_LEN) { send_igmp(igmp_send_buf, INADDR_ANY, them, IGMP_DVMRP, - DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen); + DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen, NULL); p = (u_char *) (igmp_send_buf + MIN_IP_HEADER_LEN + IGMP_MINLEN); datalen = 0; ncount = 0; @@ -564,7 +564,7 @@ } if (datalen != 0) send_igmp(igmp_send_buf, INADDR_ANY, them, IGMP_DVMRP, - DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen); + DVMRP_NEIGHBORS2, htonl(PIMD_LEVEL), datalen, NULL); }