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();
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)) {
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));
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());
}
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;
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;
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)
"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.
"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(