aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/mrouted/igmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/mrouted/igmp.c')
-rw-r--r--usr.sbin/mrouted/igmp.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/usr.sbin/mrouted/igmp.c b/usr.sbin/mrouted/igmp.c
index e1bd064209d4..3c27e6d38d26 100644
--- a/usr.sbin/mrouted/igmp.c
+++ b/usr.sbin/mrouted/igmp.c
@@ -7,7 +7,7 @@
* Leland Stanford Junior University.
*
*
- * $Id: igmp.c,v 1.7 1995/06/28 17:58:32 wollman Exp $
+ * $Id: igmp.c,v 3.8 1995/11/29 22:36:57 fenner Rel $
*/
@@ -94,6 +94,8 @@ packet_kind(type, code)
case DVMRP_PRUNE: return "prune message ";
case DVMRP_GRAFT: return "graft message ";
case DVMRP_GRAFT_ACK: return "graft message ack ";
+ case DVMRP_INFO_REQUEST: return "info request ";
+ case DVMRP_INFO_REPLY: return "info reply ";
default: return "unknown DVMRP msg ";
}
case IGMP_PIM:
@@ -154,8 +156,8 @@ accept_igmp(recvlen)
ipdatalen = ip->ip_len;
if (iphdrlen + ipdatalen != recvlen) {
log(LOG_WARNING, 0,
- "received packet shorter (%u bytes) than hdr+data length (%u+%u)",
- recvlen, iphdrlen, ipdatalen);
+ "received packet from %s shorter (%u bytes) than hdr+data length (%u+%u)",
+ inet_fmt(src, s1), recvlen, iphdrlen, ipdatalen);
return;
}
@@ -232,6 +234,15 @@ accept_igmp(recvlen)
accept_g_ack(src, dst, (char *)(igmp+1), igmpdatalen);
return;
+ case DVMRP_INFO_REQUEST:
+ accept_info_request(src, dst, (char *)(igmp+1),
+ igmpdatalen);
+ return;
+
+ case DVMRP_INFO_REPLY:
+ accept_info_reply(src, dst, (char *)(igmp+1), igmpdatalen);
+ return;
+
default:
log(LOG_INFO, 0,
"ignoring unknown DVMRP message code %u from %s to %s",
@@ -296,9 +307,10 @@ send_igmp(src, dst, type, code, group, datalen)
u_int32 group;
int datalen;
{
- static struct sockaddr_in sdst;
+ struct sockaddr_in sdst;
struct ip *ip;
struct igmp *igmp;
+ int setloop;
ip = (struct ip *)send_buf;
ip->ip_src.s_addr = src;
@@ -313,9 +325,13 @@ send_igmp(src, dst, type, code, group, datalen)
igmp->igmp_cksum = inet_cksum((u_short *)igmp,
IGMP_MINLEN + datalen);
- if (IN_MULTICAST(ntohl(dst))) k_set_if(src);
- if (dst == allhosts_group || type == IGMP_HOST_MEMBERSHIP_QUERY)
+ if (IN_MULTICAST(ntohl(dst))) {
+ k_set_if(src);
+ if (type != IGMP_DVMRP) {
+ setloop = 1;
k_set_loop(TRUE);
+ }
+ }
bzero(&sdst, sizeof(sdst));
sdst.sin_family = AF_INET;
@@ -333,7 +349,7 @@ send_igmp(src, dst, type, code, group, datalen)
inet_fmt(dst, s1), inet_fmt(src, s2));
}
- if (dst == allhosts_group || type == IGMP_HOST_MEMBERSHIP_QUERY)
+ if (setloop)
k_set_loop(FALSE);
log(LOG_DEBUG, 0, "SENT %s from %-15s to %s",