def as_of_tlv(self): """Return a pyof OXM TLV instance.""" value_bytes = self.value.to_bytes(2, 'big') return OxmTLV(oxm_field=self.oxm_field, oxm_value=value_bytes)
def _create_vlan_tlv(vlan_id): tlv = OxmTLV() tlv.oxm_field = OxmOfbMatchField.OFPXMT_OFB_VLAN_VID oxm_value = vlan_id | VlanId.OFPVID_PRESENT tlv.oxm_value = oxm_value.to_bytes(2, 'big') return tlv
def as_of_tlv(self): """Return a pyof OXM TLV instance.""" value_bytes = IPAddress(self.value).pack() return OxmTLV(oxm_field=self.oxm_field, oxm_value=value_bytes)
def handle_packet_in(self, event): """Handle PacketIn Event. Install flows allowing communication between switch ports. Args: event (KytosPacketIn): Received Event """ log.debug("PacketIn Received") packet_in = event.content['message'] ethernet = Ethernet() ethernet.unpack(packet_in.data.value) # Ignore LLDP packets or packets not generated by table-miss flows if (ethernet.destination in settings.lldp_macs or packet_in.reason != PacketInReason.OFPR_NO_MATCH): return # Learn the port where the sender is connected in_port = packet_in.in_port switch = event.source.switch switch.update_mac_table(ethernet.source, in_port) ports = switch.where_is_mac(ethernet.destination) # Add a flow to the switch if the destination is known if ports: flow_mod = FlowMod() flow_mod.command = FlowModCommand.OFPFC_ADD flow_mod.priority = settings.flow_priority match_dl_type = OxmTLV() match_dl_type.oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_TYPE match_dl_type.oxm_value = ethernet.ether_type.value.to_bytes( 2, 'big') flow_mod.match.oxm_match_fields.append(match_dl_type) match_dl_src = OxmTLV() match_dl_src.oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_SRC match_dl_src.oxm_value = ethernet.source.pack() flow_mod.match.oxm_match_fields.append(match_dl_src) match_dl_dst = OxmTLV() match_dl_dst.oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_DST match_dl_dst.oxm_value = ethernet.destination.pack() flow_mod.match.oxm_match_fields.append(match_dl_dst) action = ActionOutput(port=ports[0]) instruction = InstructionApplyAction() instruction.actions.append(action) flow_mod.instructions.append(instruction) event_out = KytosEvent(name=('kytos/of_l2ls.messages.out.' 'ofpt_flow_mod'), content={ 'destination': event.source, 'message': flow_mod }) self.controller.buffers.msg_out.put(event_out) # Send the packet to correct destination or flood it packet_out = PacketOut() packet_out.buffer_id = packet_in.buffer_id packet_out.in_port = in_port packet_out.data = packet_in.data port = ports[0] if ports else PortNo.OFPP_FLOOD out_action = ActionOutput(port=port) packet_out.actions.append(out_action) event_out = KytosEvent(name=('kytos/of_l2ls.messages.out.' 'ofpt_packet_out'), content={ 'destination': event.source, 'message': packet_out }) self.controller.buffers.msg_out.put(event_out)