Merge branch 'for-5.12/google' into for-linus
[linux-2.6-microblaze.git] / net / ipv6 / seg6.c
index 37b4342..d2f8138 100644 (file)
@@ -25,7 +25,7 @@
 #include <net/seg6_hmac.h>
 #endif
 
-bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len)
+bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len, bool reduced)
 {
        unsigned int tlv_offset;
        int max_last_entry;
@@ -37,13 +37,17 @@ bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len)
        if (((srh->hdrlen + 1) << 3) != len)
                return false;
 
-       max_last_entry = (srh->hdrlen / 2) - 1;
-
-       if (srh->first_segment > max_last_entry)
+       if (!reduced && srh->segments_left > srh->first_segment) {
                return false;
+       } else {
+               max_last_entry = (srh->hdrlen / 2) - 1;
 
-       if (srh->segments_left > srh->first_segment + 1)
-               return false;
+               if (srh->first_segment > max_last_entry)
+                       return false;
+
+               if (srh->segments_left > srh->first_segment + 1)
+                       return false;
+       }
 
        tlv_offset = sizeof(*srh) + ((srh->first_segment + 1) << 4);