blob: eb34e7ea3cfabefeb34257e9ad2261db1d17285a [file] [log] [blame]
Dan Talayco5eba8442010-03-10 13:58:43 -08001"""
2Test cases for testing actions taken on packets
3
4See basic.py for other info.
5
6It is recommended that these definitions be kept in their own
7namespace as different groups of tests will likely define
8similar identifiers.
9
10 The function test_set_init is called with a complete configuration
11dictionary prior to the invocation of any tests from this file.
12
13 The switch is actively attempting to contact the controller at the address
14indicated oin oft_config
15
16"""
17
18import logging
19
20import unittest
21
22import oftest.controller as controller
23import oftest.cstruct as ofp
24import oftest.message as message
25import oftest.dataplane as dataplane
26import oftest.action as action
27import oftest.parse as parse
28import basic
29
30from testutils import *
31
32#@var port_map Local copy of the configuration map from OF port
33# numbers to OS interfaces
34pa_port_map = None
35#@var pa_logger Local logger object
36pa_logger = None
37#@var pa_config Local copy of global configuration data
38pa_config = None
39
40def test_set_init(config):
41 """
42 Set up function for packet action test classes
43
44 @param config The configuration dictionary; see oft
45 """
46
47 global pa_port_map
48 global pa_logger
49 global pa_config
50
51 pa_logger = logging.getLogger("pkt_act")
52 pa_logger.info("Initializing test set")
53 pa_port_map = config["port_map"]
54 pa_config = config
55
56class DirectPacket(basic.SimpleDataPlane):
57 """
58 Test case that checks single port direction action
59
60 Generate a packet
61 Generate and install a matching flow
62 Add action to direct the packet to an egress port
63 Send the packet to ingress dataplane port
64 Verify the packet is received at the egress port only
65 """
66 def runTest(self):
67 global pa_port_map
68 of_ports = pa_port_map.keys()
69 of_ports.sort()
70 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
71
72 rc = delete_all_flows(self.controller, pa_logger)
73 self.assertEqual(rc, 0, "Failed to delete all flows")
74
75 pkt = simple_tcp_packet()
76 match = parse.packet_to_flow_match(pkt)
77 self.assertTrue(match is not None,
78 "Could not generate flow match from pkt")
79 act = action.action_output()
80
81 for idx in range(len(of_ports)):
82 ingress_port = of_ports[idx]
83 egress_port = of_ports[(idx + 1) % len(of_ports)]
84 pa_logger.info("Ingress " + str(ingress_port) +
85 " to egress " + str(egress_port))
86
87 match.in_port = ingress_port
88
89 request = message.flow_mod()
90 request.match = match
91 request.buffer_id = 0xffffffff
92 act.port = egress_port
93 self.assertTrue(request.actions.add(act), "Could not add action")
94
95 pa_logger.info("Inserting flow")
96 rv = self.controller.message_send(request)
97 self.assertTrue(rv != -1, "Error installing flow mod")
98 do_barrier(self.controller)
99
100 pa_logger.info("Sending packet to dp port " +
101 str(ingress_port))
102 self.dataplane.send(ingress_port, str(pkt))
103 (rcv_port, rcv_pkt, pkt_time) = self.dataplane.poll(timeout=1)
104 self.assertTrue(rcv_pkt is not None, "Did not receive packet")
105 pa_logger.debug("Packet len " + str(len(pkt)) + " in on " +
106 str(rcv_port))
107 self.assertEqual(rcv_port, egress_port, "Unexpected receive port")
108 self.assertEqual(str(pkt), str(rcv_pkt),
109 'Response packet does not match send packet')
110
111