ipv4_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package water
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. "github.com/songgao/water/waterutil"
  7. )
  8. const BUFFERSIZE = 1522
  9. func startRead(t *testing.T, ifce *Interface) (dataChan <-chan []byte, errChan <-chan error) {
  10. dataCh := make(chan []byte)
  11. errCh := make(chan error)
  12. go func() {
  13. for {
  14. buffer := make([]byte, BUFFERSIZE)
  15. n, err := ifce.Read(buffer)
  16. if err != nil {
  17. errCh <- err
  18. } else {
  19. buffer = buffer[:n:n]
  20. dataCh <- buffer
  21. }
  22. }
  23. }()
  24. return dataCh, errCh
  25. }
  26. func waitForPingOrBust(t *testing.T,
  27. isTAP bool,
  28. expectBroadcast bool,
  29. expectSrc net.IP,
  30. expectDest net.IP,
  31. dataCh <-chan []byte, errCh <-chan error) {
  32. waitForPintTimeout := time.NewTimer(8 * time.Second).C
  33. readFrame:
  34. for {
  35. select {
  36. case buffer := <-dataCh:
  37. var packet []byte
  38. if isTAP {
  39. ethertype := waterutil.MACEthertype(buffer)
  40. if ethertype != waterutil.IPv4 {
  41. continue readFrame
  42. }
  43. if expectBroadcast && !waterutil.IsBroadcast(waterutil.MACDestination(buffer)) {
  44. continue readFrame
  45. }
  46. packet = waterutil.MACPayload(buffer)
  47. } else {
  48. packet = buffer
  49. }
  50. if !waterutil.IsIPv4(packet) {
  51. continue readFrame
  52. }
  53. if !waterutil.IPv4Source(packet).Equal(expectSrc) {
  54. continue readFrame
  55. }
  56. if !waterutil.IPv4Destination(packet).Equal(expectDest) {
  57. continue readFrame
  58. }
  59. if waterutil.IPv4Protocol(packet) != waterutil.ICMP {
  60. continue readFrame
  61. }
  62. t.Logf("received broadcast frame: %#v\n", buffer)
  63. break readFrame
  64. case err := <-errCh:
  65. t.Fatalf("read error: %v", err)
  66. case <-waitForPintTimeout:
  67. t.Fatal("Waiting for broadcast packet timeout")
  68. }
  69. }
  70. }