1% MACControl test campaign 2 3# 4# execute test: 5# $ test/run_tests -P "load_contrib('mac_control')" -t test/contrib/mac_control.uts 6# 7 8+ Basic layer handling 9 10= pause frame 11 12frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 13 MACControlPause(pause_time=0x1234) 14 15frm = Ether(frm.do_build()) 16 17pause_layer = frm[MACControlPause] 18assert pause_layer.pause_time == 0x1234 19assert pause_layer.get_pause_time(ETHER_SPEED_MBIT_10) == 0.238592 20 21= gate frame 22 23frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 24 MACControlGate(timestamp=0x12345678) 25frm = Ether(frm.do_build()) 26 27gate_layer = frm[MACControlGate] 28assert gate_layer.timestamp == 0x12345678 29 30= report frame 31 32frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 33 MACControlReport(timestamp=0x12345678, pending_grants=0x23) 34 35frm = Ether(frm.do_build()) 36 37report_layer = frm[MACControlReport] 38 39assert report_layer.timestamp == 0x12345678 40assert report_layer.pending_grants == 0x23 41 42= report frame flags (generic for all other register frame types) 43 44for flag in MACControl.REGISTER_FLAGS: 45 frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ 46 MACControlReport(timestamp=0x12345678, flags=flag) 47 frm = Ether(frm.do_build()) 48 report_layer = frm[MACControlReport] 49 assert report_layer.flags == flag 50 51= register_req frame 52 53frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 54 MACControlRegisterReq(timestamp=0x87654321, 55 echoed_pending_grants=0x12, 56 sync_time=0x3344, 57 assigned_port=0x7766) 58 59frm = Ether(frm.do_build()) 60register_req_layer = frm[MACControlRegisterReq] 61 62assert register_req_layer.timestamp == 0x87654321 63assert (register_req_layer.echoed_pending_grants == 0x12) 64assert (register_req_layer.sync_time == 0x3344) 65assert (register_req_layer.assigned_port == 0x7766) 66 67= register frame 68 69frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 70 MACControlRegister(timestamp=0x11223344, 71 echoed_assigned_port=0x2277, 72 echoed_sync_time=0x3399) 73 74frm = Ether(frm.do_build()) 75register_layer = frm[MACControlRegister] 76assert register_layer.timestamp == 0x11223344 77assert register_layer.echoed_assigned_port == 0x2277 78assert register_layer.echoed_sync_time == 0x3399 79 80= register_ack frame 81 82frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ 83 MACControlRegisterAck(timestamp=0x11223344, 84 echoed_assigned_port=0x2277, 85 echoed_sync_time=0x3399) 86 87frm = Ether(frm.do_build()) 88register_ack_layer = frm[MACControlRegisterAck] 89assert register_ack_layer.timestamp == 0x11223344 90assert register_ack_layer.echoed_assigned_port == 0x2277 91assert register_ack_layer.echoed_sync_time == 0x3399 92 93= class based flow control frame 94 95frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/ \ 96 MACControlClassBasedFlowControl(c0_enabled=1, c0_pause_time=0x4321, 97 c5_enabled=1, c5_pause_time=0x1234) 98 99frm = Ether(frm.do_build()) 100cbfc_layer = frm[MACControlClassBasedFlowControl] 101assert cbfc_layer.c0_enabled 102assert cbfc_layer.c0_pause_time == 0x4321 103assert cbfc_layer.c5_enabled 104assert cbfc_layer.c5_pause_time == 0x1234 105assert not cbfc_layer.c1_enabled 106assert cbfc_layer.c1_pause_time == 0 107assert not cbfc_layer.c7_enabled 108assert cbfc_layer.c7_pause_time == 0 109assert cbfc_layer._reserved == 0 110 111+ test padding 112 113= naked frame 114 115frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ 116 MACControlRegisterAck(timestamp=0x12345678) 117 118frm = frm.do_build() 119assert len(frm) == 60 120 121= single vlan tag 122 123frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ 124 Dot1Q(vlan=42) / \ 125 MACControlRegisterAck(timestamp=0x12345678) 126 127frm = frm.do_build() 128assert len(frm) == 60 129 130= QinQ 131 132frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ 133 Dot1Q(vlan=42) / \ 134 Dot1Q(vlan=42) / \ 135 MACControlRegisterAck(timestamp=0x12345678) 136 137frm = frm.do_build() 138assert len(frm) == 60 139 140= hand craftet payload (disabled auto padding) 141 142frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ 143 MACControlRegisterAck(timestamp=0x12345678) / \ 144 Raw(b'may pass devices') 145 146frm = Ether(frm.do_build()) 147raw_layer = frm[Raw] 148assert raw_layer.load == b'may pass devices' 149assert len(frm) < 64 150