func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { cm := ipv4.ControlMessage{TTL: 1} if ifi != nil { cm.IfIndex = ifi.Index } if _, err := p.WriteTo(wb, &cm, dst); err != nil { b.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err) } if _, _, _, err := p.ReadFrom(rb); err != nil { b.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err) } }
// writeThenReadPayload transmits IPv4 datagram payloads to the // loopback address or interface and captures the loopback'd datagram // payloads. func writeThenReadPayload(t *testing.T, i int, c *ipv4.PacketConn, wb []byte, dst net.Addr) []byte { rb := make([]byte, 1500) c.SetTOS(i + 1) var ip net.IP switch v := dst.(type) { case *net.UDPAddr: ip = v.IP case *net.IPAddr: ip = v.IP } if ip.IsMulticast() { c.SetMulticastTTL(i + 1) } else { c.SetTTL(i + 1) } c.SetDeadline(time.Now().Add(100 * time.Millisecond)) if _, err := c.WriteTo(wb, nil, dst); err != nil { t.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err) } n, cm, _, err := c.ReadFrom(rb) if err != nil { t.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err) } t.Logf("rcvd cmsg: %v", cm) return rb[:n] }
// runPayloadTransponder transmits IPv4 datagram payloads to the // loopback address or interface and captures the loopback'd datagram // payloads. func runPayloadTransponder(t *testing.T, c *ipv4.PacketConn, wb []byte, dst net.Addr) { cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface rb := make([]byte, 1500) for i, toggle := range []bool{true, false, true} { if err := c.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } c.SetTOS(i + 1) var ip net.IP switch v := dst.(type) { case *net.UDPAddr: ip = v.IP case *net.IPAddr: ip = v.IP } if ip.IsMulticast() { c.SetMulticastTTL(i + 1) } else { c.SetTTL(i + 1) } c.SetDeadline(time.Now().Add(100 * time.Millisecond)) if _, err := c.Write(wb, nil, dst); err != nil { t.Fatalf("ipv4.PacketConn.Write failed: %v", err) } _, cm, _, err := c.Read(rb) if err != nil { t.Fatalf("ipv4.PacketConn.Read failed: %v", err) } t.Logf("rcvd cmsg: %v", cm) } }