diff --git a/ansible/roles/test/files/helpers/pfc_gen.py b/ansible/roles/test/files/helpers/pfc_gen.py index 5e146b9e25a..f1d53c650f3 100755 --- a/ansible/roles/test/files/helpers/pfc_gen.py +++ b/ansible/roles/test/files/helpers/pfc_gen.py @@ -18,32 +18,33 @@ def checksum(msg): s = 0 - + # loop taking 2 characters at a time for i in range(0, len(msg), 2): w = ord(msg[i]) + (ord(msg[i+1]) << 8 ) s = s + w - + s = (s>>16) + (s & 0xffff); s = s + (s >> 16); - + #complement and mask to 4 byte short s = ~s & 0xffff - + return s def main(): usage = "usage: %prog [options] arg1 arg2" parser = optparse.OptionParser(usage=usage) parser.add_option("-i", "--interface", type="string", dest="interface", help="Interface list to send packets, seperated by ','",metavar="Interface") - parser.add_option('-p', "--priority", type="int", dest="priority", help="PFC class enable bitmap.", metavar="Priority") - parser.add_option("-t", "--time", type="int", dest="time", help="Pause time in quanta for enabled class",metavar="time") + parser.add_option('-p', "--priority", type="int", dest="priority", help="PFC class enable bitmap.", metavar="Priority", default=-1) + parser.add_option("-t", "--time", type="int", dest="time", help="Pause time in quanta for global pause or enabled class",metavar="time") parser.add_option("-n", "--num", type="int", dest="num", help="Number of packets to be sent",metavar="number",default=1) parser.add_option("-r", "--rsyslog-server", type="string", dest="rsyslog_server", default="127.0.0.1", help="Rsyslog server IPv4 address",metavar="IPAddress") + parser.add_option('-g', "--global", action="store_true", dest="global_pf", help="Send global pause frames (not PFC)", default=False) (options, args) = parser.parse_args() if options.interface is None: - print "Need to specify the interface to send PFC packets." + print "Need to specify the interface to send PFC/global pause frame packets." parser.print_help() sys.exit(1) @@ -52,7 +53,14 @@ def main(): parser.print_help() sys.exit(1) - if options.priority > 255 or options.time < 0: + if options.global_pf: + # Send global pause frames + # -p option should not be set + if options.priority != -1: + print "'-p' option is not valid when sending global pause frames ('--global' / '-g')" + parser.print_help() + sys.exit(1) + elif options.priority > 255 or options.priority < 0: print "Enable class bitmap is not valid. Need to be in range 0-255." parser.print_help() sys.exit(1) @@ -98,29 +106,53 @@ def main(): Time Class 7 | 0x0000 | ------------------------- """ + """ + Set pause frame defined fields and generate the packet + + The Ethernet Frame format for pause frames is the following: + + Destination MAC | 01:80:C2:00:00:01 | + ------------------------- + Source MAC | Station MAC | + ------------------------- + Ethertype | 0x8808 | + ------------------------- + OpCode | 0x0001 | + ------------------------- + pause time | 0x0000 | + ------------------------- + """ src_addr = "\x01\x02\x03\x04\x05\x06" dst_addr = "\x01\x80\xc2\x00\x00\x01" - opcode = "\x01\x01" + if options.global_pf: + opcode = "\x00\x01" + else: + opcode = "\x01\x01" ethertype = "\x88\x08" - - class_enable = options.priority - class_enable_field = binascii.unhexlify(format(class_enable, '04x')) - - packet = dst_addr + src_addr + ethertype + opcode + class_enable_field - for p in range(0,7): - if (class_enable & (1< 0: for s in sockets: - s.send(packetsend) + s.send(packet) iteration -= 1 - my_logger.debug('PFC_STORM_END') - + my_logger.debug(pre_str + '_STORM_END') + if __name__ == "__main__": main()