Exemplo n.º 1
0
 def StreamChannelMock(request_iterator, context):
     for req in request_iterator:
         if req.HasField('arbitration'):
             rep = p4runtime_pb2.StreamMessageResponse()
             rep.arbitration.CopyFrom(req.arbitration)
             rep.arbitration.status.code = code_pb2.ALREADY_EXISTS
             yield rep
Exemplo n.º 2
0
    def test_packet_in(self):
        # In this tests we will send a packet-in message from the servicer and check if
        # packet_in.sniff method works
        msg = p4runtime_pb2.StreamMessageResponse()
        msg.packet.payload = b'Random packet-in payload'
        md = p4runtime_pb2.PacketMetadata()
        md.metadata_id = 1
        md.value = b'\x00\x01'
        msg.packet.metadata.append(md)

        # Have to sniff the packet in another thread since this blocks the thread
        packet_in = sh.PacketIn()
        captured_packet = []

        def _sniff_packet(captured_packet):
            captured_packet += packet_in.sniff(timeout=1)

        _t = Thread(target=_sniff_packet, args=(captured_packet, ))
        _t.start()

        # TODO: modify the servicer to send stream message?
        sh.client.stream_in_q["packet"].put(msg)
        _t.join()

        self.assertEqual(len(captured_packet), 1)
        self.assertEqual(captured_packet[0], msg)
Exemplo n.º 3
0
def sniffer_thread():
    global packetLim

    sniffer_instance = Sniffer(ServerConfig.PACKETIN_IFACE, 1500)

    newPacketIn = PacketInStruct()
    c_packet_id = 0

    print "Sniffer Thread Started"

    while True:
        pack_data = sniffer_instance.recv_packet_in()
        if (pack_data != False) and pack_data[0] >= 0 and pack_data[0] < len(
                packetLim) and (not packetLim[pack_data[0]]):
            packetLim[pack_data[0]] = True

            newPacketIn = PacketInStruct()
            newPacketIn.packetInResponse = p4runtime_pb2.StreamMessageResponse(
            )
            newPacketIn.packetInResponse.packet.payload = pack_data[2]
            newPacketIn.metadata = newPacketIn.packetInResponse.packet.metadata.add(
            )
            newPacketIn.metadata.metadata_id = pack_data[0]
            newPacketIn.metadata.value = pack_data[1]
            newPacketIn.packet_id = c_packet_id

            c_packet_id = c_packet_id + 1

            print "EXPT: Packet-in (%d): interface => server %.9f" % (
                c_packet_id, time.time())
            ConnectionArray.sendPacketInToBuffer(newPacketIn)
Exemplo n.º 4
0
    def __init__(self):
        self.packetInResponse = p4runtime_pb2.StreamMessageResponse()
        self.packetInResponse.packet.payload = " "
        self.metadata = self.packetInResponse.packet.metadata.add()
        self.metadata.metadata_id = 0
        self.metadata.value = " "

        self.packet_id = 0
Exemplo n.º 5
0
 def StreamChannel(self, request_iterator, context):
     for req in request_iterator:
         if req.HasField('arbitration'):
             rep = p4runtime_pb2.StreamMessageResponse()
             rep.arbitration.CopyFrom(req.arbitration)
             rep.arbitration.status.code = code_pb2.OK
             yield rep
         elif req.HasField('packet'):
             self.stored_packet_out.put(req)
