monitor_linux_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package monitor
  4. import (
  5. "net"
  6. "net/netip"
  7. "testing"
  8. "github.com/jsimonetti/rtnetlink"
  9. "github.com/mdlayher/netlink"
  10. "golang.org/x/sys/unix"
  11. )
  12. func newAddrMsg(iface uint32, addr string, typ netlink.HeaderType) netlink.Message {
  13. ip := net.ParseIP(addr)
  14. if ip == nil {
  15. panic("newAddrMsg: invalid addr: " + addr)
  16. }
  17. addrMsg := rtnetlink.AddressMessage{
  18. Index: iface,
  19. Attributes: &rtnetlink.AddressAttributes{
  20. Address: ip,
  21. },
  22. }
  23. b, err := addrMsg.MarshalBinary()
  24. if err != nil {
  25. panic(err)
  26. }
  27. return netlink.Message{
  28. Header: netlink.Header{Type: typ},
  29. Data: b,
  30. }
  31. }
  32. // See issue #4282 and nlConn.addrCache.
  33. func TestIgnoreDuplicateNEWADDR(t *testing.T) {
  34. mustReceive := func(c *nlConn) message {
  35. msg, err := c.Receive()
  36. if err != nil {
  37. t.Fatalf("mustReceive: unwanted error: %s", err)
  38. }
  39. return msg
  40. }
  41. t.Run("suppress duplicate NEWADDRs", func(t *testing.T) {
  42. c := nlConn{
  43. buffered: []netlink.Message{
  44. newAddrMsg(1, "192.168.0.5", unix.RTM_NEWADDR),
  45. newAddrMsg(1, "192.168.0.5", unix.RTM_NEWADDR),
  46. },
  47. addrCache: make(map[uint32]map[netip.Addr]bool),
  48. }
  49. msg := mustReceive(&c)
  50. if _, ok := msg.(*newAddrMessage); !ok {
  51. t.Fatalf("want newAddrMessage, got %T %v", msg, msg)
  52. }
  53. msg = mustReceive(&c)
  54. if _, ok := msg.(ignoreMessage); !ok {
  55. t.Fatalf("want ignoreMessage, got %T %v", msg, msg)
  56. }
  57. })
  58. t.Run("do not suppress after DELADDR", func(t *testing.T) {
  59. c := nlConn{
  60. buffered: []netlink.Message{
  61. newAddrMsg(1, "192.168.0.5", unix.RTM_NEWADDR),
  62. newAddrMsg(1, "192.168.0.5", unix.RTM_DELADDR),
  63. newAddrMsg(1, "192.168.0.5", unix.RTM_NEWADDR),
  64. },
  65. addrCache: make(map[uint32]map[netip.Addr]bool),
  66. }
  67. msg := mustReceive(&c)
  68. if _, ok := msg.(*newAddrMessage); !ok {
  69. t.Fatalf("want newAddrMessage, got %T %v", msg, msg)
  70. }
  71. msg = mustReceive(&c)
  72. if m, ok := msg.(*newAddrMessage); !ok {
  73. t.Fatalf("want newAddrMessage, got %T %v", msg, msg)
  74. } else {
  75. if !m.Delete {
  76. t.Fatalf("want delete, got %#v", m)
  77. }
  78. }
  79. msg = mustReceive(&c)
  80. if _, ok := msg.(*newAddrMessage); !ok {
  81. t.Fatalf("want newAddrMessage, got %T %v", msg, msg)
  82. }
  83. })
  84. }