git: plan9front

Download patch

ref: 68a98ec9d1cf1c7050e1de66e30a15e2478fdaa5
parent: dc85e6d01a919c9669f6f0210a2a5e7438a6ba69
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue May 28 14:16:44 EDT 2024

devip: don't send and ignore MLD messages for invalid multicast groups

RFC2710 states that MLD messages should never
be sent for scope 0 and 1 mcast addresses
as well as FF02::1.

--- a/sys/src/9/ip/igmp.c
+++ b/sys/src/9/ip/igmp.c
@@ -128,6 +128,25 @@
 	ipoput4(f, bp, nil, 1, DFLTTOS, nil);	/* TTL of 1 */
 }
 
+static int
+mldvalidgroup(uchar *group)
+{
+	if(ipismulticast(group) != V6)
+		return 0;
+
+	/*
+	 * MLD messages are never sent for multicast addresses
+	 * whos scope is 0 (reserved) or 1 (node-local).
+	 * MLD messages ARE sent for multicast addresses whose
+	 * scope is 2 (link-local) ... except all-nodes address.
+	 */
+	if((group[1] & 0xF) < Link_local_scop
+	|| ipcmp(group, v6allnodesL) == 0)
+		return 0;
+
+	return 1;
+}
+
 static void
 mldsendreport(Fs *f, uchar *src, uchar *dst, uchar *group, int done)
 {
@@ -137,6 +156,9 @@
 	if(!islinklocal(src))
 		return;
 
+	if(!mldvalidgroup(group))
+		return;
+
 	bp = allocb(sizeof(mldhbhopt)+MLDPKTSZ);
 	bp->wp += sizeof(mldhbhopt)+MLDPKTSZ;
 	bp->rp += sizeof(mldhbhopt);
@@ -358,8 +380,7 @@
 	hnputs(p->ploadlen, MLDPKTSZ-IP6HDR);
 	if(ptclcsum(bp, 0, MLDPKTSZ))
 		goto error;
-
-	if(ipcmp(p->group, IPnoaddr) != 0 && ipismulticast(p->group) != V6)
+	if(ipcmp(p->group, IPnoaddr) != 0 && !mldvalidgroup(p->group))
 		goto error;
 
 	switch(p->type){
--