blob: 76ff093d934c6ae2aba3103726e57a2d8697a3a7 [file] [log] [blame]
/*
* Copyright 2019-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.packetthrottle;
import com.google.common.collect.ImmutableMap;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Deactivate;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.net.packet.PacketInFilter;
import org.onosproject.net.packet.PacketService;
import org.onosproject.net.packet.packetfilter.DefaultPacketInFilter;
import org.onosproject.net.packet.packetfilter.ArpPacketClassifier;
import org.onosproject.net.packet.packetfilter.Dhcp6IndirectPacketClassifier;
import org.onosproject.net.packet.packetfilter.Dhcp6DirectPacketClassifier;
import org.onosproject.net.packet.packetfilter.DhcpPacketClassifier;
import org.onosproject.net.packet.packetfilter.NAPacketClassifier;
import org.onosproject.net.packet.packetfilter.NSPacketClassifier;
import org.onosproject.net.packet.packetfilter.IcmpPacketClassifier;
import org.onosproject.net.packet.packetfilter.Icmp6PacketClassifier;
import org.onosproject.packetthrottle.api.PacketThrottleService;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_ARP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_ARP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_DHCP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_DHCP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_NS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_NS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_NA;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_NA_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_DHCP6_DIRECT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_DHCP6_DIRECT_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_DHCP6_INDIRECT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_DHCP6_INDIRECT_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_ICMP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_ICMP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_PPS_ICMP6;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PPS_ICMP6_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_ARP_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_ARP_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_DHCP_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_DHCP_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_NA_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_NA_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_NS_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_NS_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_DHCP6_DIRECT_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_DHCP6_DIRECT_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_DHCP6_INDIRECT_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_DHCP6_INDIRECT_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_ICMP_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_ICMP_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_SIZE_ICMP6_MS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_SIZE_ICMP6_MS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_ARP_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_ARP_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_DHCP_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_DHCP_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_NS_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_NS_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_NA_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_NA_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_DHCP6_DIRECT_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_DHCP6_DIRECT_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_DHCP6_INDIRECT_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_DHCP6_INDIRECT_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_ICMP_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_ICMP_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_GUARD_TIME_ICMP6_SEC;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.GUARD_TIME_ICMP6_SEC_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_ARP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_ARP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_DHCP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_DHCP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_NS;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_NS_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_NA;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_NA_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_DHCP6_DIRECT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_DHCP6_DIRECT_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_DHCP6_INDIRECT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_DHCP6_INDIRECT_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_ICMP;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_ICMP_DEFAULT;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.PROP_WIN_THRES_ICMP6;
import static org.onosproject.packetthrottle.OsgiPropertyConstants.WIN_THRES_ICMP6_DEFAULT;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
import static com.google.common.base.Strings.isNullOrEmpty;
import static org.onlab.util.Tools.get;
/**
* Manage the packet throttle for various type of packets.
*/
@Component(
immediate = true,
service = PacketThrottleService.class,
property = {
PROP_PPS_ARP + ":Integer=" + PPS_ARP_DEFAULT,
PROP_PPS_DHCP + ":Integer=" + PPS_DHCP_DEFAULT,
PROP_PPS_NS + ":Integer=" + PPS_NS_DEFAULT,
PROP_PPS_NA + ":Integer=" + PPS_NA_DEFAULT,
PROP_PPS_DHCP6_DIRECT + ":Integer=" + PPS_DHCP6_DIRECT_DEFAULT,
PROP_PPS_DHCP6_INDIRECT + ":Integer=" + PPS_DHCP6_INDIRECT_DEFAULT,
PROP_PPS_ICMP + ":Integer=" + PPS_ICMP_DEFAULT,
PROP_PPS_ICMP6 + ":Integer=" + PPS_ICMP6_DEFAULT,
PROP_WIN_SIZE_ARP_MS + ":Integer=" + WIN_SIZE_ARP_MS_DEFAULT,
PROP_WIN_SIZE_DHCP_MS + ":Integer=" + WIN_SIZE_DHCP_MS_DEFAULT,
PROP_WIN_SIZE_NA_MS + ":Integer=" + WIN_SIZE_NA_MS_DEFAULT,
PROP_WIN_SIZE_NS_MS + ":Integer=" + WIN_SIZE_NS_MS_DEFAULT,
PROP_WIN_SIZE_DHCP6_DIRECT_MS + ":Integer=" + WIN_SIZE_DHCP6_DIRECT_MS_DEFAULT,
PROP_WIN_SIZE_DHCP6_INDIRECT_MS + ":Integer=" + WIN_SIZE_DHCP6_INDIRECT_MS_DEFAULT,
PROP_WIN_SIZE_ICMP_MS + ":Integer=" + WIN_SIZE_ICMP_MS_DEFAULT,
PROP_WIN_SIZE_ICMP6_MS + ":Integer=" + WIN_SIZE_ICMP6_MS_DEFAULT,
PROP_GUARD_TIME_ARP_SEC + ":Integer=" + GUARD_TIME_ARP_SEC_DEFAULT,
PROP_GUARD_TIME_DHCP_SEC + ":Integer=" + GUARD_TIME_DHCP_SEC_DEFAULT,
PROP_GUARD_TIME_NS_SEC + ":Integer=" + GUARD_TIME_NS_SEC_DEFAULT,
PROP_GUARD_TIME_NA_SEC + ":Integer=" + GUARD_TIME_NA_SEC_DEFAULT,
PROP_GUARD_TIME_DHCP6_DIRECT_SEC + ":Integer=" + GUARD_TIME_DHCP6_DIRECT_SEC_DEFAULT,
PROP_GUARD_TIME_DHCP6_INDIRECT_SEC + ":Integer=" + GUARD_TIME_DHCP6_INDIRECT_SEC_DEFAULT,
PROP_GUARD_TIME_ICMP_SEC + ":Integer=" + GUARD_TIME_ICMP_SEC_DEFAULT,
PROP_GUARD_TIME_ICMP6_SEC + ":Integer=" + GUARD_TIME_ICMP6_SEC_DEFAULT,
PROP_WIN_THRES_ARP + ":Integer=" + WIN_THRES_ARP_DEFAULT,
PROP_WIN_THRES_DHCP + ":Integer=" + WIN_THRES_DHCP_DEFAULT,
PROP_WIN_THRES_NS + ":Integer=" + WIN_THRES_NS_DEFAULT,
PROP_WIN_THRES_NA + ":Integer=" + WIN_THRES_NA_DEFAULT,
PROP_WIN_THRES_DHCP6_DIRECT + ":Integer=" + WIN_THRES_DHCP6_DIRECT_DEFAULT,
PROP_WIN_THRES_DHCP6_INDIRECT + ":Integer=" + WIN_THRES_DHCP6_INDIRECT_DEFAULT,
PROP_WIN_THRES_ICMP + ":Integer=" + WIN_THRES_ICMP_DEFAULT,
PROP_WIN_THRES_ICMP6 + ":Integer=" + WIN_THRES_ICMP6_DEFAULT
}
)
public class PacketThrottleManager implements PacketThrottleService {
private final Logger log = LoggerFactory.getLogger(getClass());
protected static final String ARP_FILTER = "arpFilter";
protected static final String DHCP_FILTER = "dhcpFilter";
protected static final String NS_FILTER = "nsFilter";
protected static final String NA_FILTER = "naFilter";
protected static final String DHCP6_DIRECT_FILTER = "dhcp6DirectFilter";
protected static final String DHCP6_INDIRECT_FILTER = "dhcp6IndirectFilter";
protected static final String ICMP_FILTER = "icmpFilter";
protected static final String ICMP6_FILTER = "icmp6Filter";
@Reference(cardinality = ReferenceCardinality.MANDATORY)
PacketService packetService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
protected ComponentConfigService configService;
/**
* Parameter to set packet per second rate for all filter types.
*/
private int ppsArp = PPS_ARP_DEFAULT;
private int ppsDhcp = PPS_DHCP_DEFAULT;
private int ppsNs = PPS_NS_DEFAULT;
private int ppsNa = PPS_NA_DEFAULT;
private int ppsDhcp6Direct = PPS_DHCP6_DIRECT_DEFAULT;
private int ppsDhcp6Indirect = PPS_DHCP6_INDIRECT_DEFAULT;
private int ppsIcmp = PPS_ICMP_DEFAULT;
private int ppsIcmp6 = PPS_ICMP6_DEFAULT;
/**
* Parameter to set window size in milli seconds to check overflow of packets.
*/
private int winSizeArp = WIN_SIZE_ARP_MS_DEFAULT;
private int winSizeDhcp = WIN_SIZE_DHCP_MS_DEFAULT;
private int winSizeNs = WIN_SIZE_NS_MS_DEFAULT;
private int winSizeNa = WIN_SIZE_NA_MS_DEFAULT;
private int winSizeDhcp6Direct = WIN_SIZE_DHCP6_DIRECT_MS_DEFAULT;
private int winSizeDhcp6Indirect = WIN_SIZE_DHCP6_INDIRECT_MS_DEFAULT;
private int winSizeIcmp = WIN_SIZE_ICMP_MS_DEFAULT;
private int winSizeIcmp6 = WIN_SIZE_ICMP6_MS_DEFAULT;
/**
* Time duration for which no more packets will be processed for a given filter type
* provided consecutive overflow windows happens.
*/
private int guardTimeArp = GUARD_TIME_ARP_SEC_DEFAULT;
private int guardTimeDhcp = GUARD_TIME_DHCP_SEC_DEFAULT;
private int guardTimeNs = GUARD_TIME_NS_SEC_DEFAULT;
private int guardTimeNa = GUARD_TIME_NA_SEC_DEFAULT;
private int guardTimeDhcp6Direct = GUARD_TIME_DHCP6_DIRECT_SEC_DEFAULT;
private int guardTimeDhcp6Indirect = GUARD_TIME_DHCP6_INDIRECT_SEC_DEFAULT;
private int guardTimeIcmp = GUARD_TIME_ICMP_SEC_DEFAULT;
private int guardTimeIcmp6 = GUARD_TIME_ICMP6_SEC_DEFAULT;
/**
* Consecutive overflow window threshold.
*/
private int winThresArp = WIN_THRES_ARP_DEFAULT;
private int winThresDhcp = WIN_THRES_DHCP_DEFAULT;
private int winThresNs = WIN_THRES_NS_DEFAULT;
private int winThresNa = WIN_THRES_NA_DEFAULT;
private int winThresDhcp6Direct = WIN_THRES_DHCP6_DIRECT_DEFAULT;
private int winThresDhcp6Indirect = WIN_THRES_DHCP6_INDIRECT_DEFAULT;
private int winThresIcmp = WIN_THRES_ICMP_DEFAULT;
private int winThresIcmp6 = WIN_THRES_ICMP6_DEFAULT;
private Map<String, PacketInFilter> mapCounterFilter = new HashMap<>();
@Activate
protected void activate() {
log.info("Started");
configService.registerProperties(getClass());
createAllFilters();
}
@Deactivate
protected void deactivate() {
configService.unregisterProperties(getClass(), false);
removeAllFilters();
log.info("Stopped");
}
private void checkChangeInPps(ComponentContext context) {
Dictionary<?, ?> properties = context.getProperties();
int newPpsArp, newPpsDhcp, newPpsNs, newPpsNa, newPpsDhcp6Direct;
int newPpsDhcp6Indirect, newPpsIcmp, newPpsIcmp6;
try {
String s = get(properties, PROP_PPS_ARP);
newPpsArp = isNullOrEmpty(s) ? ppsArp : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_DHCP);
newPpsDhcp = isNullOrEmpty(s) ? ppsDhcp : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_NS);
newPpsNs = isNullOrEmpty(s) ? ppsNs : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_NA);
newPpsNa = isNullOrEmpty(s) ? ppsNa : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_DHCP6_DIRECT);
newPpsDhcp6Direct = isNullOrEmpty(s) ? ppsDhcp6Direct : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_DHCP6_INDIRECT);
newPpsDhcp6Indirect = isNullOrEmpty(s) ? ppsDhcp6Indirect : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_ICMP);
newPpsIcmp = isNullOrEmpty(s) ? ppsIcmp : Integer.parseInt(s.trim());
s = get(properties, PROP_PPS_ICMP6);
newPpsIcmp6 = isNullOrEmpty(s) ? ppsIcmp6 : Integer.parseInt(s.trim());
} catch (NumberFormatException | ClassCastException e) {
newPpsArp = PPS_ARP_DEFAULT;
newPpsDhcp = PPS_DHCP_DEFAULT;
newPpsNs = PPS_NS_DEFAULT;
newPpsNa = PPS_NA_DEFAULT;
newPpsDhcp6Direct = PPS_DHCP6_DIRECT_DEFAULT;
newPpsDhcp6Indirect = PPS_DHCP6_INDIRECT_DEFAULT;
newPpsIcmp = PPS_ICMP_DEFAULT;
newPpsIcmp6 = PPS_ICMP6_DEFAULT;
}
if (newPpsArp != ppsArp) {
ppsArp = newPpsArp;
mapCounterFilter.get(ARP_FILTER).setPps(ppsArp);
}
if (newPpsDhcp != ppsDhcp) {
ppsDhcp = newPpsDhcp;
mapCounterFilter.get(DHCP_FILTER).setPps(ppsDhcp);
}
if (newPpsNs != ppsNs) {
ppsNs = newPpsNs;
mapCounterFilter.get(NS_FILTER).setPps(ppsNs);
}
if (newPpsNa != ppsNa) {
ppsNa = newPpsNa;
mapCounterFilter.get(NA_FILTER).setPps(ppsNa);
}
if (newPpsDhcp6Direct != ppsDhcp6Direct) {
ppsDhcp6Direct = newPpsDhcp6Direct;
mapCounterFilter.get(DHCP6_DIRECT_FILTER).setPps(ppsDhcp6Direct);
}
if (newPpsDhcp6Indirect != ppsDhcp6Indirect) {
ppsDhcp6Indirect = newPpsDhcp6Indirect;
mapCounterFilter.get(DHCP6_INDIRECT_FILTER).setPps(ppsDhcp6Indirect);
}
if (newPpsIcmp != ppsIcmp) {
ppsIcmp = newPpsIcmp;
mapCounterFilter.get(ICMP_FILTER).setPps(ppsIcmp);
}
if (newPpsIcmp6 != ppsIcmp6) {
ppsIcmp6 = newPpsIcmp6;
mapCounterFilter.get(ICMP6_FILTER).setPps(ppsIcmp6);
}
}
private void checkChangeInWinSize(ComponentContext context) {
Dictionary<?, ?> properties = context.getProperties();
int newWinSizeArp, newWinSizeDhcp, newWinSizeNs, newWinSizeNa;
int newWinSizeDhcp6Direct, newWinSizeDhcp6Indirect, newWinSizeIcmp, newWinSizeIcmp6;
try {
String s = get(properties, PROP_WIN_SIZE_ARP_MS);
newWinSizeArp = isNullOrEmpty(s) ? winSizeArp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_DHCP_MS);
newWinSizeDhcp = isNullOrEmpty(s) ? winSizeDhcp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_NS_MS);
newWinSizeNs = isNullOrEmpty(s) ? winSizeNs : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_NA_MS);
newWinSizeNa = isNullOrEmpty(s) ? winSizeNa : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_DHCP6_DIRECT_MS);
newWinSizeDhcp6Direct = isNullOrEmpty(s) ? winSizeDhcp6Direct : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_DHCP6_INDIRECT_MS);
newWinSizeDhcp6Indirect = isNullOrEmpty(s) ? winSizeDhcp6Indirect : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_ICMP_MS);
newWinSizeIcmp = isNullOrEmpty(s) ? winSizeIcmp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_SIZE_ICMP6_MS);
newWinSizeIcmp6 = isNullOrEmpty(s) ? winSizeIcmp6 : Integer.parseInt(s.trim());
} catch (NumberFormatException | ClassCastException e) {
newWinSizeArp = WIN_SIZE_ARP_MS_DEFAULT;
newWinSizeDhcp = WIN_SIZE_DHCP_MS_DEFAULT;
newWinSizeNs = WIN_SIZE_NS_MS_DEFAULT;
newWinSizeNa = WIN_SIZE_NA_MS_DEFAULT;
newWinSizeDhcp6Direct = WIN_SIZE_DHCP6_DIRECT_MS_DEFAULT;
newWinSizeDhcp6Indirect = WIN_SIZE_DHCP6_INDIRECT_MS_DEFAULT;
newWinSizeIcmp = WIN_SIZE_ICMP_MS_DEFAULT;
newWinSizeIcmp6 = WIN_SIZE_ICMP6_MS_DEFAULT;
}
if (newWinSizeArp != winSizeArp) {
winSizeArp = newWinSizeArp;
mapCounterFilter.get(ARP_FILTER).setWinSize(winSizeArp);
}
if (newWinSizeDhcp != winSizeDhcp) {
winSizeDhcp = newWinSizeDhcp;
mapCounterFilter.get(DHCP_FILTER).setWinSize(winSizeDhcp);
}
if (newWinSizeNs != winSizeNs) {
winSizeNs = newWinSizeNs;
mapCounterFilter.get(NS_FILTER).setWinSize(winSizeNs);
}
if (newWinSizeNa != winSizeNa) {
winSizeNa = newWinSizeNa;
mapCounterFilter.get(NA_FILTER).setWinSize(winSizeNa);
}
if (newWinSizeDhcp6Direct != winSizeDhcp6Direct) {
winSizeDhcp6Direct = newWinSizeDhcp6Direct;
mapCounterFilter.get(DHCP6_DIRECT_FILTER).setWinSize(winSizeDhcp6Direct);
}
if (newWinSizeDhcp6Indirect != winSizeDhcp6Indirect) {
winSizeDhcp6Indirect = newWinSizeDhcp6Indirect;
mapCounterFilter.get(DHCP6_INDIRECT_FILTER).setWinSize(winSizeDhcp6Indirect);
}
if (newWinSizeIcmp != winSizeIcmp) {
winSizeIcmp = newWinSizeIcmp;
mapCounterFilter.get(ICMP_FILTER).setWinSize(winSizeIcmp);
}
if (newWinSizeIcmp6 != winSizeIcmp6) {
winSizeIcmp6 = newWinSizeIcmp6;
mapCounterFilter.get(ICMP6_FILTER).setWinSize(winSizeIcmp6);
}
}
private void checkChangeInGuardTime(ComponentContext context) {
Dictionary<?, ?> properties = context.getProperties();
int newGuardTimeArp, newGuardTimeDhcp, newGuardTimeNs, newGuardTimeNa;
int newGuardTimeDhcp6Direct, newGuardTimeDhcp6Indirect, newGuardTimeIcmp, newGuardTimeIcmp6;
try {
String s = get(properties, PROP_GUARD_TIME_ARP_SEC);
newGuardTimeArp = isNullOrEmpty(s) ? guardTimeArp : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_DHCP_SEC);
newGuardTimeDhcp = isNullOrEmpty(s) ? guardTimeDhcp : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_NS_SEC);
newGuardTimeNs = isNullOrEmpty(s) ? guardTimeNs : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_NA_SEC);
newGuardTimeNa = isNullOrEmpty(s) ? guardTimeNa : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_DHCP6_DIRECT_SEC);
newGuardTimeDhcp6Direct = isNullOrEmpty(s) ? guardTimeDhcp6Direct : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_DHCP6_INDIRECT_SEC);
newGuardTimeDhcp6Indirect = isNullOrEmpty(s) ? guardTimeDhcp6Indirect : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_ICMP_SEC);
newGuardTimeIcmp = isNullOrEmpty(s) ? guardTimeIcmp : Integer.parseInt(s.trim());
s = get(properties, PROP_GUARD_TIME_ICMP6_SEC);
newGuardTimeIcmp6 = isNullOrEmpty(s) ? guardTimeIcmp6 : Integer.parseInt(s.trim());
} catch (NumberFormatException | ClassCastException e) {
newGuardTimeArp = GUARD_TIME_ARP_SEC_DEFAULT;
newGuardTimeDhcp = GUARD_TIME_DHCP_SEC_DEFAULT;
newGuardTimeNs = GUARD_TIME_NS_SEC_DEFAULT;
newGuardTimeNa = GUARD_TIME_NA_SEC_DEFAULT;
newGuardTimeDhcp6Direct = GUARD_TIME_DHCP6_DIRECT_SEC_DEFAULT;
newGuardTimeDhcp6Indirect = GUARD_TIME_DHCP6_INDIRECT_SEC_DEFAULT;
newGuardTimeIcmp = GUARD_TIME_ICMP_SEC_DEFAULT;
newGuardTimeIcmp6 = GUARD_TIME_ICMP6_SEC_DEFAULT;
}
if (newGuardTimeArp != guardTimeArp) {
guardTimeArp = newGuardTimeArp;
mapCounterFilter.get(ARP_FILTER).setGuardTime(guardTimeArp);
}
if (newGuardTimeDhcp != guardTimeDhcp) {
guardTimeDhcp = newGuardTimeDhcp;
mapCounterFilter.get(DHCP_FILTER).setGuardTime(guardTimeDhcp);
}
if (newGuardTimeNs != guardTimeNs) {
guardTimeNs = newGuardTimeNs;
mapCounterFilter.get(NS_FILTER).setGuardTime(guardTimeNs);
}
if (newGuardTimeNa != guardTimeNa) {
guardTimeNa = newGuardTimeNa;
mapCounterFilter.get(NA_FILTER).setGuardTime(guardTimeNa);
}
if (newGuardTimeDhcp6Direct != guardTimeDhcp6Direct) {
guardTimeDhcp6Direct = newGuardTimeDhcp6Direct;
mapCounterFilter.get(DHCP6_DIRECT_FILTER).setGuardTime(guardTimeDhcp6Direct);
}
if (newGuardTimeDhcp6Indirect != guardTimeDhcp6Indirect) {
guardTimeDhcp6Indirect = newGuardTimeDhcp6Indirect;
mapCounterFilter.get(DHCP6_INDIRECT_FILTER).setGuardTime(guardTimeDhcp6Indirect);
}
if (newGuardTimeIcmp != guardTimeIcmp) {
guardTimeIcmp = newGuardTimeIcmp;
mapCounterFilter.get(ICMP_FILTER).setGuardTime(guardTimeIcmp);
}
if (newGuardTimeIcmp6 != guardTimeIcmp6) {
guardTimeIcmp6 = newGuardTimeIcmp6;
mapCounterFilter.get(ICMP6_FILTER).setGuardTime(guardTimeIcmp6);
}
}
private void checkChangeInWinThres(ComponentContext context) {
Dictionary<?, ?> properties = context.getProperties();
int newWinThresArp, newWinThresDhcp, newWinThresNs, newWinThresNa;
int newWinThresDhcp6Direct, newWinThresDhcp6Indirect, newWinThresIcmp, newWinThresIcmp6;
try {
String s = get(properties, PROP_WIN_THRES_ARP);
newWinThresArp = isNullOrEmpty(s) ? winThresArp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_DHCP);
newWinThresDhcp = isNullOrEmpty(s) ? winThresDhcp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_NS);
newWinThresNs = isNullOrEmpty(s) ? winThresNs : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_NA);
newWinThresNa = isNullOrEmpty(s) ? winThresNa : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_DHCP6_DIRECT);
newWinThresDhcp6Direct = isNullOrEmpty(s) ? winThresDhcp6Direct : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_DHCP6_INDIRECT);
newWinThresDhcp6Indirect = isNullOrEmpty(s) ? winThresDhcp6Indirect : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_ICMP);
newWinThresIcmp = isNullOrEmpty(s) ? winThresIcmp : Integer.parseInt(s.trim());
s = get(properties, PROP_WIN_THRES_ICMP6);
newWinThresIcmp6 = isNullOrEmpty(s) ? winThresIcmp6 : Integer.parseInt(s.trim());
} catch (NumberFormatException | ClassCastException e) {
newWinThresArp = WIN_THRES_ARP_DEFAULT;
newWinThresDhcp = WIN_THRES_DHCP_DEFAULT;
newWinThresNs = WIN_THRES_NS_DEFAULT;
newWinThresNa = WIN_THRES_NA_DEFAULT;
newWinThresDhcp6Direct = WIN_THRES_DHCP6_DIRECT_DEFAULT;
newWinThresDhcp6Indirect = WIN_THRES_DHCP6_INDIRECT_DEFAULT;
newWinThresIcmp = WIN_THRES_ICMP_DEFAULT;
newWinThresIcmp6 = WIN_THRES_ICMP6_DEFAULT;
}
if (newWinThresArp != winThresArp) {
winThresArp = newWinThresArp;
mapCounterFilter.get(ARP_FILTER).setWinThres(winThresArp);
}
if (newWinThresDhcp != winThresDhcp) {
winThresDhcp = newWinThresDhcp;
mapCounterFilter.get(DHCP_FILTER).setWinThres(winThresDhcp);
}
if (newWinThresNs != winThresNs) {
winThresNs = newWinThresNs;
mapCounterFilter.get(NS_FILTER).setWinThres(winThresNs);
}
if (newWinThresNa != winThresNa) {
winThresNa = newWinThresNa;
mapCounterFilter.get(NA_FILTER).setWinThres(winThresNa);
}
if (newWinThresDhcp6Direct != winThresDhcp6Direct) {
winThresDhcp6Direct = newWinThresDhcp6Direct;
mapCounterFilter.get(DHCP6_DIRECT_FILTER).setWinThres(winThresDhcp6Direct);
}
if (newWinThresDhcp6Indirect != winThresDhcp6Indirect) {
winThresDhcp6Indirect = newWinThresDhcp6Indirect;
mapCounterFilter.get(DHCP6_INDIRECT_FILTER).setWinThres(winThresDhcp6Indirect);
}
if (newWinThresIcmp != winThresIcmp) {
winThresIcmp = newWinThresIcmp;
mapCounterFilter.get(ICMP_FILTER).setWinThres(winThresIcmp);
}
if (newWinThresIcmp6 != winThresIcmp6) {
winThresIcmp6 = newWinThresIcmp6;
mapCounterFilter.get(ICMP6_FILTER).setWinThres(winThresIcmp6);
}
}
@Modified
private void modified(ComponentContext context) {
if (context == null) {
log.info("Default config");
return;
}
checkChangeInPps(context);
checkChangeInWinSize(context);
checkChangeInGuardTime(context);
checkChangeInWinThres(context);
log.info("Reconfigured ppsArp: {} ppsDhcp: {} ppsNs: {} ppsNa: {} " +
"ppsDhcp6Direct: {} ppsDhcp6Indirect: {} ppsIcmp: {} ppsIcmp6: {}",
ppsArp, ppsDhcp, ppsNs, ppsNa, ppsDhcp6Direct, ppsDhcp6Indirect,
ppsIcmp, ppsIcmp6);
log.info("Reconfigured winSizeArp: {} winSizeDhcp: {} winSizeNs: {} winSizeNa: {} " +
"winSizeDhcp6Direct: {} winSizeDhcp6Indirect: {} winSizeIcmp: {} winSizeIcmp6: {}",
winSizeArp, winSizeDhcp, winSizeNs, winSizeNa, winSizeDhcp6Direct,
winSizeDhcp6Indirect, winSizeIcmp, winSizeIcmp6);
log.info("Reconfigured guardTimeArp: {} guardTimeDhcp: {} guardTimeNs: {} guardTimeNa: {} " +
"guardTimeDhcp6Direct: {} guardTimeDhcp6Indirect: {} guardTimeIcmp: {} guardTimeIcmp6: {}",
guardTimeArp, guardTimeDhcp, guardTimeNs, guardTimeNa, guardTimeDhcp6Direct,
guardTimeDhcp6Indirect, guardTimeIcmp, guardTimeIcmp6);
log.info("Reconfigured winThresArp: {} winThresDhcp: {} winThresNs: {} winThresNa: {} " +
"winThresDhcp6Direct: {} winThresDhcp6Indirect: {} winThresIcmp: {} winThresIcmp6: {}",
winThresArp, winThresDhcp, winThresNs, winThresNa, winThresDhcp6Direct,
winThresDhcp6Indirect, winThresIcmp, winThresIcmp6);
}
/**
* Create all required filters.
*/
private void createAllFilters() {
DefaultPacketInFilter filter;
ArpPacketClassifier arp = new ArpPacketClassifier();
filter = new DefaultPacketInFilter(ppsArp, winSizeArp, guardTimeArp, winThresArp, ARP_FILTER, arp);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
DhcpPacketClassifier dhcp4 = new DhcpPacketClassifier();
filter = new DefaultPacketInFilter(ppsDhcp, winSizeDhcp, guardTimeDhcp, winThresDhcp, DHCP_FILTER, dhcp4);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
Dhcp6DirectPacketClassifier dhcp6Direct = new Dhcp6DirectPacketClassifier();
filter = new DefaultPacketInFilter(ppsDhcp6Direct, winSizeDhcp6Direct, guardTimeDhcp6Direct,
winThresDhcp6Direct, DHCP6_DIRECT_FILTER, dhcp6Direct);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
Dhcp6IndirectPacketClassifier dhcp6Indirect = new Dhcp6IndirectPacketClassifier();
filter = new DefaultPacketInFilter(ppsDhcp6Direct, winSizeDhcp6Direct, guardTimeDhcp6Direct,
winThresDhcp6Direct, DHCP6_INDIRECT_FILTER, dhcp6Indirect);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
NAPacketClassifier na = new NAPacketClassifier();
filter = new DefaultPacketInFilter(ppsNa, winSizeNa, guardTimeNa, winThresNa, NA_FILTER, na);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
NSPacketClassifier ns = new NSPacketClassifier();
filter = new DefaultPacketInFilter(ppsNs, winSizeNs, guardTimeNs, winThresNs, NS_FILTER, ns);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
IcmpPacketClassifier icmp = new IcmpPacketClassifier();
filter = new DefaultPacketInFilter(ppsIcmp, winSizeIcmp, guardTimeIcmp, winThresIcmp, ICMP_FILTER, icmp);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
Icmp6PacketClassifier icmp6 = new Icmp6PacketClassifier();
filter = new DefaultPacketInFilter(ppsIcmp6, winSizeIcmp6, guardTimeIcmp6, winThresIcmp6, ICMP6_FILTER, icmp6);
packetService.addFilter(filter);
mapCounterFilter.put(filter.name(), filter);
}
/**
* Delete all the filters.
*/
private void removeAllFilters() {
packetService.clearFilters();
mapCounterFilter.clear();
}
@Override
public Map<String, PacketInFilter> filterMap() {
return ImmutableMap.copyOf(mapCounterFilter);
}
}