neigh_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package netlink
  2. import (
  3. "net"
  4. "testing"
  5. )
  6. type arpEntry struct {
  7. ip net.IP
  8. mac net.HardwareAddr
  9. }
  10. func parseMAC(s string) net.HardwareAddr {
  11. m, err := net.ParseMAC(s)
  12. if err != nil {
  13. panic(err)
  14. }
  15. return m
  16. }
  17. func dumpContains(dump []Neigh, e arpEntry) bool {
  18. for _, n := range dump {
  19. if n.IP.Equal(e.ip) && (n.State&NUD_INCOMPLETE) == 0 {
  20. return true
  21. }
  22. }
  23. return false
  24. }
  25. func TestNeighAddDel(t *testing.T) {
  26. tearDown := setUpNetlinkTest(t)
  27. defer tearDown()
  28. dummy := Dummy{LinkAttrs{Name: "neigh0"}}
  29. if err := LinkAdd(&dummy); err != nil {
  30. t.Fatal(err)
  31. }
  32. ensureIndex(dummy.Attrs())
  33. arpTable := []arpEntry{
  34. {net.ParseIP("10.99.0.1"), parseMAC("aa:bb:cc:dd:00:01")},
  35. {net.ParseIP("10.99.0.2"), parseMAC("aa:bb:cc:dd:00:02")},
  36. {net.ParseIP("10.99.0.3"), parseMAC("aa:bb:cc:dd:00:03")},
  37. {net.ParseIP("10.99.0.4"), parseMAC("aa:bb:cc:dd:00:04")},
  38. {net.ParseIP("10.99.0.5"), parseMAC("aa:bb:cc:dd:00:05")},
  39. }
  40. // Add the arpTable
  41. for _, entry := range arpTable {
  42. err := NeighAdd(&Neigh{
  43. LinkIndex: dummy.Index,
  44. State: NUD_REACHABLE,
  45. IP: entry.ip,
  46. HardwareAddr: entry.mac,
  47. })
  48. if err != nil {
  49. t.Errorf("Failed to NeighAdd: %v", err)
  50. }
  51. }
  52. // Dump and see that all added entries are there
  53. dump, err := NeighList(dummy.Index, 0)
  54. if err != nil {
  55. t.Errorf("Failed to NeighList: %v", err)
  56. }
  57. for _, entry := range arpTable {
  58. if !dumpContains(dump, entry) {
  59. t.Errorf("Dump does not contain: %v", entry)
  60. }
  61. }
  62. // Delete the arpTable
  63. for _, entry := range arpTable {
  64. err := NeighDel(&Neigh{
  65. LinkIndex: dummy.Index,
  66. IP: entry.ip,
  67. HardwareAddr: entry.mac,
  68. })
  69. if err != nil {
  70. t.Errorf("Failed to NeighDel: %v", err)
  71. }
  72. }
  73. // TODO: seems not working because of cache
  74. //// Dump and see that none of deleted entries are there
  75. //dump, err = NeighList(dummy.Index, 0)
  76. //if err != nil {
  77. //t.Errorf("Failed to NeighList: %v", err)
  78. //}
  79. //for _, entry := range arpTable {
  80. //if dumpContains(dump, entry) {
  81. //t.Errorf("Dump contains: %v", entry)
  82. //}
  83. //}
  84. if err := LinkDel(&dummy); err != nil {
  85. t.Fatal(err)
  86. }
  87. }