1*** Settings ***
2Documentation  Network stack stress tests using "nping" tool.
3
4# This Suite has few testcases which uses nping with ICMP.
5# ICMP creates a raw socket, which requires root privilege/sudo to run tests.
6
7Resource                ../lib/resource.robot
8Resource                ../lib/bmc_redfish_resource.robot
9Resource                ../lib/ipmi_client.robot
10Resource                ../lib/bmc_network_security_utils.robot
11Resource                ../lib/protocol_setting_utils.robot
12
13Library                 OperatingSystem
14Library                 String
15Library                 ../lib/gen_robot_valid.py
16Library                 ../lib/bmc_network_utils.py
17Library                 ../lib/ipmi_utils.py
18
19Suite Setup             Suite Setup Execution
20
21Test Tags              BMC_Network_Security
22
23*** Variables ***
24
25${delay}                1000ms
26${count}                4
27${program_name}         nping
28${iterations}           5000
29
30*** Test Cases ***
31
32Send ICMP Timestamp Request
33    [Documentation]  Send ICMP packet type 13 and check BMC drops such packets
34    [Tags]  Send_ICMP_Timestamp_Request
35
36    # Send ICMP packet type 13 to BMC and check packet loss.
37    ${packet_loss}=  Send Network Packets And Get Packet Loss
38    ...  ${OPENBMC_HOST}  ${count}  ${ICMP_PACKETS}  ${NETWORK_PORT}  ${ICMP_TIMESTAMP_REQUEST}
39    Should Be Equal As Numbers  ${packet_loss}  100.00
40    ...  msg=FAILURE: BMC is not dropping timestamp request messages.
41
42Send ICMP Netmask Request
43    [Documentation]  Send ICMP packet type 17 and check BMC drops such packets
44    [Tags]  Send_ICMP_Netmask_Request
45
46    # Send ICMP packet type 17 to BMC and check packet loss.
47    ${packet_loss}=  Send Network Packets And Get Packet Loss
48    ...  ${OPENBMC_HOST}  ${count}  ${ICMP_PACKETS}  ${NETWORK_PORT}  ${ICMP_NETMASK_REQUEST}
49    Should Be Equal As Numbers  ${packet_loss}  100.00
50    ...  msg=FAILURE: BMC is not dropping netmask request messages.
51
52Send Continuous ICMP Echo Request To BMC And Verify No Packet Loss
53    [Documentation]  Send ICMP packet type 8 continuously and check no packets are dropped from BMC
54    [Tags]  Send_Continuous_ICMP_Echo_Request_To_BMC_And_Verify_No_Packet_Loss
55
56    # Send ICMP packet type 8 to BMC and check packet loss.
57    ${packet_loss}=  Send Network Packets And Get Packet Loss
58    ...  ${OPENBMC_HOST}  ${iterations}  ${ICMP_PACKETS}
59    Should Be Equal As Numbers  ${packet_loss}  0.0
60    ...  msg=FAILURE: BMC is dropping packets.
61
62Send Network Packets Continuously To Redfish Interface
63    [Documentation]  Send network packets continuously to Redfish interface and verify stability.
64    [Tags]  Send_Network_Packets_Continuously_To_Redfish_Interface
65
66    # Send large number of packets to Redfish interface.
67    ${packet_loss}=  Send Network Packets And Get Packet Loss
68    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_PACKETS}  ${REDFISH_INTERFACE}
69    Should Be Equal As Numbers  ${packet_loss}  0.0
70    ...  msg=FAILURE: BMC is dropping some packets.
71
72    # Check if Redfish bmcweb server response is functional.
73    Redfish.Login
74    Redfish.Logout
75
76
77Send Network Packets Continuously To IPMI Port
78    [Documentation]  Send network packets continuously to IPMI port and verify stability.
79    [Tags]  Send_Network_Packets_Continuously_To_IPMI_Port
80
81    # Send large number of packets to IPMI port.
82    ${packet_loss}=  Send Network Packets And Get Packet Loss
83    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_PACKETS}  ${IPMI_PORT}
84    Should Be Equal As Numbers  ${packet_loss}  0.0
85    ...  msg=FAILURE: BMC is dropping some packets.
86
87    # Check if IPMI interface is functional.
88    Run IPMI Standard Command  chassis status
89
90
91Send Network Packets Continuously To SSH Port
92    [Documentation]  Send network packets continuously to SSH port and verify stability.
93    [Tags]  Send_Network_Packets_Continuously_To_SSH_Port
94
95    # Send large number of packets to SSH port.
96    ${packet_loss}=  Send Network Packets And Get Packet Loss
97    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_PACKETS}  ${SSH_PORT}
98    Should Be Equal As Numbers  ${packet_loss}  0.0
99    ...  msg=FAILURE: BMC is dropping some packets.
100
101    # Check if SSH interface is functional.
102
103    SSHLibrary.Open Connection  ${OPENBMC_HOST}
104    Open Connection And Log In  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}
105
106
107Flood Redfish Interface With Packets With Flags And Check Stability
108    [Documentation]  Send large number of packets with flags to Redfish interface
109    ... and check stability.
110    [Tags]  Flood_Redfish_Interface_With_Packets_With_Flags_And_Check_Stability
111    [Template]  Send Network Packets With Flags And Verify Stability
112
113    # Target         No. Of packets  Interface              Flags
114
115    # Flood syn packets and check BMC behavior.
116    ${OPENBMC_HOST}  ${iterations}   ${REDFISH_INTERFACE}   ${SYN_PACKETS}
117
118    # Flood reset packets and check BMC behavior.
119    ${OPENBMC_HOST}  ${iterations}   ${REDFISH_INTERFACE}   ${RESET_PACKETS}
120
121    # Flood fin packets and check BMC behavior.
122    ${OPENBMC_HOST}  ${iterations}   ${REDFISH_INTERFACE}   ${FIN_PACKETS}
123
124    # Flood syn ack reset packets and check BMC behavior.
125    ${OPENBMC_HOST}  ${iterations}   ${REDFISH_INTERFACE}   ${SYN_ACK_RESET}
126
127    # Flood packets with all flags and check BMC behavior.
128    ${OPENBMC_HOST}  ${iterations}   ${REDFISH_INTERFACE}   ${ALL_FLAGS}
129
130
131Send Network Packets Continuously To SOL Port
132    [Documentation]  Send network packets continuously to SOL port and verify stability.
133    [Tags]  Send_Network_Packets_Continuously_To_SOL_Port
134    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND  Close all connections
135
136    # Send large number of packets to SOL port.
137    ${packet_loss}=  Send Network Packets And Get Packet Loss
138    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_PACKETS}  ${HOST_SOL_PORT}
139
140    # Check if SOL interface is functional.
141
142    SSHLibrary.Open Connection  ${OPENBMC_HOST}  port=${HOST_SOL_PORT}
143    Verify Interface Stability  ${HOST_SOL_PORT}
144    Should Be Equal As Numbers  ${packet_loss}  0.0
145    ...  msg=FAILURE: BMC is dropping some packets.
146
147
148Send Continuous TCP Connection Requests To Redfish Interface And Check Stability
149    [Documentation]  Establish large number of TCP connections to Redfish port (443)
150    ...  and check check network responses stability.
151    [Tags]  Send_Continuous_TCP_Connection_Requests_To_Redfish_Interface_And_Check_Stability
152
153    # Establish large number of TCP connections to Redfish interface.
154    ${connection_loss}=  Establish TCP Connections And Get Connection Failures
155    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_CONNECTION}  ${HTTPS_PORT}
156
157    # Check if Redfish interface is functional.
158    Redfish.Login
159    Redfish.Logout
160
161    # Check if TCP connections dropped.
162    Should Be Equal As Numbers  ${connection_loss}  0.0
163    ...  msg=FAILURE: BMC is dropping some connections.
164
165
166Send Continuous TCP Connection Requests To IPMI Interface And Check Stability
167    [Documentation]  Establish large number of TCP connections to IPMI interface
168    ...  and check stability.
169    [Tags]  Send_Continuous_TCP_Connection_Requests_To_IPMI_Interface_And_Check_Stability
170
171    # Establish large number of TCP connections to IPMI interface.
172    ${connection_loss}=  Establish TCP Connections And Get Connection Failures
173    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_CONNECTION}  ${IPMI_PORT}
174
175    # Check if IPMI interface is functional.
176    Verify IPMI Works  lan print
177
178    # Check if TCP/Network connections dropped.
179    Should Be Equal As Numbers  ${connection_loss}  0.0
180    ...  msg=FAILURE: BMC is dropping connections
181
182
183Send Continuous TCP Connection Requests To SSH Interface And Check Stability
184    [Documentation]  Establish large number of TCP connections to SSH interface
185    ...  and check stability.
186    [Tags]  Send_Continuous_TCP_Connection_Requests_To_SSH_Interface_And_Check_Stability
187
188    # Establish large number of TCP connections to SSH interface.
189    ${connection_loss}=  Establish TCP Connections And Get Connection Failures
190    ...  ${OPENBMC_HOST}  ${iterations}  ${TCP_CONNECTION}  ${SSH_PORT}
191
192    # Check if SSH interface is functional.
193    Verify Interface Stability  ${SSH_PORT}
194
195    # Check if TCP/Network connections dropped.
196    Should Be Equal As Numbers  ${connection_loss}  0.0
197    ...  msg=FAILURE: BMC is dropping connections
198
199
200*** Keywords ***
201
202Suite Setup Execution
203    [Documentation]  Validate the setup.
204
205    Valid Value  OPENBMC_HOST
206    Valid Program  program_name
207
208
209Verify Interface Stability
210    [Documentation]  Verify interface is up and active.
211    [Arguments]  ${port}
212
213    # Description of argument(s):
214    # port  Network port.
215
216    Run Keyword If  ${port} == ${REDFISH_INTERFACE}
217    ...  Redfish.Login
218    ...  ELSE IF  ${port} == ${SSH_PORT}
219    ...  Open Connection And Log In  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}
220    ...  ELSE IF  ${port} == ${IPMI_PORT}
221    ...  Run External IPMI Standard Command  lan print
222    ...  ELSE IF  ${port} == ${HOST_SOL_PORT}
223    ...  Open Connection And Log In  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}  port=${HOST_SOL_PORT}
224    ...  ELSE
225    ...  Redfish.Login
226
227Establish TCP Connections And Get Connection Failures
228    [Documentation]  Establish TCP connections and return nping connection responses.
229    [Arguments]  ${target_host}  ${num}=${count}  ${packet_type}=${TCP_CONNECTION}
230    ...          ${http_port}=${80}
231
232    # Description of argument(s):
233    # target_host  The host name or IP address of the target system.
234    # packet_type  The type of packets to be sent ("tcp", "udp", "icmp").
235    # http_port    Network port.
236    # num          Number of connections to be sent.
237
238    # This keyword expects host, port, type and number of connections to be sent
239    # and rate at which connectionss to be sent, should be given in command line.
240    # By default it sends 4 TCP connections at 1 connection/second.
241
242    ${cmd_buf}=  Set Variable  --delay ${delay} ${target_host} -c ${num} --${packet_type} -p ${http_port}
243    ${nping_result}=  Nping  ${cmd_buf}
244    RETURN   ${nping_result['percent_failed']}
245