+ Replaced yang notifications with direct API call for reliability.
+ Removed duplicate code by replacing with Ipv6NaDecoder.
+ In ipv6-nd-util.yang, instead of "notification na-received",
neighbor-advertise-packet is augmented with packet-metadata. The
corresponding code has been updated.
+ This patch is dependent on Genius patch [0], hence it needs to be
merged along with [0].
JIRA: NETVIRT-1434
[0] https://git.opendaylight.org/gerrit/#/c/76221/
Change-Id: Ib29c36a4a80f920729f69facd67bd5e78b3b6329
Signed-off-by: Somashekar Byrappa <somashekar.b@altencalsoftlabs.com>
<modelVersion>4.0.0</modelVersion>
<dependencies>
+ <dependency>
+ <groupId>org.opendaylight.genius</groupId>
+ <artifactId>ipv6util-api</artifactId>
+ <version>${genius.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.mdsal.model</groupId>
<artifactId>ietf-inet-types-2013-07-15</artifactId>
--- /dev/null
+/*
+ * Copyright (c) 2018 Alten Calsoft Labs India Pvt Ltd. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.netvirt.ipv6service.api;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.NeighborAdvertisePacket;
+
+public interface IIpv6PacketListener {
+
+ /**
+ * On IPv6 Neighbor Advertisement packet received.
+ *
+ * @param naPacket the IPv6 NA packet
+ */
+ void onNaReceived(NeighborAdvertisePacket naPacket);
+}
*/
package org.opendaylight.netvirt.ipv6service;
-import com.google.common.util.concurrent.ListenableFuture;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.genius.ipv6util.api.Icmpv6Type;
import org.opendaylight.genius.ipv6util.api.Ipv6Constants;
import org.opendaylight.genius.ipv6util.api.Ipv6Constants.Ipv6RouterAdvertisementType;
import org.opendaylight.genius.ipv6util.api.Ipv6Util;
+import org.opendaylight.genius.ipv6util.api.decoders.Ipv6NaDecoder;
import org.opendaylight.genius.mdsalutil.MetaDataUtil;
import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.genius.mdsalutil.packet.IPProtocols;
import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.netvirt.ipv6service.api.IIpv6PacketListener;
import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceUtils;
import org.opendaylight.openflowplugin.libraries.liblldp.BitBufferHelper;
import org.opendaylight.openflowplugin.libraries.liblldp.BufferException;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.NeighborSolicitationPacketBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.RouterSolicitationPacket;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.RouterSolicitationPacketBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.NaReceivedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.PacketMetadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.PacketMetadataBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
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 org.opendaylight.yangtools.yang.binding.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final AtomicLong pktProccessedCounter = new AtomicLong(0);
private final PacketProcessingService pktService;
private final IfMgr ifMgr;
- private final NotificationPublishService notificationPublishService;
+ private final IIpv6PacketListener ipv6PktListener;
private final ExecutorService packetProcessor = Executors.newCachedThreadPool();
@Inject
- public Ipv6PktHandler(PacketProcessingService pktService, IfMgr ifMgr,
- NotificationPublishService notificationPublishService) {
+ public Ipv6PktHandler(PacketProcessingService pktService, IfMgr ifMgr, IIpv6PacketListener ipv6PktListener) {
this.pktService = pktService;
this.ifMgr = ifMgr;
- this.notificationPublishService = notificationPublishService;
+ this.ipv6PktListener = ipv6PktListener;
}
@Override
byte[] data = packet.getPayload();
NeighborAdvertisePacket naPdu;
try {
- naPdu = deserializeNAPacket(data);
+ naPdu = new Ipv6NaDecoder(data).decode();
} catch (UnknownHostException | BufferException e) {
LOG.warn("Exception occured during deserializing NA packet", e);
return;
long portTag = MetaDataUtil.getLportFromMetadata(metadata).intValue();
String interfaceName = ifMgr.getInterfaceNameFromTag(portTag);
- NaReceivedBuilder naReceivedBuilder = new NaReceivedBuilder().setSourceMac(naPdu.getSourceMac())
- .setDestinationMac(naPdu.getDestinationMac()).setSourceIpv6(naPdu.getSourceIpv6())
- .setDestinationIpv6(naPdu.getDestinationIpv6()).setTargetAddress(naPdu.getTargetAddress())
- .setTargetLlAddress(naPdu.getTargetLlAddress()).setOfTableId((long) tableId).setMetadata(metadata)
- .setInterface(interfaceName);
- fireNotification(naReceivedBuilder.build());
- }
-
- private NeighborAdvertisePacket deserializeNAPacket(byte[] data) throws BufferException, UnknownHostException {
- NeighborAdvertisePacketBuilder naPdu = new NeighborAdvertisePacketBuilder();
- int bitOffset = 0;
-
- naPdu.setDestinationMac(
- new MacAddress(Ipv6Util.bytesToHexString(BitBufferHelper.getBits(data, bitOffset, 48))));
- bitOffset = bitOffset + 48;
- naPdu.setSourceMac(
- new MacAddress(Ipv6Util.bytesToHexString(BitBufferHelper.getBits(data, bitOffset, 48))));
- bitOffset = bitOffset + 48;
- naPdu.setEthertype(BitBufferHelper.getInt(BitBufferHelper.getBits(data, bitOffset, 16)));
-
- bitOffset = Ipv6Constants.IP_V6_HDR_START;
- naPdu.setVersion(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 4)));
- bitOffset = bitOffset + 4;
- naPdu.setFlowLabel(BitBufferHelper.getLong(BitBufferHelper.getBits(data, bitOffset, 28)));
- bitOffset = bitOffset + 28;
- naPdu.setIpv6Length(BitBufferHelper.getInt(BitBufferHelper.getBits(data, bitOffset, 16)));
- bitOffset = bitOffset + 16;
- naPdu.setNextHeader(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- naPdu.setHopLimit(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- naPdu.setSourceIpv6(Ipv6Address.getDefaultInstance(
- InetAddress.getByAddress(BitBufferHelper.getBits(data, bitOffset, 128)).getHostAddress()));
- bitOffset = bitOffset + 128;
- naPdu.setDestinationIpv6(Ipv6Address.getDefaultInstance(
- InetAddress.getByAddress(BitBufferHelper.getBits(data, bitOffset, 128)).getHostAddress()));
- bitOffset = bitOffset + 128;
-
- naPdu.setIcmp6Type(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- naPdu.setIcmp6Code(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- naPdu.setIcmp6Chksum(BitBufferHelper.getInt(BitBufferHelper.getBits(data, bitOffset, 16)));
- bitOffset = bitOffset + 16;
- naPdu.setFlags(BitBufferHelper.getLong(BitBufferHelper.getBits(data, bitOffset, 32)));
- bitOffset = bitOffset + 32;
- naPdu.setTargetAddress(Ipv6Address.getDefaultInstance(
- InetAddress.getByAddress(BitBufferHelper.getBits(data, bitOffset, 128)).getHostAddress()));
-
- if (naPdu.getIpv6Length() > Ipv6Constants.ICMPV6_NA_LENGTH_WO_OPTIONS) {
- bitOffset = bitOffset + 128;
- naPdu.setOptionType(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- naPdu.setTargetAddrLength(BitBufferHelper.getShort(BitBufferHelper.getBits(data, bitOffset, 8)));
- bitOffset = bitOffset + 8;
- if (naPdu.getOptionType() == Ipv6Constants.ICMP_V6_OPTION_TARGET_LLA) {
- naPdu.setTargetLlAddress(new MacAddress(
- Ipv6Util.bytesToHexString(BitBufferHelper.getBits(data, bitOffset, 48))));
- }
- }
- return naPdu.build();
+ NeighborAdvertisePacket naPacket = new NeighborAdvertisePacketBuilder(naPdu)
+ .addAugmentation(PacketMetadata.class, new PacketMetadataBuilder().setOfTableId((long) tableId)
+ .setMetadata(metadata).setInterface(interfaceName).build())
+ .build();
+ fireNaNotification(naPacket);
}
}
- private void fireNotification(Notification notification) {
- ListenableFuture<?> offerNotification = notificationPublishService.offerNotification(notification);
- if (offerNotification != null && offerNotification.equals(NotificationPublishService.REJECTED)) {
- LOG.warn("Offered Notification was rejected: {}", notification);
- }
+ private void fireNaNotification(NeighborAdvertisePacket naPacket) {
+ ipv6PktListener.onNaReceived(naPacket);
}
@Override
interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService" />
<reference id="jobCoordinator"
interface="org.opendaylight.infrautils.jobcoordinator.JobCoordinator" />
- <reference id="notificationPublishService"
- interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService" />
+ <reference id="iIpv6PacketListener"
+ interface="org.opendaylight.netvirt.ipv6service.api.IIpv6PacketListener" />
<odl:rpc-service id="odlInterfaceRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.genius.ipv6util.api.Ipv6Util;
+import org.opendaylight.genius.ipv6util.api.decoders.Ipv6NaDecoder;
import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
+import org.opendaylight.netvirt.ipv6service.api.IIpv6PacketListener;
import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceConstants;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.NaReceived;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.NaReceivedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.NeighborAdvertisePacket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.NeighborAdvertisePacketBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.PacketMetadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.PacketMetadataBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
private PacketProcessingService pktProcessService;
private Ipv6PktHandler pktHandler;
private IfMgr ifMgrInstance;
- private NotificationPublishService notificationPublishService;
+ private IIpv6PacketListener ipv6PktListener;
private long counter;
private static final int THREAD_WAIT_TIME = 100;
private Ipv6TestUtils ipv6TestUtils;
public void initTest() {
pktProcessService = Mockito.mock(PacketProcessingService.class);
ifMgrInstance = Mockito.mock(IfMgr.class);
- notificationPublishService = Mockito.mock(NotificationPublishService.class);
- pktHandler = new Ipv6PktHandler(pktProcessService, ifMgrInstance, notificationPublishService);
+ ipv6PktListener = Mockito.mock(IIpv6PacketListener.class);
+ pktHandler = new Ipv6PktHandler(pktProcessService, ifMgrInstance, ipv6PktListener);
counter = pktHandler.getPacketProcessedCounter();
ipv6TestUtils = new Ipv6TestUtils();
}
BigInteger mdata = new BigInteger(String.valueOf(0x1000000));
Metadata metadata = new MetadataBuilder().setMetadata(mdata).build();
MatchBuilder matchbuilder = new MatchBuilder().setMetadata(metadata);
- pktHandler.onPacketReceived(new PacketReceivedBuilder().setPayload(ipv6TestUtils.buildPacket(
+ byte[] data = ipv6TestUtils.buildPacket(
"FA 16 3E F7 69 4E", // Destination MAC
"FA 16 3E A9 38 94", // Source MAC
"86 DD", // IPv6
"02", // ICMPv6 Option: Target Link Layer Address
"01", // Length
"FA 16 3E A9 38 94" // Link Layer Address
- )).setIngress(ncRef).setMatch(matchbuilder.build()).setTableId(new TableId((short) 45)).build());
+ );
+ pktHandler.onPacketReceived(new PacketReceivedBuilder().setPayload(data).setIngress(ncRef)
+ .setMatch(matchbuilder.build()).setTableId(new TableId((short) 45)).build());
//wait on this thread until the async job is completed in the packet handler.
waitForPacketProcessing();
- NaReceivedBuilder naReceivedBuilder = new NaReceivedBuilder().setSourceMac(new MacAddress("fa:16:3e:a9:38:94"))
- .setDestinationMac(new MacAddress("fa:16:3e:f7:69:4e"))
- .setSourceIpv6(Ipv6Address.getDefaultInstance("2001:db8:0:2:0:0:0:1111"))
- .setDestinationIpv6(Ipv6Address.getDefaultInstance("1001:db8:0:2:f816:3eff:fef7:694e"))
- .setTargetAddress(Ipv6Address.getDefaultInstance("2001:db8:0:2:0:0:0:1111"))
- .setTargetLlAddress(new MacAddress("fa:16:3e:a9:38:94")).setOfTableId(45L).setMetadata(mdata)
- .setInterface("ddec9dba-d831-4ad7-84b9-00d7f65f052f");
- verify(notificationPublishService).offerNotification(naReceivedBuilder.build());
+ NeighborAdvertisePacket naPdu = new Ipv6NaDecoder(data).decode();
+ NeighborAdvertisePacket naPacket =
+ new NeighborAdvertisePacketBuilder(naPdu)
+ .addAugmentation(PacketMetadata.class, new PacketMetadataBuilder().setOfTableId((long) 45)
+ .setMetadata(mdata).setInterface("ddec9dba-d831-4ad7-84b9-00d7f65f052f").build())
+ .build();
+ verify(ipv6PktListener).onNaReceived(naPacket);
}
@Test
"10 01 0D B8 00 00 00 02 F8 16 3E FF FE F7 69 4E", // Destination IP
"88", // ICMPv6 neighbor advertisement
"00", // Code
- "C9 9A", // Checksum (valid)
+ "C9 9A", // Checksum (invalid)
"00 00 00 00", // ICMPv6 message body
"20 01 0D B8 00 00 00 02 00 00 00 00 00 00 11 11", // Target
"02", // ICMPv6 Option: Target Link Layer Address
)).setIngress(ncRef).setMatch(matchbuilder.build()).setTableId(new TableId((short) 45)).build());
//wait on this thread until the async job is completed in the packet handler.
waitForPacketProcessing();
- verify(notificationPublishService, times(0)).offerNotification(any(NaReceived.class));
+ verify(ipv6PktListener, times(0)).onNaReceived(any(NeighborAdvertisePacket.class));
// incorrect ICMPv6 type
pktHandler.onPacketReceived(new PacketReceivedBuilder().setPayload(ipv6TestUtils.buildPacket(
)).setIngress(ncRef).setMatch(matchbuilder.build()).setTableId(new TableId((short) 45)).build());
//wait on this thread until the async job is completed in the packet handler.
waitForPacketProcessing();
- verify(notificationPublishService, times(0)).offerNotification(any(NaReceived.class));
+ verify(ipv6PktListener, times(0)).onNaReceived(any(NeighborAdvertisePacket.class));
}
private void waitForPacketProcessing() throws InterruptedException {
<artifactId>ipv6util-api</artifactId>
<version>${genius.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>ipv6service-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.serviceutils</groupId>
<artifactId>upgrade</artifactId>
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.mdsalutil.NWUtil;
import org.opendaylight.netvirt.neutronvpn.api.enums.IpVersionChoice;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefixBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortEventAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort;
// temp where Key is VPNInstance+IP and value is timestamp
private final Cache<Pair<String, String>, BigInteger> migrateIpCache;
- protected final DataBroker dataBroker;
- protected final IdManagerService idManager;
- protected final IInterfaceManager interfaceManager;
protected final VpnConfig config;
protected final VpnUtil vpnUtil;
protected final INeutronVpnManager neutronVpnManager;
- public AbstractIpLearnNotificationHandler(DataBroker dataBroker, IdManagerService idManager,
- IInterfaceManager interfaceManager, VpnConfig vpnConfig,
- VpnUtil vpnUtil, INeutronVpnManager neutronVpnManager) {
- this.dataBroker = dataBroker;
- this.idManager = idManager;
- this.interfaceManager = interfaceManager;
+ public AbstractIpLearnNotificationHandler(VpnConfig vpnConfig, VpnUtil vpnUtil,
+ INeutronVpnManager neutronVpnManager) {
this.config = vpnConfig;
this.vpnUtil = vpnUtil;
this.neutronVpnManager = neutronVpnManager;
import java.math.BigInteger;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.netvirt.vpnmanager.VpnUtil;
import org.opendaylight.netvirt.vpnmanager.iplearn.AbstractIpLearnNotificationHandler;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.ArpResponseReceived;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.MacChanged;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.config.rev161130.VpnConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(ArpNotificationHandler.class);
@Inject
- public ArpNotificationHandler(DataBroker dataBroker, IdManagerService idManager,
- IInterfaceManager interfaceManager, VpnConfig vpnConfig,
- VpnUtil vpnUtil, INeutronVpnManager neutronVpnManager) {
- super(dataBroker, idManager, interfaceManager, vpnConfig, vpnUtil, neutronVpnManager);
+ public ArpNotificationHandler(VpnConfig vpnConfig, VpnUtil vpnUtil, INeutronVpnManager neutronVpnManager) {
+ super(vpnConfig, vpnUtil, neutronVpnManager);
}
@Override
import java.math.BigInteger;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.netvirt.ipv6service.api.IIpv6PacketListener;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.netvirt.vpnmanager.VpnUtil;
import org.opendaylight.netvirt.vpnmanager.iplearn.AbstractIpLearnNotificationHandler;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.Ipv6NdUtilListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.NaReceived;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.packet.rev160620.NeighborAdvertisePacket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.PacketMetadata;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.config.rev161130.VpnConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
-public class Ipv6NaNotificationHandler extends AbstractIpLearnNotificationHandler implements Ipv6NdUtilListener {
+public class Ipv6NaPacketListener extends AbstractIpLearnNotificationHandler implements IIpv6PacketListener {
- private static final Logger LOG = LoggerFactory.getLogger(Ipv6NaNotificationHandler.class);
+ private static final Logger LOG = LoggerFactory.getLogger(Ipv6NaPacketListener.class);
@Inject
- public Ipv6NaNotificationHandler(DataBroker dataBroker, IdManagerService idManager,
- IInterfaceManager interfaceManager, VpnConfig vpnConfig,
- VpnUtil vpnUtil, INeutronVpnManager neutronVpnManager) {
- super(dataBroker, idManager, interfaceManager, vpnConfig, vpnUtil, neutronVpnManager);
+ public Ipv6NaPacketListener(VpnConfig vpnConfig, VpnUtil vpnUtil, INeutronVpnManager neutronVpnManager) {
+ super(vpnConfig, vpnUtil, neutronVpnManager);
}
@Override
- public void onNaReceived(NaReceived naPacket) {
- String srcInterface = naPacket.getInterface();
+ public void onNaReceived(NeighborAdvertisePacket naPacket) {
+ PacketMetadata pktMetadata = naPacket.augmentation(PacketMetadata.class);
+ if (pktMetadata == null) {
+ return;
+ }
+ String srcInterface = pktMetadata.getInterface();
IpAddress srcIP = new IpAddress(naPacket.getSourceIpv6());
MacAddress srcMac = naPacket.getSourceMac();
IpAddress targetIP = new IpAddress(naPacket.getTargetAddress());
- BigInteger metadata = naPacket.getMetadata();
+ BigInteger metadata = pktMetadata.getMetadata();
LOG.debug("NA notification received from interface {} and IP {} having MAC {}, targetIP={}", srcInterface,
srcIP.stringValue(), srcMac.getValue(), targetIP.stringValue());
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilListener" />
<odl:notification-listener ref="arpNotificationHandler" />
- <service ref="ipv6NaNotificationHandler" odl:type="default"
- interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.ipv6.nd.util.rev170210.Ipv6NdUtilListener" />
- <odl:notification-listener ref="ipv6NaNotificationHandler" />
+ <service ref="ipv6NaPacketListener"
+ interface="org.opendaylight.netvirt.ipv6service.api.IIpv6PacketListener" />
<service ref="vpnManagerImpl"
interface="org.opendaylight.netvirt.vpnmanager.api.IVpnManager" />