def flow_add(self, mod): assert isinstance(mod, ofp.ofp_flow_mod) assert mod.cookie_mask == 0 # read from model flows = list(self.flows_proxy.get('/').items) changed = False check_overlap = mod.flags & ofp.OFPFF_CHECK_OVERLAP if check_overlap: if self.find_overlapping_flows(flows, mod, True): self.signal_flow_mod_error( ofp.OFPFMFC_OVERLAP, mod) else: # free to add as new flow flow = flow_stats_entry_from_flow_mod_message(mod) flows.append(flow) changed = True self.log.debug('flow-added', flow=mod) else: flow = flow_stats_entry_from_flow_mod_message(mod) idx = self.find_flow(flows, flow) if idx >= 0: old_flow = flows[idx] if not (mod.flags & ofp.OFPFF_RESET_COUNTS): flow.byte_count = old_flow.byte_count flow.packet_count = old_flow.packet_count flows[idx] = flow changed = True self.log.debug('flow-updated', flow=flow) else: flows.append(flow) changed = True self.log.debug('flow-added', flow=mod) # write back to model if changed: self.flows_proxy.update('/', Flows(items=flows))
def flow_add(self, mod): assert isinstance(mod, ofp.ofp_flow_mod) assert mod.cookie_mask == 0 # read from model flows = list(self.flows_proxy.get('/').items) changed = False check_overlap = mod.flags & ofp.OFPFF_CHECK_OVERLAP if check_overlap: if self.find_overlapping_flows(flows, mod, True): self.signal_flow_mod_error( ofp.OFPFMFC_OVERLAP, mod) else: # free to add as new flow flow = flow_stats_entry_from_flow_mod_message(mod) flows.append(flow) changed = True self.log.debug('flow-added', flow=mod) else: flow = flow_stats_entry_from_flow_mod_message(mod) idx = self.find_flow(flows, flow) if idx >= 0: old_flow = flows[idx] if not (mod.flags & ofp.OFPFF_RESET_COUNTS): flow.byte_count = old_flow.byte_count flow.packet_count = old_flow.packet_count flows[idx] = flow changed = True self.log.debug('flow-updated', flow=flow) else: flows.append(flow) changed = True self.log.debug('flow-added', flow=mod) # write back to model if changed: self.flows_proxy.update('/', Flows(items=flows))
def flow_delete_strict(self, mod): assert isinstance(mod, ofp.ofp_flow_mod) # read from model flows = list(self.flows_proxy.get('/').items) changed = False flow = flow_stats_entry_from_flow_mod_message(mod) idx = self.find_flow(flows, flow) if (idx >= 0): del flows[idx] changed = True else: # TODO need to check what to do with this case self.log.warn('flow-cannot-delete', flow=flow) if changed: self.flows_proxy.update('/', Flows(items=flows))
def flow_delete_strict(self, mod): assert isinstance(mod, ofp.ofp_flow_mod) # read from model flows = list(self.flows_proxy.get('/').items) changed = False flow = flow_stats_entry_from_flow_mod_message(mod) idx = self.find_flow(flows, flow) if (idx >= 0): del flows[idx] changed = True else: # TODO need to check what to do with this case self.log.warn('flow-cannot-delete', flow=flow) if changed: self.flows_proxy.update('/', Flows(items=flows))