package edu.usc.enl.dynamicmeasurement.algorithms.transform; import edu.usc.enl.dynamicmeasurement.data.ConfigReader; import edu.usc.enl.dynamicmeasurement.data.DataPacket; import edu.usc.enl.dynamicmeasurement.model.WildcardPattern; import edu.usc.enl.dynamicmeasurement.process.EpochPacket; import edu.usc.enl.dynamicmeasurement.util.Util; import org.w3c.dom.Element; import java.util.HashMap; import java.util.Map; /** * Created with IntelliJ IDEA. * User: masoud * Date: 9/16/13 * Time: 4:29 PM <br/> * Generates packets similar to the matching filte ron the target filter. * If the target filter is larger than source filter, zeros will be padded to the end. * It also aggregates the packets and sends them at the end of the epoch */ public class CopyPackets extends TrafficTransformer { private WildcardPattern target; private Map<Long, Double> ipTraffic = new HashMap<>(); public CopyPackets(Element element) { super(element); Map<String, Element> childrenProperties = Util.getChildrenProperties(element, "Property"); target = new WildcardPattern(childrenProperties.get("Target").getAttribute(ConfigReader.PROPERTY_VALUE), 0); } @Override protected void process2(edu.usc.enl.dynamicmeasurement.data.DataPacket p) { if (match(p)) { long srcIP = p.getSrcIP(); put(p, srcIP); //map srcIP to a new srcIP srcIP -= filter.getData() << filter.getWildcardNum(); int wDiff = filter.getWildcardNum() - target.getWildcardNum(); if (wDiff > 0) { srcIP >>>= wDiff; } else { srcIP <<= wDiff; } srcIP += target.getData() << target.getWildcardNum(); put(p, srcIP); } else { passPacket(p); } } private void put(DataPacket p, long srcIP) { Double aDouble = ipTraffic.get(srcIP); if (aDouble == null) { aDouble = 0d; } ipTraffic.put(srcIP, aDouble + p.getSize()); } @Override protected void reset() { super.reset(); ipTraffic.clear(); } @Override protected void step(EpochPacket p) { long time = p.getTime(); for (Map.Entry<Long, Double> entry : ipTraffic.entrySet()) { DataPacket p2 = new DataPacket(time, 0, 0, 0, 0, 0, 0); p2.setSrcIP(entry.getKey()); p2.setSize(entry.getValue()); passPacket(p2); } passPacket(p); } }