def update_flow_table(self, flows): stub = ponsim_pb2.PonSimStub(self.get_channel()) self.log.info('pushing-olt-flow-table') for flow in flows: classifier_info = {} for field in fd.get_ofb_fields(flow): if field.type == fd.ETH_TYPE: classifier_info['eth_type'] = field.eth_type self.log.debug('field-type-eth-type', eth_type=classifier_info['eth_type']) elif field.type == fd.IP_PROTO: classifier_info['ip_proto'] = field.ip_proto self.log.debug('field-type-ip-proto', ip_proto=classifier_info['ip_proto']) if ('ip_proto' in classifier_info and (classifier_info['ip_proto'] == 17 or classifier_info['ip_proto'] == 2)) or ( 'eth_type' in classifier_info and classifier_info['eth_type'] == 0x888e): for action in fd.get_actions(flow): if action.type == ofp.OFPAT_OUTPUT: action.output.port = ofp.OFPP_CONTROLLER self.log.info('out_port', out_port=fd.get_out_port(flow)) stub.UpdateFlowTable(FlowTable(port=0, flows=flows)) self.log.info('success')
def update_flow_table(self, flows): stub = ponsim_pb2.PonSimStub(self.get_channel()) self.log.info('pushing-olt-flow-table') stub.UpdateFlowTable(FlowTable( port=0, flows=flows )) self.log.info('success')
def update_flow_table(self, flows): stub = ponsim_pb2_grpc.PonSimStub(self.get_channel()) self.log.info('pushing-olt-flow-table') eapol_flows = {} eapol_flow_without_vlan = False for flow in flows: classifier_info = self.get_classifier_info(flow) self.log.debug('classifier_info', classifier_info=classifier_info) if IP_PROTO in classifier_info: if classifier_info[IP_PROTO] == 17: if UDP_SRC in classifier_info: if classifier_info[UDP_SRC] == 68: self.log.info('dhcp upstream flow add') elif classifier_info[UDP_SRC] == 67: self.log.info('dhcp downstream flow add') self.to_controller(flow) elif classifier_info[IP_PROTO] == 2: self.log.info('igmp flow add') self.to_controller(flow) else: self.log.warn("Invalid-Classifier-to-handle", classifier_info=classifier_info) elif ETH_TYPE in classifier_info: if classifier_info[ETH_TYPE] == EAP_ETH_TYPE: self.log.info('eapol flow add') self.to_controller(flow) if VLAN_VID in classifier_info: eapol_flows[classifier_info[VLAN_VID]] = flow else: eapol_flow_without_vlan = True # The OLT app is now adding EAPOL flows with VLAN_VID=4091 but Ponsim can't # properly handle this because it uses VLAN_VID to encode the UNI port ID. # Add an EAPOL trap flow with no VLAN_VID match if we see the 4091 match. if 4091 in eapol_flows and not eapol_flow_without_vlan: new_eapol_flow = [ fd.mk_flow_stat( priority=10000, match_fields=[fd.in_port(1), fd.eth_type(EAP_ETH_TYPE)], actions=[fd.output(ofp.OFPP_CONTROLLER)] ) ] flows.extend(new_eapol_flow) self.log.info('add eapol flow with no VLAN_VID match') stub.UpdateFlowTable(FlowTable( port=0, flows=flows )) self.log.info('success')
def update_flow_table(self, flows): # we need to proxy through the OLT to get to the ONU # reset response queue while self.incoming_messages.pending: yield self.incoming_messages.get() msg = FlowTable(port=self.proxy_address.channel_id, flows=flows) self.adapter_agent.send_proxied_message(self.proxy_address, msg) yield self.incoming_messages.get()