result.put(ID, filteringObjective.id()); result.put(TYPE, filteringObjective.type().toString()); if (filteringObjective.key() != null) { ObjectNode criterionNode = criterionCodec.encode(filteringObjective.key(), context); result.set(KEY, criterionNode); if (filteringObjective.meta() != null) { ObjectNode trafficTreatmentNode = trafficTreatmentCodec.encode(filteringObjective.meta(), context); result.set(META, trafficTreatmentNode); filteringObjective.conditions().forEach(c -> { ObjectNode criterionJson = criterionCodec.encode(c, context); conditions.add(criterionJson);
@Override public void filter(FilteringObjective filteringObjective) { if (filteringObjective.type() == FilteringObjective.Type.PERMIT) { processFilter(filteringObjective, filteringObjective.op() == Objective.Operation.ADD, filteringObjective.appId()); } else { fail(filteringObjective, ObjectiveError.UNSUPPORTED); } }
public List<FilteringObjective> updateFilter(FilteringObjective filteringObjective) { List<FilteringObjective> updates = new ArrayList<>(); switch (filteringObjective.op()) { case ADD: this.filterMap.put(filteringObjective.id(), filteringObjective); updates.add(filteringObjective); break; case REMOVE: this.filterMap.remove(filteringObjective.id()); updates.add(filteringObjective); break; default: break; } return updates; }
switch (filter.type()) { case PERMIT: actions = (filter.meta() == null) ? DefaultTrafficTreatment.builder().punt() : DefaultTrafficTreatment.builder(filter.meta()); break; case DENY: actions = (filter.meta() == null) ? DefaultTrafficTreatment.builder() : DefaultTrafficTreatment.builder(filter.meta()); actions.drop(); break; default: log.warn("Unknown filter type: {}", filter.type()); actions = DefaultTrafficTreatment.builder().drop(); filter.conditions().stream().forEach(selector::add); if (filter.key() != null) { selector.add(filter.key()); .withSelector(selector.build()) .withTreatment(actions.build()) .fromApp(filter.appId()) .withPriority(filter.priority()); if (filter.permanent()) { ruleBuilder.makePermanent(); } else {
Instructions.OutputInstruction output; if (filter.meta() != null && !filter.meta().immediate().isEmpty()) { output = (Instructions.OutputInstruction) filter.meta().immediate().stream() .filter(t -> t.type().equals(Instruction.Type.OUTPUT)) .limit(1) if (filter.key().type() != Criterion.Type.IN_PORT) { fail(filter, ObjectiveError.BADPARAMS); return; filterForCriterion(filter.conditions(), Criterion.Type.ETH_TYPE); } else if (ethType.ethType().equals(EthType.EtherType.IPV4.ethType())) { IPProtocolCriterion ipProto = (IPProtocolCriterion) filterForCriterion(filter.conditions(), Criterion.Type.IP_PROTO); if (ipProto.protocol() == IPv4.PROTOCOL_IGMP) { provisionIgmp(filter, ethType, ipProto, output);
if (!filt.key().equals(Criteria.dummy()) && filt.key().type() == Criterion.Type.IN_PORT) { p = (PortCriterion) filt.key(); } else { log.warn("No key defined in filtering objective from app: {}. Not" for (Criterion c : filt.conditions()) { if (c.type() == Criterion.Type.ETH_DST) { e = (EthCriterion) c;
private void provisionIgmp(FilteringObjective filter, EthTypeCriterion ethType, IPProtocolCriterion ipProto, Instructions.OutputInstruction output) { TrafficSelector selector = buildSelector(filter.key(), ethType, ipProto); TrafficTreatment treatment = buildTreatment(output); buildAndApplyRule(filter, selector, treatment); }
private void buildAndApplyRule(FilteringObjective filter, TrafficSelector selector, TrafficTreatment treatment) { FlowRule rule = DefaultFlowRule.builder() .fromApp(filter.appId()) .forDevice(deviceId) .forTable(0) .makePermanent() .withSelector(selector) .withTreatment(treatment) .withPriority(filter.priority()) .build(); FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder(); switch (filter.type()) { case PERMIT: opsBuilder.add(rule); break; case DENY: opsBuilder.remove(rule); break; default: log.warn("Unknown filter type : {}", filter.type()); fail(filter, ObjectiveError.UNSUPPORTED); } applyFlowRules(opsBuilder, filter); }
protected List<FlowRule> processVlanIdFilter(VlanIdCriterion vlanIdCriterion, FilteringObjective filt, VlanId assignedVlan, ApplicationId applicationId) { List<FlowRule> rules = new ArrayList<>(); log.debug("adding rule for VLAN: {}", vlanIdCriterion.vlanId()); TrafficSelector.Builder selector = DefaultTrafficSelector .builder(); TrafficTreatment.Builder treatment = DefaultTrafficTreatment .builder(); PortCriterion p = (PortCriterion) filt.key(); if (vlanIdCriterion.vlanId() != VlanId.NONE) { selector.matchVlanId(vlanIdCriterion.vlanId()); selector.matchInPort(p.port()); } else { selector.matchInPort(p.port()); treatment.immediate().pushVlan().setVlanId(assignedVlan); } treatment.transition(tmacTableId); FlowRule rule = DefaultFlowRule.builder().forDevice(deviceId) .withSelector(selector.build()) .withTreatment(treatment.build()) .withPriority(filt.priority()).fromApp(applicationId) .makePermanent().forTable(vlanTableId).build(); rules.add(rule); return rules; }
protected List<FilteringObjective> updateFilter(FilteringObjective filteringObjective) { switch (this.operator) { case Parallel: return updateFilterParallel(filteringObjective); case Sequential: return updateFilterSequential(filteringObjective); case Override: return updateFilterOverride(filteringObjective); case Application: if (filteringObjective.appId().id() == this.applicationId) { return this.filterTable.updateFilter(filteringObjective); } else { return new ArrayList<>(); } default: return new ArrayList<>(); } }
ApplicationId applicationId) { if (vlanIdCriterion == null) { return processEthDstOnlyFilter(ethCriterion, applicationId, filt.priority()); .withSelector(selectorIp.build()) .withTreatment(treatmentIp.build()) .withPriority(filt.priority()).fromApp(applicationId) .makePermanent().forTable(tmacTableId).build(); log.debug("adding IP ETH rule for MAC: {}", ethCriterion.mac()); .forDevice(deviceId).withSelector(selectorMpls.build()) .withTreatment(treatmentMpls.build()) .withPriority(filt.priority()).fromApp(applicationId) .makePermanent().forTable(tmacTableId).build(); log.debug("adding MPLS ETH rule for MAC: {}", ethCriterion.mac());
if (filt.key().equals(Criteria.dummy()) || filt.key().type() != Criterion.Type.IN_PORT) { log.warn("No key defined in filtering objective from app: {}. Not" + "processing filtering objective", applicationId); for (Criterion criterion : filt.conditions()) { if (criterion.type() == Criterion.Type.ETH_DST) { ethCriterion = (EthCriterion) criterion; if (filt.meta() == null) { log.error("Missing metadata in filtering objective required " + "for vlan assignment in dev {}", deviceId); return; for (Instruction i : filt.meta().allInstructions()) { if (i instanceof ModVlanIdInstruction) { assignedVlan = ((ModVlanIdInstruction) i).vlanId();
VlanIdCriterion v = null; if (!filt.key().equals(Criteria.dummy()) && filt.key().type() == Criterion.Type.IN_PORT) { p = (PortCriterion) filt.key(); } else { log.warn("No key defined in filtering objective from app: {}. Not" for (Criterion c : filt.conditions()) { if (c.type() == Criterion.Type.ETH_DST || c.type() == Criterion.Type.ETH_DST_MASKED) {
private void provisionEapol(FilteringObjective filter, EthTypeCriterion ethType, Instructions.OutputInstruction output) { TrafficSelector selector = buildSelector(filter.key(), ethType); TrafficTreatment treatment = buildTreatment(output); buildAndApplyRule(filter, selector, treatment); }
VlanIdCriterion vidCriterion = null; Collection<IPCriterion> ips = new ArrayList<IPCriterion>(); if (!filt.key().equals(Criteria.dummy()) && filt.key().type() == Criterion.Type.IN_PORT) { portCriterion = (PortCriterion) filt.key(); } else { log.warn("No key defined in filtering objective from app: {}. Not" for (Criterion criterion : filt.conditions()) { if (criterion.type() == Criterion.Type.ETH_DST || criterion.type() == Criterion.Type.ETH_DST_MASKED) { if (vidCriterion != null) { if (filt.meta() != null) { assignedVlan = readVlanFromTreatment(filt.meta()); + "Not proccessing VLAN filters on device {}.", deviceId); log.debug("VLAN ID in criterion={}, metadata={}", readVlanFromTreatment(filt.meta()), vidCriterion.vlanId()); fail(filt, ObjectiveError.BADPARAMS); return;
@Override public void filter(FilteringObjective filteringObjective) { if (filteringObjective.type() == FilteringObjective.Type.PERMIT) { processFilter(filteringObjective, filteringObjective.op() == Objective.Operation.ADD, filteringObjective.appId()); } else { fail(filteringObjective, ObjectiveError.UNSUPPORTED); } }
private void processFilter(FilteringObjective filt, boolean install, ApplicationId applicationId) { PortCriterion p; if (!filt.key().equals(Criteria.dummy()) && filt.key().type() == Criterion.Type.IN_PORT) { p = (PortCriterion) filt.key(); } else { log.warn("No key defined in filtering objective from app: {}. Not" for (Criterion c : filt.conditions()) {
FilteringObjQueueKey k = new FilteringObjQueueKey(deviceId, priority, ((FilteringObjective) obj).key()); filtObjQueue.put(k, obj); queueSize = filtObjQueue.get(k).size();
VlanIdCriterion vidCriterion = null; Collection<IPCriterion> ips = new ArrayList<IPCriterion>(); if (!filt.key().equals(Criteria.dummy()) && filt.key().type() == Criterion.Type.IN_PORT) { portCriterion = (PortCriterion) filt.key(); } else { log.warn("No key defined in filtering objective from app: {}. Not" for (Criterion criterion : filt.conditions()) { if (criterion.type() == Criterion.Type.ETH_DST || criterion.type() == Criterion.Type.ETH_DST_MASKED) { if (filt.meta() == null) { log.error("Missing metadata in filtering objective required " + "for vlan assignment in dev {}", deviceId); return; for (Instruction i : filt.meta().allInstructions()) { if (i instanceof ModVlanIdInstruction) { assignedVlan = ((ModVlanIdInstruction) i).vlanId();
@Override public void filter(FilteringObjective filteringObjective) { if (filteringObjective.type() == FilteringObjective.Type.PERMIT) { processFilter(filteringObjective, filteringObjective.op() == Objective.Operation.ADD, filteringObjective.appId()); } else { fail(filteringObjective, ObjectiveError.UNSUPPORTED); } }