Rate limiting for subnet route punt packets 80/72080/4
authorRavindra Thakur <ravindra.nath.thakur@ericsson.com>
Fri, 18 May 2018 06:27:37 +0000 (11:57 +0530)
committerSam Hague <shague@redhat.com>
Fri, 8 Jun 2018 00:55:06 +0000 (00:55 +0000)
Adds a learn action for subnet route punt flow which installs a learn
flow with higher prirority than the punt flow and matches on dst ip
+ vpn id and drops the matching packets till the flow is deleted after
hard timeout expiry.

spec link:
http://docs.opendaylight.org/projects/netvirt/en/latest/specs/fluorine/controller-punt-protection.html

Issue: NETVIRT-1218

Depends-On: https://git.opendaylight.org/gerrit/#/c/72006/
Depends-On: https://git.opendaylight.org/gerrit/#/c/72007/

Change-Id: I6874f56179256933120606e45edc153654b73d33
Signed-off-by: Ravindra Thakur <ravindra.nath.thakur@ericsson.com>
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java
vpnmanager/impl/src/main/resources/initial/netvirt-vpnmanager-config.xml

index fd416527a25d19f72931d1da656c4f2f27b8b1c0..7095e14e74c32efc135ffad26fafd0cee445deb0 100644 (file)
@@ -27,7 +27,10 @@ import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MatchInfo;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.NwConstants.NxmOfFieldType;
+import org.opendaylight.genius.mdsalutil.actions.ActionLearn;
 import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
 import org.opendaylight.genius.mdsalutil.actions.ActionPuntToController;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
@@ -39,6 +42,7 @@ import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
 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.netvirt.vpn.config.rev161130.VpnConfig;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,15 +58,18 @@ public class VpnNodeListener extends AsyncClusteredDataTreeChangeListenerBase<No
     private final IMdsalApiManager mdsalManager;
     private final JobCoordinator jobCoordinator;
     private final List<BigInteger> connectedDpnIds;
+    private final VpnConfig vpnConfig;
 
     @Inject
-    public VpnNodeListener(DataBroker dataBroker, IMdsalApiManager mdsalManager, JobCoordinator jobCoordinator) {
+    public VpnNodeListener(DataBroker dataBroker, IMdsalApiManager mdsalManager, JobCoordinator jobCoordinator,
+                           VpnConfig vpnConfig) {
         super(Node.class, VpnNodeListener.class);
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
         this.jobCoordinator = jobCoordinator;
         this.connectedDpnIds = new CopyOnWriteArrayList<>();
+        this.vpnConfig = vpnConfig;
     }
 
     @PostConstruct
@@ -162,8 +169,26 @@ public class VpnNodeListener extends AsyncClusteredDataTreeChangeListenerBase<No
         List<ActionInfo> actionsInfos = new ArrayList<>();
         List<InstructionInfo> instructions = new ArrayList<>();
         actionsInfos.add(new ActionPuntToController());
+        int learnTimeout = vpnConfig.getSubnetRoutePuntTimeout().intValue();
+        if (learnTimeout != 0) {
+            actionsInfos.add(new ActionLearn(0, learnTimeout, VpnConstants.DEFAULT_FLOW_PRIORITY, cookieTableMiss,
+                    0, NwConstants.L3_SUBNET_ROUTE_TABLE, 0, 0,
+                    Arrays.asList(
+                            new ActionLearn.MatchFromValue(NwConstants.ETHTYPE_IPV4,
+                                    NwConstants.NxmOfFieldType.NXM_OF_ETH_TYPE.getType(),
+                                    NwConstants.NxmOfFieldType.NXM_OF_ETH_TYPE.getFlowModHeaderLenInt()),
+                            new ActionLearn.MatchFromField(NwConstants.NxmOfFieldType.NXM_OF_IP_DST.getType(),
+                                    NwConstants.NxmOfFieldType.NXM_OF_IP_DST.getType(),
+                                    NwConstants.NxmOfFieldType.NXM_OF_IP_DST.getFlowModHeaderLenInt()),
+                            new ActionLearn.MatchFromField(NxmOfFieldType.OXM_OF_METADATA.getType(),
+                                    MetaDataUtil.METADATA_VPN_ID_OFFSET,
+                                    NxmOfFieldType.OXM_OF_METADATA.getType(), MetaDataUtil.METADATA_VPN_ID_OFFSET,
+                                    MetaDataUtil.METADATA_VPN_ID_BITLEN))));
+        }
+
         instructions.add(new InstructionApplyActions(actionsInfos));
         List<MatchInfo> matches = new ArrayList<>();
+        matches.add(MatchEthernetType.IPV4);
         String flowRef = getTableMissFlowRef(dpnId, NwConstants.L3_SUBNET_ROUTE_TABLE, NwConstants.TABLE_MISS_FLOW);
         FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, NwConstants.L3_SUBNET_ROUTE_TABLE, flowRef,
             NwConstants.TABLE_MISS_PRIORITY, "Subnet Route Table Miss", 0, 0, cookieTableMiss, matches, instructions);
index 3870a1cc9cb11edce945df735345247f5de3880e..0046ed1b262bbbedb5a993ea792dcfc61fc7668b 100644 (file)
@@ -1,4 +1,5 @@
 <vpnmanager-config xmlns="urn:opendaylight:netvirt:vpn:config">
   <arp-cache-size>10000</arp-cache-size>
   <arp-learn-timeout>2000</arp-learn-timeout>
+  <subnet-route-punt-timeout>10</subnet-route-punt-timeout>
 </vpnmanager-config>