/projects/reference_router/test/hw_lut_forward/run.py

https://github.com/Caustic/netfpga
Python | 159 lines | 127 code | 31 blank | 1 comment | 21 complexity | 62235c94b4236e3286e135225d7e3b89 MD5 | raw file
  1. #!/bin/env python
  2. from NFTest import *
  3. from NFTest.hwPktLib import *
  4. from NFTest.hwRegLib import *
  5. from RegressRouterLib import *
  6. import time
  7. phy4loop0 = ('../connections/4phy', [])
  8. nftest_init(sim_loop = [], hw_config = [phy4loop0])
  9. nftest_start()
  10. NUM_PKTS_PER_PORT = 500
  11. PKT_SIZE = 1514
  12. nftest_regwrite(reg_defines.OQ_QUEUE_0_CTRL_REG(), 0x0)
  13. nftest_regwrite(reg_defines.OQ_QUEUE_2_CTRL_REG(), 0x0)
  14. nftest_regwrite(reg_defines.OQ_QUEUE_4_CTRL_REG(), 0x0)
  15. nftest_regwrite(reg_defines.OQ_QUEUE_6_CTRL_REG(), 0x0)
  16. routerMAC = ["00:ca:fe:00:00:01", "00:ca:fe:00:00:02", "00:ca:fe:00:00:03", "00:ca:fe:00:00:04"]
  17. routerIP = ["192.168.0.40", "192.168.1.40", "192.168.2.40", "192.168.3.40"]
  18. total_errors = 0
  19. nwords_before_0 = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_WORDS_LEFT_REG())
  20. nwords_before_2 = regread('nf2c0', reg_defines.OQ_QUEUE_2_NUM_WORDS_LEFT_REG())
  21. nwords_before_4 = regread('nf2c0', reg_defines.OQ_QUEUE_4_NUM_WORDS_LEFT_REG())
  22. nwords_before_6 = regread('nf2c0', reg_defines.OQ_QUEUE_6_NUM_WORDS_LEFT_REG())
  23. pkts = []
  24. for i in range(4):
  25. portPkts = []
  26. for i in range(NUM_PKTS_PER_PORT):
  27. portPkts.append(scapy.Raw(generate_load(PKT_SIZE)))
  28. pkts.append(portPkts)
  29. for i in range(4):
  30. for pkt in pkts[i]:
  31. nftest_send_dma('nf2c%d'%i, pkt)
  32. time.sleep(4)
  33. for i in range(4):
  34. pktsStored = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_STORED_REG() + i * 0x400)
  35. pktsDropped = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_DROPPED_REG() + i * 0x400)
  36. pktsRemoved = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_REMOVED_REG() + i * 0x400)
  37. bytesStored = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKT_BYTES_STORED_REG() + i * 0x400)
  38. bytesRemoved = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKT_BYTES_REMOVED_REG() + i * 0x400)
  39. if pktsStored + pktsDropped != NUM_PKTS_PER_PORT:
  40. print "Error: packets stored plus dropped not equal to number sent";
  41. print "Packets Stored: " + str(pktsStored) + " Dropped: " + str(pktsDropped) + " Total: " + str(pktsStored + pktsDropped)
  42. print "Expected: " + str(NUM_PKTS_PER_PORT)
  43. total_errors += 1
  44. if pktsRemoved != 0:
  45. print "Error: packets removed should be zero"
  46. print "Removed: " + str(pktsRemoved)
  47. total_errors += 1
  48. if pktsStored * PKT_SIZE != bytesStored:
  49. print "Error: bytes stored not equal to number expected"
  50. print "Bytes Stored: " + str(bytesStored) + " Expected: " + str(pktsStored * PKTSIZE)
  51. total_errors += 1
  52. header_bytes_re = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_OVERHEAD_BYTES_REMOVED_REG())
  53. header_bytes = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_OVERHEAD_BYTES_STORED_REG())
  54. num_packets = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_STORED_REG())
  55. header = num_packets * 8
  56. if header_bytes != header:
  57. total_errors += 1
  58. print "queue 0 -> header stored: " + str(header_bytes) + " header removed: " + str(header_bytes_re)
  59. header_bytes_re = regread('nf2c0', reg_defines.OQ_QUEUE_2_NUM_OVERHEAD_BYTES_REMOVED_REG())
  60. header_bytes = regread('nf2c0', reg_defines.OQ_QUEUE_2_NUM_OVERHEAD_BYTES_STORED_REG())
  61. num_packets = regread('nf2c0', reg_defines.OQ_QUEUE_2_NUM_PKTS_STORED_REG())
  62. header = num_packets * 8
  63. if header_bytes != header:
  64. total_errors += 1
  65. print "queue 2 -> header stored: " + str(header_bytes) + " header removed: " + str(header_bytes_re)
  66. header_bytes_re = regread('nf2c0', reg_defines.OQ_QUEUE_4_NUM_OVERHEAD_BYTES_REMOVED_REG())
  67. header_bytes = regread('nf2c0', reg_defines.OQ_QUEUE_4_NUM_OVERHEAD_BYTES_STORED_REG())
  68. num_packets = regread('nf2c0', reg_defines.OQ_QUEUE_4_NUM_PKTS_STORED_REG())
  69. header = num_packets * 8
  70. if header_bytes != header:
  71. total_errors += 1
  72. print "queue 4 -> header stored: " + str(header_bytes) + " header removed: " + str(header_bytes_re)
  73. header_bytes_re = regread('nf2c0', reg_defines.OQ_QUEUE_6_NUM_OVERHEAD_BYTES_REMOVED_REG())
  74. header_bytes = regread('nf2c0', reg_defines.OQ_QUEUE_6_NUM_OVERHEAD_BYTES_STORED_REG())
  75. num_packets = regread('nf2c0', reg_defines.OQ_QUEUE_6_NUM_PKTS_STORED_REG())
  76. header = num_packets * 8
  77. if header_bytes != header:
  78. total_errors += 1
  79. print "queue 6 -> header stored: " + str(header_bytes) + " header removed: " + str(header_bytes_re)
  80. address_hi = regread('nf2c0', reg_defines.OQ_QUEUE_0_ADDR_HI_REG())
  81. address_lo = regread('nf2c0', reg_defines.OQ_QUEUE_0_ADDR_LO_REG())
  82. print "address queue 0: %x%x"%(address_hi, address_lo)
  83. address_hi = regread('nf2c0', reg_defines.OQ_QUEUE_2_ADDR_HI_REG())
  84. address_lo = regread('nf2c0', reg_defines.OQ_QUEUE_2_ADDR_LO_REG())
  85. print "address queue 2: %x%x"%(address_hi, address_lo)
  86. address_hi = regread('nf2c0', reg_defines.OQ_QUEUE_4_ADDR_HI_REG())
  87. address_lo = regread('nf2c0', reg_defines.OQ_QUEUE_4_ADDR_LO_REG())
  88. print "address queue 4: %x%x"%(address_hi, address_lo)
  89. address_hi = regread('nf2c0', reg_defines.OQ_QUEUE_6_ADDR_HI_REG())
  90. address_lo = regread('nf2c0', reg_defines.OQ_QUEUE_6_ADDR_LO_REG())
  91. print "address queue 6: %x%x"%(address_hi, address_lo)
  92. print "Enabling output queues and verifying that queued packets are sent..."
  93. nftest_regwrite(reg_defines.OQ_QUEUE_0_CTRL_REG(), 1 << reg_defines.OQ_ENABLE_SEND_BIT_NUM())
  94. nftest_regwrite(reg_defines.OQ_QUEUE_2_CTRL_REG(), 1 << reg_defines.OQ_ENABLE_SEND_BIT_NUM())
  95. nftest_regwrite(reg_defines.OQ_QUEUE_4_CTRL_REG(), 1 << reg_defines.OQ_ENABLE_SEND_BIT_NUM())
  96. nftest_regwrite(reg_defines.OQ_QUEUE_6_CTRL_REG(), 1 << reg_defines.OQ_ENABLE_SEND_BIT_NUM())
  97. time.sleep(4)
  98. for i in range(2):
  99. for pkt in pkts[i]:
  100. nftest_expect_phy("nf2c%d"%i, pkt)
  101. restart() # resets packet lists so missing dropped packets are ignored
  102. nwords_after_0 = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_WORDS_LEFT_REG())
  103. nwords_after_2 = regread('nf2c0', reg_defines.OQ_QUEUE_2_NUM_WORDS_LEFT_REG())
  104. nwords_after_4 = regread('nf2c0', reg_defines.OQ_QUEUE_4_NUM_WORDS_LEFT_REG())
  105. nwords_after_6 = regread('nf2c0', reg_defines.OQ_QUEUE_6_NUM_WORDS_LEFT_REG())
  106. if nwords_before_0 != nwords_after_0:
  107. total_errors += 1
  108. if nwords_before_2 != nwords_after_2:
  109. total_errors += 1
  110. if nwords_before_4 != nwords_after_4:
  111. total_errors += 1
  112. if nwords_before_6 != nwords_after_6:
  113. total_errors += 1
  114. for i in range(4):
  115. pktsStored = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_STORED_REG() + i * 0x400)
  116. pktsDropped = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_DROPPED_REG() + i * 0x400)
  117. pktsRemoved = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKTS_REMOVED_REG() + i * 0x400)
  118. bytesStored = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKT_BYTES_STORED_REG() + i * 0x400)
  119. bytesRemoved = regread('nf2c0', reg_defines.OQ_QUEUE_0_NUM_PKT_BYTES_REMOVED_REG() + i * 0x400)
  120. if pktsStored != pktsRemoved:
  121. print "Error: packets stored not equal to packets removed"
  122. print "Packets Stored: " + str(pktsStored) + " Removed: " + str(pktsRemoved)
  123. total_errors += 1
  124. if bytesStored != bytesRemoved:
  125. print "Error: bytes stored not equal to bytes removed"
  126. print "Bytes Stored: " + str(bytesStored) + " Removed: " + str(bytesRemoved)
  127. total_errors += 1
  128. nftest_finish(total_errors = total_errors)