Fixing issues with ARP integration of VpnService 83/32183/3
authorFaseela K <faseela.k@ericsson.com>
Wed, 6 Jan 2016 11:55:18 +0000 (17:25 +0530)
committerFaseela K <faseela.k@ericsson.com>
Thu, 7 Jan 2016 06:34:20 +0000 (12:04 +0530)
  - Table 0 and Table 80 metadata were not matching
  - co relating interfaceName to nodeConnector was using the wrong datastore

Signed-off-by: Faseela K <faseela.k@ericsson.com>
mit.

Change-Id: I8115c7a5db02cc26b3612efd2395127ee702a442
Signed-off-by: Faseela K <faseela.k@ericsson.com>
arputil/arputil-impl/src/main/java/org/opendaylight/vpnservice/arputil/internal/ArpUtilImpl.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALUtil.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java

index 45f6824ef61b615295f9d73394b154d2a9f25d24..772b7811cbcf80753d4b19600a2dad25b8943611 100644 (file)
@@ -14,6 +14,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
@@ -34,6 +35,7 @@ import org.opendaylight.vpnservice.mdsalutil.packet.ARP;
 import org.opendaylight.vpnservice.mdsalutil.packet.Ethernet;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
@@ -100,6 +102,8 @@ public class ArpUtilImpl implements OdlArputilService,
 
     private static final short ARP_RESPONSE_OP = (short) 2;
 
+    private static final short ETH_TYPE_ARP = 0x0806;
+
     private static final Logger LOGGER = LoggerFactory
             .getLogger(ArpUtilImpl.class);
 
@@ -237,7 +241,7 @@ public class ArpUtilImpl implements OdlArputilService,
                 interfaceName = interfaceAddress.getInterface();
                 srcIpBytes = getIpAddressBytes(interfaceAddress.getIpAddress());
 
-                NodeConnectorId id = getNodeConnectorFromDataStore(interfaceName);
+                NodeConnectorId id = getNodeConnectorFromInterfaceName(interfaceName);
 
                 dpnId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(id));
                 Long portid = MDSALUtil.getOfPortNumberFromPortName(id);
@@ -322,7 +326,7 @@ public class ArpUtilImpl implements OdlArputilService,
 
         try {
             String interfaceName = input.getInterface();
-            NodeConnectorId id = getNodeConnectorFromDataStore(interfaceName);
+            NodeConnectorId id = getNodeConnectorFromInterfaceName(interfaceName);
 
             dpnId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(id));
             Long portid = MDSALUtil.getOfPortNumberFromPortName(id);
@@ -384,8 +388,7 @@ public class ArpUtilImpl implements OdlArputilService,
 
                 ethernet.deserialize(data, 0, data.length
                         * NetUtils.NumBitsInAByte);
-                if (ethernet.getEtherType() != ARP_REQUEST_OP
-                        && ethernet.getEtherType() != ARP_REQUEST_OP) {
+                if (ethernet.getEtherType() != ETH_TYPE_ARP) {
                     return;
                 }
 
@@ -524,15 +527,24 @@ public class ArpUtilImpl implements OdlArputilService,
     }
 
 
-    private NodeConnectorId getNodeConnectorFromDataStore(String interfaceName) {
-        InstanceIdentifier<Interface> id = buildInterfaceId(interfaceName);
-        Optional<Interface> interf = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.CONFIGURATION,
-                id);
-        if (interf.isPresent()) {
-            return interf.get().getAugmentation(BaseIds.class).getOfPortId();
+    private NodeConnectorId getNodeConnectorFromInterfaceName(String interfaceName) {
+        InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> idBuilder =
+                InstanceIdentifier.builder(InterfacesState.class)
+                        .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class,
+                                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId = idBuilder.build();
+
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateOptional = MDSALUtil.read(dataBroker,
+                LogicalDatastoreType.OPERATIONAL,
+                ifStateId);
+
+        if (ifStateOptional.isPresent()) {
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = ifStateOptional.get();
+            List<String> lowerLayerIf = ifState.getLowerLayerIf();
+            if (!lowerLayerIf.isEmpty()) {
+                return new NodeConnectorId(lowerLayerIf.get(0));
+            }
         }
         return null;
     }
-
 }
index c483f450c5e3d9c2c8ddb2fcc3ab9e48f0e6c647..41e66bfce3ff7266d21d7df1be9495e30ab1bc67 100644 (file)
@@ -483,8 +483,11 @@ public class MDSALUtil {
             NodeConnectorRef ref) {
         Optional<NodeConnector> nc = (Optional<NodeConnector>) read(
                 dataBroker,
-                LogicalDatastoreType.CONFIGURATION, ref.getValue());
-        return nc.get().getId();
+                LogicalDatastoreType.OPERATIONAL, ref.getValue());
+        if(nc.isPresent()){
+            return nc.get().getId();
+        }
+        return null;
     }
 
 }
index b82d687325786b59cb28048115d169330892dc98..c407fb433ecec0f785deb21a81e7bec642249c0a 100644 (file)
@@ -286,7 +286,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
     private void makeArpFlow(short sIndex, int lPortTag, String vpnInterfaceName, long vpnId, ArpReplyOrRequest replyOrRequest, int addOrRemoveFlow){
         List<MatchInfo> matches = new ArrayList<MatchInfo>();
-        BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(lPortTag, sIndex, BigInteger.valueOf(vpnId));
+        BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(lPortTag, ++sIndex, BigInteger.valueOf(vpnId));
         BigInteger metadataMask = MetaDataUtil.getMetaDataMaskForLPortDispatcher(MetaDataUtil.METADATA_MASK_SERVICE_INDEX,
                 MetaDataUtil.METADATA_MASK_LPORT_TAG, MetaDataUtil.METADATA_MASK_VRFID);