Advertise prefix info for dhcpv6-stateful subnets 66/41266/1 topic/routermanager
authorSridhar Gaddam <sgaddam@redhat.com>
Mon, 4 Jul 2016 09:39:23 +0000 (15:09 +0530)
committerSridhar Gaddam <sgaddam@redhat.com>
Mon, 4 Jul 2016 09:39:48 +0000 (15:09 +0530)
Radvd has to advertise the prefix info even for DHCPv6
Stateful Subnets with on-link flag.

Change-Id: Ib9f5cdf236f4e88dfccb3ce0208bc007818fa1b4
Signed-off-by: Sridhar Gaddam <sgaddam@redhat.com>
routemgr/routemgr-impl/src/main/java/org/opendaylight/netvirt/routemgr/net/PktHandler.java
routemgr/routemgr-impl/src/test/java/org/opendaylight/netvirt/routemgr/net/PktHandlerTest.java

index 7658abde95bd6ed257a8620b78208d9e2aa974da..9c80e27db466cc0960a6ced00fe1dd303b3e328b 100644 (file)
@@ -301,10 +301,12 @@ public class PktHandler implements PacketProcessingListener {
                                       MacAddress vmMac, VirtualPort routerPort) {
             RoutemgrUtil instance = RoutemgrUtil.getInstance();
             short icmpv6RaFlags = 0;
-            short prefixFlags = 0;
+            short autoConfPrefixFlags = 0;
+            short statefulPrefixFlags = 0;
             String gatewayMac = null;
             IpAddress gatewayIp;
-            List<String> prefixList = new ArrayList<String>();
+            List<String> autoConfigPrefixList = new ArrayList<String>();
+            List<String> statefulConfigPrefixList = new ArrayList<String>();
 
             for (VirtualSubnet subnet : routerPort.getSubnets()) {
                 gatewayIp = subnet.getGatewayIp();
@@ -312,11 +314,14 @@ public class PktHandler implements PacketProcessingListener {
                 if (gatewayIp.getIpv4Address() != null)
                     continue;
 
-                if (((!subnet.getIpv6AddressMode().isEmpty())
-                        && (ifMgr.IPV6_AUTO_ADDRESS_SUBNETS.contains(subnet.getIpv6AddressMode())))
-                    || ((!subnet.getIpv6RAMode().isEmpty())
-                        && (ifMgr.IPV6_AUTO_ADDRESS_SUBNETS.contains(subnet.getIpv6RAMode())))) {
-                    prefixList.add(String.valueOf(subnet.getSubnetCidr().getValue()));
+                if (!subnet.getIpv6RAMode().isEmpty()) {
+                    if (ifMgr.IPV6_AUTO_ADDRESS_SUBNETS.contains(subnet.getIpv6RAMode())) {
+                        autoConfigPrefixList.add(String.valueOf(subnet.getSubnetCidr().getValue()));
+                    }
+
+                    if (subnet.getIpv6RAMode().equalsIgnoreCase(ifMgr.IPV6_DHCPV6_STATEFUL)) {
+                        statefulConfigPrefixList.add(String.valueOf(subnet.getSubnetCidr().getValue()));
+                    }
                 }
 
                 if (subnet.getIpv6RAMode().equalsIgnoreCase(ifMgr.IPV6_DHCPV6_STATELESS)) {
@@ -335,8 +340,9 @@ public class PktHandler implements PacketProcessingListener {
 
             raPacket.setVersion(pdu.getVersion());
             raPacket.setFlowLabel(pdu.getFlowLabel());
+            int prefixListLength = autoConfigPrefixList.size() + statefulConfigPrefixList.size();
             raPacket.setIpv6Length(ICMPV6_RA_LENGTH_WO_OPTIONS + ICMPV6_OPTION_SOURCE_LLA_LENGTH
-                    + prefixList.size() * ICMPV6_OPTION_PREFIX_LENGTH);
+                    + prefixListLength * ICMPV6_OPTION_PREFIX_LENGTH);
             raPacket.setNextHeader(pdu.getNextHeader());
             raPacket.setHopLimit(RoutemgrUtil.ICMPv6_MAX_HOP_LIMIT);
             raPacket.setSourceIpv6(instance.getIpv6LinkLocalAddressFromMac(sourceMac));
@@ -362,14 +368,21 @@ public class PktHandler implements PacketProcessingListener {
             prefix.setOptionLength((short)4);
             // Note: EUI-64 auto-configuration requires 64 bits.
             prefix.setPrefixLength((short)64);
-            prefixFlags = (short) (prefixFlags | (1 << 7)); // On-link flag
-            prefixFlags = (short) (prefixFlags | (1 << 6)); // Autonomous address-configuration flag.
-            prefix.setFlags((short)prefixFlags);
             prefix.setValidLifetime((long) IPV6_RA_VALID_LIFETIME);
             prefix.setPreferredLifetime((long) IPV6_RA_PREFERRED_LIFETIME);
             prefix.setReserved((long) 0);
 
-            for (String v6Prefix : prefixList) {
+            autoConfPrefixFlags = (short) (autoConfPrefixFlags | (1 << 7)); // On-link flag
+            autoConfPrefixFlags = (short) (autoConfPrefixFlags | (1 << 6)); // Autonomous address-configuration flag.
+            for (String v6Prefix : autoConfigPrefixList) {
+                prefix.setFlags((short)autoConfPrefixFlags);
+                prefix.setPrefix(new Ipv6Prefix(v6Prefix));
+                pList.add(prefix.build());
+            }
+
+            statefulPrefixFlags = (short) (statefulPrefixFlags | (1 << 7)); // On-link flag
+            for (String v6Prefix : statefulConfigPrefixList) {
+                prefix.setFlags((short)statefulPrefixFlags);
                 prefix.setPrefix(new Ipv6Prefix(v6Prefix));
                 pList.add(prefix.build());
             }
index 99a5f19176383cf00ef207332a448b4c9fb7851a..7969b4828540318e62d99df636807ab3e46d7e68 100644 (file)
@@ -8,6 +8,11 @@
 
 package org.opendaylight.netvirt.routemgr.net;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -20,15 +25,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceivedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.*;
-
 public class PktHandlerTest {
     private PacketProcessingService pktProcessService;
     private PktHandler pktHandler;
@@ -364,9 +367,17 @@ public class PktHandlerTest {
         v6Subnet2.setIpv6RAMode(ifMgrInstance.IPV6_DHCPV6_STATELESS);
         v6Subnet2.setSubnetCidr(new IpPrefix("2001:db8:2222::/64".toCharArray()));
 
+        VirtualSubnet v6Subnet3 = new VirtualSubnet();
+        v6Subnet3.setRouter(vRouter);
+        v6Subnet3.setGatewayIp(gwIpAddress);
+        v6Subnet3.setIpv6AddressMode(ifMgrInstance.IPV6_DHCPV6_STATEFUL);
+        v6Subnet3.setIpv6RAMode(ifMgrInstance.IPV6_DHCPV6_STATEFUL);
+        v6Subnet3.setSubnetCidr(new IpPrefix("2001:db8:3333::/64".toCharArray()));
+
         List<VirtualSubnet> subnetList = new ArrayList<>();
         subnetList.add(v6Subnet1);
         subnetList.add(v6Subnet2);
+        subnetList.add(v6Subnet3);
         when(intf.getSubnets()).thenReturn(subnetList);
 
         InstanceIdentifier<Node> ncId = InstanceIdentifier.builder(Nodes.class)
@@ -377,16 +388,16 @@ public class PktHandlerTest {
                 "50 7B 9D 78 54 F3",                               // Source MAC
                 "86 DD",                                           // IPv6
                 "60 00 00 00",                                     // Version 6, traffic class E0, no flowlabel
-                "00 58",                                           // Payload length
+                "00 78",                                           // Payload length
                 "3A",                                              // Next header is ICMPv6
                 "FF",                                              // Hop limit
                 "FE 80 00 00 00 00 00 00 52 7B 9D FF FE 78 54 F3", // Source IP
                 "FE 80 00 00 00 00 00 00 F8 16 3E FF FE 69 2C F3", // Destination IP
                 "86",                                              // ICMPv6 router advertisement.
                 "00",                                              // Code
-                "9A C4",                                           // Checksum (valid)
+                "2E 03",                                           // Checksum (valid)
                 "40",                                              // Current Hop Limit
-                "40",                                              // ICMPv6 RA Flags
+                "C0",                                              // ICMPv6 RA Flags
                 "11 94",                                           // Router Lifetime
                 "00 00 00 00",                                     // Reachable time
                 "00 00 00 00",                                     // Retransmission time.
@@ -408,7 +419,15 @@ public class PktHandlerTest {
                 "00 27 8D 00",                                     // Valid lifetime
                 "00 09 3A 80",                                     // Preferred lifetime
                 "00 00 00 00",                                     // Reserved
-                "20 01 0D B8 22 22 00 00 00 00 00 00 00 00 00 00"  // Prefix
+                "20 01 0D B8 22 22 00 00 00 00 00 00 00 00 00 00", // Prefix
+                "03",                                              // Type: Prefix Information
+                "04",                                              // Option length
+                "40",                                              // Prefix length
+                "80",                                              // Prefix flags
+                "00 27 8D 00",                                     // Valid lifetime
+                "00 09 3A 80",                                     // Preferred lifetime
+                "00 00 00 00",                                     // Reserved
+                "20 01 0D B8 33 33 00 00 00 00 00 00 00 00 00 00"  // Prefix
         );
 
         pktHandler.onPacketReceived(new PacketReceivedBuilder().setPayload(buildPacket(