import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.genius.mdsalutil.packet.Ethernet;
import org.opendaylight.genius.mdsalutil.packet.IPv4;
+import org.opendaylight.infrautils.metrics.Counter;
+import org.opendaylight.infrautils.metrics.Labeled;
+import org.opendaylight.infrautils.metrics.MetricDescriptor;
+import org.opendaylight.infrautils.metrics.MetricProvider;
import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
import org.opendaylight.netvirt.vpnmanager.api.ICentralizedSwitchProvider;
import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
import org.opendaylight.netvirt.vpnmanager.iplearn.ipv4.ArpUtils;
-import org.opendaylight.netvirt.vpnmanager.utilities.VpnManagerCounters;
+import org.opendaylight.netvirt.vpnmanager.utilities.CounterUtility;
import org.opendaylight.openflowplugin.libraries.liblldp.BitBufferHelper;
import org.opendaylight.openflowplugin.libraries.liblldp.BufferException;
import org.opendaylight.openflowplugin.libraries.liblldp.HexEncode;
private final OdlInterfaceRpcService odlInterfaceRpcService;
private final ICentralizedSwitchProvider centralizedSwitchProvider;
private final IInterfaceManager interfaceManager;
- private final VpnManagerCounters vpnManagerCounters;
private final Ipv6NdUtilService ipv6NdUtilService;
+ private final Labeled<Labeled<Counter>> packetInCounter;
private final VpnUtil vpnUtil;
@Inject
public SubnetRoutePacketInHandler(final DataBroker dataBroker, final PacketProcessingService packetService,
final OdlInterfaceRpcService odlInterfaceRpcService,
final ICentralizedSwitchProvider centralizedSwitchProvider, final IInterfaceManager interfaceManager,
- VpnManagerCounters vpnManagerCounters, final Ipv6NdUtilService ipv6NdUtilService, VpnUtil vpnUtil) {
+ final Ipv6NdUtilService ipv6NdUtilService, MetricProvider metricProvider, VpnUtil vpnUtil) {
this.dataBroker = dataBroker;
this.packetService = packetService;
this.odlInterfaceRpcService = odlInterfaceRpcService;
this.centralizedSwitchProvider = centralizedSwitchProvider;
this.interfaceManager = interfaceManager;
- this.vpnManagerCounters = vpnManagerCounters;
this.ipv6NdUtilService = ipv6NdUtilService;
+ packetInCounter = metricProvider.newCounter(MetricDescriptor.builder().anchor(this)
+ .project(CounterUtility.getProject()).module(CounterUtility.getModule())
+ .id(CounterUtility.getSubnetRouteId()).build(), "action","sourceIp.destinationIp");
this.vpnUtil = vpnUtil;
}
res.deserialize(data, 0, data.length * Byte.SIZE);
} catch (PacketException e) {
LOG.error("{} onPacketReceived: Failed to decode Packet ", LOGGING_PREFIX, e);
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(CounterUtility.getSubnetRouteInvalidPacket());
+ counter.increment();
return;
}
byte[] srcIpBytes = null;
IPv4 ipv4 = (IPv4) pkt;
srcIpBytes = Ints.toByteArray(ipv4.getSourceAddress());
dstIpBytes = Ints.toByteArray(ipv4.getDestinationAddress());
+ srcIpStr = NWUtil.toStringIpAddress(srcIpBytes);
+ dstIpStr = NWUtil.toStringIpAddress(dstIpBytes);
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_recived.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
// It is an ARP request on a configured VPN. So we must
// attempt to respond.
} else {
LOG.trace("{} onPacketReceived: Non-IP packet received as {}", LOGGING_PREFIX, notification);
return;
}
- srcIpStr = NWUtil.toStringIpAddress(srcIpBytes);
- dstIpStr = NWUtil.toStringIpAddress(dstIpBytes);
+ handleIpPackets(srcIpBytes, dstIpBytes, NWUtil.toStringIpAddress(srcIpBytes),
+ NWUtil.toStringIpAddress(dstIpBytes), srcMac, metadata);
- handleIpPackets(srcIpBytes, dstIpBytes, srcIpStr, dstIpStr, srcMac, metadata);
-
- } catch (UnknownHostException | InterruptedException | ExecutionException | BufferException ex) {
+ } catch (InterruptedException | ExecutionException | BufferException ex) {
// Failed to handle packet
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(NWUtil.toStringIpAddress(srcIpBytes) + "." + NWUtil.toStringIpAddress(srcIpBytes));
+ counter.increment();
LOG.error("{} onPacketReceived: Failed to handle subnetroute packet.", LOGGING_PREFIX, ex);
} catch (ReadFailedException e) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(NWUtil.toStringIpAddress(srcIpBytes) + "." + NWUtil.toStringIpAddress(srcIpBytes));
+ counter.increment();
LOG.error("{} onPacketReceived: Failed to read data-store.", LOGGING_PREFIX, e);
+ } catch (UnknownHostException e) {
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(CounterUtility.getSubnetRouteInvalidPacket());
+ counter.increment();
+ LOG.error("{} onPacketReceived: Unknown host detected while handling subnetroute", LOGGING_PREFIX, e);
}
return;
}
if (!vpnIdsOptional.isPresent()) {
// Donot trigger subnetroute logic for packets from
// unknown VPNs
- vpnManagerCounters.subnetRoutePacketIgnored();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_drop.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
LOG.info("{} onPacketReceived: Ignoring IPv4 packet with destination Ip {} and source Ip {}"
+ " as it came on unknown VPN with ID {}", LOGGING_PREFIX, dstIpStr, srcIpStr, vpnId);
return;
VpnPortipToPort persistedIP =
vpnUtil.getNeutronPortFromVpnPortFixedIp(vpnIdVpnInstanceName, dstIpStr);
if (persistedIP != null && !persistedIP.isLearntIp()) {
- vpnManagerCounters.subnetRoutePacketIgnored();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_drop.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
LOG.info("{} onPacketReceived: IP Packet received with Target IP {} source IP {} vpnId {} "
+ "is a valid Neutron port,ignoring subnet route processing", LOGGING_PREFIX, dstIpStr,
srcIp, vpnId);
}
if (vpnUtil.getLearntVpnVipToPort(vpnIdVpnInstanceName, dstIpStr) != null) {
- vpnManagerCounters.subnetRoutePacketIgnored();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
LOG.info("{} onPacketReceived: IP Packet received with Target IP {} source Ip {} vpnId {}"
+ " is an already discovered IPAddress, ignoring subnet route processing",
LOGGING_PREFIX, dstIpStr, srcIp, vpnId);
long elanTag = MetaDataUtil.getElanTagFromMetadata(metadata);
if (elanTag == 0L) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
LOG.error("{} onPacketReceived: elanTag value from metadata found to be 0, for IP "
+ " Packet received with Target IP {} src Ip {} vpnId {}",
LOGGING_PREFIX, dstIpStr, srcIp, vpnId);
// Handle subnet routes ip requests
transmitArpOrNsPacket(targetSubnetForPacketOut.getNhDpnId(), srcIpStr, srcMac, dstIp, dstIpStr, elanTag);
} else {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
LOG.debug("{} handleBgpVpnSubnetRoute: Could not find target subnet for packet out {}", LOGGING_PREFIX,
dstIpStr);
}
VpnInterface vmVpnInterface = vpnUtil.getVpnInterface(vmVpnInterfaceName);
if (vmVpnInterface == null) {
LOG.error("Vpn interface {} doesn't exist.", vmVpnInterfaceName);
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
return;
}
if (VpnHelper.doesVpnInterfaceBelongToVpnInstance(vpnIdVpnInstanceName,
vmVpnInterface.getVpnInstanceNames())
&& !vpnUtil.isBgpVpnInternet(vpnIdVpnInstanceName)) {
LOG.trace("Unknown IP is in internal network");
- handlePacketToInternalNetwork(dstIp, dstIpStr, elanTag);
+ handlePacketToInternalNetwork(dstIp, dstIpStr, elanTag, srcIpStr);
} else {
LOG.trace("Unknown IP is in external network");
String vpnName = vpnUtil.getInternetVpnFromVpnInstanceList(vmVpnInterface.getVpnInstanceNames());
if (NWUtil.isIpv4Address(dstIpAddress)) {
LOG.debug("Sending ARP: srcIp={}, srcMac={}, dstIp={}, dpId={}, elan-tag={}, groupid={}", sourceIpAddress,
sourceMac, dstIpAddress, dpnId, elanTag, groupid);
- vpnManagerCounters.subnetRoutePacketArpSent();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_arp_sent.toString())
+ .label(sourceIpAddress + "." + dstIpAddress);
+ counter.increment();
TransmitPacketInput packetInput =
ArpUtils.createArpRequestInput(dpnId, groupid, HexEncode.bytesFromHexString(sourceMac),
// IPv6 case
LOG.debug("Sending NS: srcIp={}, srcMac={}, dstIp={}, dpId={}, elan-tag={}, groupid={}", sourceIpAddress,
sourceMac, dstIpAddress, dpnId, elanTag, groupid);
- vpnManagerCounters.subnetRoutePacketNsSent();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_ns_sent.toString())
+ .label(sourceIpAddress + "." + dstIpAddress);
+ counter.increment();
VpnUtil.sendNeighborSolicationToOfGroup(this.ipv6NdUtilService, new Ipv6Address(sourceIpAddress),
new MacAddress(sourceMac), new Ipv6Address(dstIpAddress), groupid, dpnId);
}
}
- private void handlePacketToInternalNetwork(byte[] dstIp, String dstIpStr, long elanTag)
+ private void handlePacketToInternalNetwork(byte[] dstIp, String dstIpStr, long elanTag, String srcIpStr)
throws UnknownHostException {
try {
SubnetOpDataEntry targetSubnetForPacketOut =
if (targetSubnetForPacketOut == null) {
LOG.debug("Couldn't find matching subnet for elan tag {} and destination ip {}", elanTag, dstIpStr);
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
return;
}
VpnUtil.buildSubnetmapIdentifier(targetSubnetForPacketOut.getSubnetId()));
if (!subnetMap.isPresent()) {
LOG.debug("Couldn't find subnet map for subnet {}", targetSubnetForPacketOut.getSubnetId());
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(srcIpStr + "." + dstIpStr);
+ counter.increment();
return;
}
String sourceIp = subnetMap.get().getRouterInterfaceFixedIp();
if (sourceIp == null) {
LOG.debug("Subnet map {} doesn't have a router interface ip defined", subnetMap.get().getId());
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label("." + dstIpStr);
+ counter.increment();
return;
}
if (sourceMac == null) {
LOG.debug("Subnet map {} doesn't have a router interface mac address defined",
subnetMap.get().getId());
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(sourceIp + "." + dstIpStr);
+ counter.increment();
return;
}
long elanTag) throws UnknownHostException {
Routers externalRouter = vpnUtil.getExternalRouter(routerId);
if (externalRouter == null) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label("." + dstIpStr);
+ counter.increment();
LOG.debug("{} handlePacketToExternalNetwork: Can't find external router with id {}", LOGGING_PREFIX,
routerId);
return;
List<ExternalIps> externalIps = externalRouter.getExternalIps();
if (externalIps == null || externalIps.isEmpty()) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label("." + dstIpStr);
+ counter.increment();
LOG.debug("{} handlePacketToExternalNetwork: Router {} doesn't have any external ips.",
LOGGING_PREFIX, externalRouter.getRouterName());
return;
java.util.Optional<ExternalIps> externalIp = externalRouter.getExternalIps().stream()
.filter(eip -> vpnInstanceNameUuid.equals(eip.getSubnetId())).findFirst();
if (!externalIp.isPresent()) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(externalIp.get().getIpAddress() + "." + dstIpStr);
+ counter.increment();
LOG.debug("{} handlePacketToExternalNetwork: Router {} doesn't have an external ip for subnet id {}.",
LOGGING_PREFIX, externalRouter.getRouterName(), vpnInstanceNameUuid);
return;
BigInteger dpnId = centralizedSwitchProvider.getPrimarySwitchForRouter(externalRouter.getRouterName());
if (BigInteger.ZERO.equals(dpnId)) {
- vpnManagerCounters.subnetRoutePacketFailed();
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
+ .label(externalIp.get().getIpAddress() + "." + dstIpStr);
+ counter.increment();
LOG.debug("{} handlePacketToExternalNetwork: Could not find primary switch for router {}.",
LOGGING_PREFIX, externalRouter.getRouterName());
return;
transmitArpOrNsPacket(dpnId, externalIp.get().getIpAddress(), externalRouter.getExtGwMacAddress(), dstIp,
dstIpStr, elanTag);
+
+ Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_processed.toString())
+ .label(externalIp.get().getIpAddress() + "." + dstIpStr);
+ counter.increment();
}
// return only the first VPN subnetopdataentry
+++ /dev/null
-/*
- * Copyright (c) 2016 Hewlett-Packard Enterprise 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.vpnmanager.utilities;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import org.opendaylight.infrautils.metrics.Meter;
-import org.opendaylight.infrautils.metrics.MetricDescriptor;
-import org.opendaylight.infrautils.metrics.MetricProvider;
-
-@Singleton
-public class VpnManagerCounters {
- private final Meter subnetRoutePacketIgnoredMeter;
- private final Meter subnetRoutePacketFailedMeter;
- private final Meter subnetRoutePacketArpSentMeter;
- private final Meter subnetRoutePacketNsSentMeter;
- private final Meter garpAddNotificationMeter;
- private final Meter garpUpdateNotificationMeter;
- private final Meter garpSentMeter;
- private final Meter garpSentIpv6Meter;
- private final Meter garpSentFailedMeter;
- private final Meter garpInterfaceRpcFailedMeter;
-
- @Inject
- public VpnManagerCounters(MetricProvider metricProvider) {
- this.subnetRoutePacketIgnoredMeter = meter(metricProvider, "subnet_route_packet_ignored");
- this.subnetRoutePacketFailedMeter = meter(metricProvider, "subnet_route_packet_failed");
- this.subnetRoutePacketArpSentMeter = meter(metricProvider, "subnet_route_packet_arp_sent");
- this.subnetRoutePacketNsSentMeter = meter(metricProvider, "subnet_route_packet_ns_sent");
- this.garpAddNotificationMeter = meter(metricProvider, "garp_add_notification");
- this.garpUpdateNotificationMeter = meter(metricProvider, "garp_update_notification");
- this.garpSentMeter = meter(metricProvider, "garp_sent");
- this.garpSentIpv6Meter = meter(metricProvider, "garp_sent_ipv6");
- this.garpSentFailedMeter = meter(metricProvider, "garp_sent_failed");
- this.garpInterfaceRpcFailedMeter = meter(metricProvider, "garp_interface_rpc_failed");
- }
-
- private Meter meter(MetricProvider metricProvider, String id) {
- return metricProvider.newMeter(
- MetricDescriptor.builder().anchor(this).project("netvirt").module("vpnmanager").id(id).build());
- }
-
- public void subnetRoutePacketIgnored() {
- subnetRoutePacketIgnoredMeter.mark();
- }
-
- public void subnetRoutePacketFailed() {
- subnetRoutePacketFailedMeter.mark();
- }
-
- public void subnetRoutePacketArpSent() {
- subnetRoutePacketArpSentMeter.mark();
- }
-
- public void subnetRoutePacketNsSent() {
- subnetRoutePacketNsSentMeter.mark();
- }
-
- public void garpAddNotification() {
- garpAddNotificationMeter.mark();
- }
-
- public void garpUpdateNotification() {
- garpUpdateNotificationMeter.mark();
- }
-
- public void garpSent() {
- garpSentMeter.mark();
- }
-
- public void garpSentIpv6() {
- garpSentIpv6Meter.mark();
- }
-
- public void garpSentFailed() {
- garpSentFailedMeter.mark();
- }
-
- public void garpInterfaceRpcFailed() {
- garpInterfaceRpcFailedMeter.mark();
- }
-}