Exemplo n.º 1
0
 def request():
     while True:
         if self.sendRequest:
             self.sendRequest = False
             yield self.streamChannelRequest
         else:
             yield p4runtime_pb2.StreamMessageRequest()
Exemplo n.º 2
0
def main():
    host = ServerConfig.HOST
    server_port = ServerConfig.SERVER_PORT
    with open(ServerConfig.SERVER_CERTIFICATE, "rb") as file:
            trusted_certs = file.read()

    credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
    channel = grpc.secure_channel("{}:{}".format(host, server_port), credentials)
    client = P4RuntimeClient()

    streamC = client.StreamChannel()
    tables_initialized = False
    while True:
        try:
            packet = next(streamC)

            if packet.HasField("packet") and packet.packet.metadata[0].metadata_id == dev_id:
                ServerConfig.print_debug("Received packet:")
                ServerConfig.print_debug("Payload: {}".format(hexlify(packet.packet.payload)))
                ServerConfig.print_debug("Switch id: {}".format(packet.packet.metadata[0].metadata_id))
                ServerConfig.print_debug("Input port: {}\n".format(hexlify(packet.packet.metadata[0].value)))

            if packet.HasField("other"):
                if packet.other.value == "\n\014Auth success":

                    ServerConfig.print_debug("Received authentication response from server:")
                    ServerConfig.print_debug(packet)

                    # Prepare an arbitration request.
                    client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest()
                    client.streamChannelRequest.arbitration.device_id = 1
                    client.streamChannelRequest.arbitration.role.id = 1
                    client.sendRequest = True

            if packet.HasField("arbitration"):

                ServerConfig.print_debug("Received arbitration response from server:")
                ServerConfig.print_debug(packet)

                if tables_initialized is False:
                    for mac in forward_table_dict:
                        client.WriteTableEntry(p4runtime_pb2.Update.INSERT, FORWARD, mac, forward_table_dict[mac])
                        # client.ReadTableEntry(FORWARD, mac)
                    tables_initialized = True

                while True:
                    client.ReadRegisterEntry(2, 0)
                    client.WriteRegisterEntry(2, 0, 10)
                    client.ReadRegisterEntry(2, 0)
                    sleep(2)

        except IndexError:
            continue
Exemplo n.º 3
0
    def __init__(self):
        # Configure the host and the port to which the client should connect to.
        self.host = ServerConfig.HOST
        self.server_port = ServerConfig.SERVER_PORT

        with open(ServerConfig.SERVER_CERTIFICATE, "rb") as file:
            trusted_certs = file.read()

        # Instantiate a communication channel and bind the client to the server.
        self.credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
        self.channel = grpc.secure_channel("{}:{}".format(self.host, self.server_port), self.credentials)
        self.stub = p4runtime_pb2_grpc.P4RuntimeStub(self.channel)

        self.streamChannelRequest = p4runtime_pb2.StreamMessageRequest()
        self.sendRequest = True
Exemplo n.º 4
0
def main():
    global dev_id

    host = ServerConfig.HOST
    server_port = ServerConfig.SERVER_PORT
    with open(ServerConfig.SERVER_CERTIFICATE, "rb") as file:
        trusted_certs = file.read()

    credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
    channel = grpc.secure_channel("{}:{}".format(host, server_port),
                                  credentials)
    client = P4RuntimeClient()

    streamC = client.StreamChannel()
    while True:
        try:
            packet = next(streamC)

            # we will only process packet-ins from l2 (check device id)
            if packet.HasField("packet") and packet.packet.metadata[
                    0].metadata_id == dev_id:

                # Packet out.
                client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest(
                )
                client.streamChannelRequest.packet.payload = packet.packet.payload
                metadata = client.streamChannelRequest.packet.metadata.add()
                metadata.metadata_id = packet.packet.metadata[0].metadata_id
                metadata.value = struct.pack("B", 1)
                client.sendRequest = True
                print "Packet-out: Client 1 -> Switch {}".format(
                    metadata.metadata_id)

            if packet.HasField("other"):
                if packet.other.value == "\n\014Auth success":

                    ServerConfig.print_debug(
                        "Received authentication response from server:")
                    ServerConfig.print_debug(packet)

        except IndexError:
            continue