Exemplo n.º 6
0
    def process_streamChannel(self, request_iterator, context):
        peer_key = context.peer()
        userAuthenticated = False
        login = False

        while True:
            try:
                req = next(request_iterator)
            except grpc.RpcError as e:  # End of connection
                if login is not False:
                    ConnectionArray.remove(peer_key)
                return

            if userAuthenticated:
                packet_in = ConnectionArray.getPacketInFromBuffer(
                    login.user_name)
                if packet_in is not False:
                    # -------- Begin Info Flow Control -------- #
                    print "EXPT: vIFC Start %.9f" % time.time()
                    ifc_result = VerifyEvent.verify_event_packet_in(
                        packet_in.packetInResponse.packet, context)
                    print "EXPT: vIFC Finish %.9f" % time.time()

                    if ifc_result[0] == VIFC_RESPONSE_BLOCK:
                        print "IFC Blocked Flow"
                        context.set_code(grpc.StatusCode.CANCELLED)
                        context.set_details(
                            "Attempted CAP Attack block by vIFC")
                        ServerLog.print_log(
                            "IFC Blocked flow of Packet-in (%d) was being sent to (%s): %.9f"
                            % (packet_in.packet_id, login.user_name,
                               time.time()))
                    else:
                        if ifc_result[0] == VIFC_RESPONSE_WARN:
                            print "IFC Warned Flow: {}".format(ifc_result[1])
                            ServerLog.print_log(
                                "IFC Warned flow of Packet-in (%d) sent to (%s): %.9f"
                                % (packet_in.packet_id, login.user_name,
                                   time.time()))

                        print "EXPT: Packet-in (%d): server => controller: %.9f" % (
                            packet_in.packet_id, time.time())
                        print packet_in.packetInResponse
                        yield packet_in.packetInResponse
                        ServerLog.print_log(
                            "Packet-in (%d) sent to (%s): %.9f" %
                            (packet_in.packet_id, login.user_name,
                             time.time()))
                    # --------- End Info Flow Control --------- #

            # Authentication message.
            if req.HasField(
                    "other"
            ) and req.other.type_url == "type.googleapis.com/Auth":
                ServerConfig.print_debug(
                    "Received authentication message from {}({}):".format(
                        context.peer(),
                        ConnectionArray.getUsername(context.peer())))
                ServerConfig.print_debug(req)

                # Add the connection to the pool.
                login = auth_pb2.Auth.FromString(req.other.value)
                ConnectionArray.add(peer_key, login.user_name)
                username = ConnectionArray.getUsername(context.peer())

                # Authenticate the current connection if it isn't authenticated yet.
                # Keep in mind that an user with the CONNECTED state is not authenticated.
                if ConnectionArray.isConnected(context.peer()) is True:
                    if Auth.authenticate(login.user_name,
                                         login.passwd) is True:
                        userAuthenticated = True
                        ConnectionArray.authenticate(context.peer())
                    else:
                        context.set_code(grpc.StatusCode.PERMISSION_DENIED)
                        context.set_details("Invalid username or password")
                        yield p4runtime_pb2.StreamMessageResponse()

                succ = auth_pb2.Auth()
                succ.user_name = "Auth success"
                succ.passwd = ""
                resp = p4runtime_pb2.StreamMessageResponse()
                resp.other.Pack(succ)
                yield resp

            # Arbitration update.
            elif req.HasField("arbitration"):
                ServerConfig.print_debug(
                    "Received master arbitration message from peer '{}' ({}):".
                    format(context.peer(),
                           ConnectionArray.getUsername(context.peer())))
                ServerConfig.print_debug(req)
                yield RPC_mgmt.MasterArbitration(self, req, context)

            # Packet-out message.
            elif req.HasField("packet"):
                packet = req.packet
                print "EXPT: Packet-out: controller => server %.9f" % time.time(
                )

                ServerConfig.print_debug(
                    "Packet-out arrived from the controller, for switch {} input port {}"
                    .format(packet.metadata[0].metadata_id,
                            hexlify(packet.metadata[0].value)))

                # -------- Begin Info Flow Control -------- #
                print "EXPT: vIFC Start %.9f" % time.time()
                ifc_result = VerifyEvent.verify_event_packet_out(
                    packet, context)
                print "EXPT: vIFC Finish %.9f" % time.time()
                if ifc_result[0] == VIFC_RESPONSE_BLOCK:
                    print "IFC Blocked Flow"
                elif ifc_result[0] == VIFC_RESPONSE_WARN:
                    print "IFC Warned Flow: {}".format(ifc_result[1])
                # --------- End Info Flow Control --------- #

                # print "Payload: {}".format(hexlify(packet.payload)) # we need to be quick
                RPC_mgmt.ProcessPacketOut(packet)
                print "EXPT: Packet-out: server => interface %.9f" % time.time(
                )
                ServerLog.print_log(
                    "Packet-out from (%s) to switch (%d): %.9f" %
                    (login.user_name, int(
                        packet.metadata[0].metadata_id), time.time()))
Exemplo n.º 7
0
 def MasterArbitration(self, request, context):
     resp = p4runtime_pb2.StreamMessageResponse()
     request.arbitration.device_id = 1
     resp.arbitration.CopyFrom(request.arbitration)
     resp.arbitration.status.code = code_pb2.OK
     return resp