def main():
    global dev_id

    host = ServerConfig.HOST
    server_port = ServerConfig.SERVER_PORT
    with open(ServerConfig.SERVER_CERTIFICATE, "rb") as file:
        trusted_certs = file.read()

    credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
    channel = grpc.secure_channel("{}:{}".format(host, server_port),
                                  credentials)
    client = P4RuntimeClient()

    streamC = client.StreamChannel()
    while True:
        try:
            packet = next(streamC)

            # we will only process packet-ins from l2 (check device id)
            if packet.HasField("packet") and packet.packet.metadata[
                    0].metadata_id == dev_id:
                print "Packet-in: server => l2 controller %.9f" % time.time()
                # Print packet info.
                ServerConfig.print_debug(
                    "Received packet from switch ID {} input port {}".format(
                        packet.packet.metadata[0].metadata_id,
                        struct.unpack("Q",
                                      packet.packet.metadata[0].value)[0]))
                # print "Payload: {}".format(hexlify(packet.packet.payload))
                #print packet.packet

                # Extract packet.
                pkt = Ether(_pkt=packet.packet.payload)
                eth_src = pkt.getlayer(Ether).src
                eth_dst = pkt.getlayer(Ether).dst
                ether_type = pkt.getlayer(Ether).type
                ServerConfig.print_debug(
                    "Received Ethernet frame {} => {} type_hex {}".format(
                        eth_src, eth_dst, hex(ether_type)))

                # Call to insert the entry into the table.
                #client.WriteTableEntry(p4runtime_pb2.Update.INSERT, DMAC, eth_dst)

                # # Call to read the entry from the table.
                # client.ReadTableEntry(DMAC, eth_dst)

                # Packet out.
                client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest(
                )
                client.streamChannelRequest.packet.payload = packet.packet.payload
                metadata = client.streamChannelRequest.packet.metadata.add()
                metadata.metadata_id = packet.packet.metadata[0].metadata_id
                metadata.value = struct.pack("B", 1)
                client.sendRequest = True
                print "Packet-out: l2 controller => server %.9f" % time.time()

            if packet.HasField("other"):
                if packet.other.value == "\n\014Auth success":

                    ServerConfig.print_debug(
                        "Received authentication response from server:")
                    ServerConfig.print_debug(packet)

                    # Prepare an arbitration request.
                    client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest(
                    )
                    client.streamChannelRequest.arbitration.device_id = dev_id
                    client.streamChannelRequest.arbitration.role.id = 1
                    client.sendRequest = True

            if packet.HasField("arbitration"):
                ServerConfig.print_debug(
                    "Received master arbitration response from server:")
                ServerConfig.print_debug(packet)
                pass

        except IndexError:
            continue
Exemplo n.º 6
0
 def packetOut(self, request, context):
     request = p4runtime_pb2.StreamMessageRequest()
     request.packet.CopyFrom(packet)
     yield request
def main():
    global dev_id
    host = ServerConfig.HOST
    server_port = ServerConfig.SERVER_PORT
    with open(ServerConfig.SERVER_CERTIFICATE, "rb") as file:
        trusted_certs = file.read()

    credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
    channel = grpc.secure_channel("{}:{}".format(host, server_port),
                                  credentials)
    client = P4RuntimeClient()

    streamC = client.StreamChannel()

    tables_initialized = False
    while True:
        try:
            packet = next(streamC)

            if packet.HasField("packet") and packet.packet.metadata[
                    0].metadata_id == dev_id:
                print "Packet-in: server => replay controller %.9f" % time.time(
                )

                # Print packet information.
                ServerConfig.print_debug("Received packet:")
                ServerConfig.print_debug("Payload: {}".format(
                    hexlify(packet.packet.payload)))
                ServerConfig.print_debug("Switch id: {}".format(
                    packet.packet.metadata[0].metadata_id))
                ServerConfig.print_debug("Input port: {}\n".format(
                    hexlify(packet.packet.metadata[0].value)))

                # Extract packet.
                pkt = Ether(_pkt=packet.packet.payload)
                eth_src = pkt.getlayer(Ether).src
                eth_dst = pkt.getlayer(Ether).dst
                ether_type = pkt.getlayer(Ether).type
                ServerConfig.print_debug(
                    "Received Ethernet frame {} => {} type_hex {}".format(
                        eth_src, eth_dst, hex(ether_type)))

                # The packet can be either ipv4 or 802.1q (vlan).
                if ether_type == 2048 or ether_type == 33024:

                    # Print packet data.
                    ip_src = pkt[IP].src
                    ip_dst = pkt[IP].dst
                    ServerConfig.print_debug(
                        "Ethernet frame has IPv4 packet {} => {}".format(
                            ip_src, ip_dst))

                    # Call to write the entry into the table.
                    client.WriteTableEntry(p4runtime_pb2.Update.INSERT,
                                           IPV4_NHOP, ip_dst, ip_dst)
                    client.WriteTableEntry(p4runtime_pb2.Update.INSERT,
                                           FORWARD, ip_dst,
                                           "00:15:4d:13:61:07 0b00000100")
                    # client.ReadTableEntry(IPV4_NHOP, ip_dst)

                    # Packet out.
                    client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest(
                    )
                    client.streamChannelRequest.packet.payload = packet.packet.payload
                    metadata = client.streamChannelRequest.packet.metadata.add(
                    )
                    metadata.metadata_id = packet.packet.metadata[
                        0].metadata_id
                    metadata.value = struct.pack("B", 1)
                    client.sendRequest = True
                    print "Packet-out: replay controller => server %.9f" % time.time(
                    )

            if packet.HasField("other"):
                if tables_initialized is False:
                    # for replay, we only configure the send_frame table
                    for ip in send_frame_dict:
                        client.WriteTableEntry(p4runtime_pb2.Update.INSERT,
                                               SEND_FRAME, ip,
                                               send_frame_dict[ip])
                        # client.ReadTableEntry(SEND_FRAME, ip)
                    # for ip in forward_table_dict:
                    #    client.WriteTableEntry(p4runtime_pb2.Update.INSERT, FORWARD, ip, forward_table_dict[ip])
                    # client.ReadTableEntry(FORWARD, ip)
                    tables_initialized = True

                if packet.other.value == "\n\014Auth success":

                    ServerConfig.print_debug(
                        "Received authentication response from server:")
                    ServerConfig.print_debug(packet)

                    # Prepare an arbitration request.
                    client.streamChannelRequest = p4runtime_pb2.StreamMessageRequest(
                    )
                    client.streamChannelRequest.arbitration.device_id = dev_id
                    client.streamChannelRequest.arbitration.role.id = 1
                    client.sendRequest = True

            if packet.HasField("arbitration"):
                ServerConfig.print_debug(
                    "Received arbitration response from server:")
                ServerConfig.print_debug(packet)
                pass

        except IndexError:
            continue