func readLoop(c *ipv4.PacketConn) { log.Printf("readLoop: reading") buf := make([]byte, 10000) for { n, cm, _, err1 := c.ReadFrom(buf) if err1 != nil { log.Printf("readLoop: ReadFrom: error %v", err1) break } var name string ifi, err2 := net.InterfaceByIndex(cm.IfIndex) if err2 != nil { log.Printf("readLoop: unable to solve ifIndex=%d: error: %v", cm.IfIndex, err2) } if ifi == nil { name = "ifname?" } else { name = ifi.Name } log.Printf("readLoop: recv %d bytes from %s to %s on %s", n, cm.Src, cm.Dst, name) } log.Printf("readLoop: exiting") }
func udpReader(c *ipv4.PacketConn, ifname, hostPort string) { log.Printf("udpReader: reading multicast") defer c.Close() buf := make([]byte, 10000) for { n, cm, _, err1 := c.ReadFrom(buf) if err1 != nil { log.Printf("udpReader: ReadFrom: error %v", err1) break } ifi, err2 := net.InterfaceByIndex(cm.IfIndex) if err2 != nil { log.Printf("udpReader: could not solve ifindex=%d: %v", cm.IfIndex, err2) } ifname := "ifname?" if ifi != nil { ifname = ifi.Name } log.Printf("udpReader: recv %d bytes from %s to %s on %s (ifindex=%d)", n, cm.Src, cm.Dst, ifname, cm.IfIndex) } log.Printf("udpReader: exiting") }
func udpReader(c *ipv4.PacketConn, input chan<- *udpInfo, ifname string, readerDone chan<- int, listenPort int) { log.Printf("udpReader: reading from '%s'", ifname) defer c.Close() buf := make([]byte, 10000) LOOP: for { n, cm, srcAddr, err1 := c.ReadFrom(buf) if err1 != nil { log.Printf("udpReader: ReadFrom: error %v", err1) break LOOP } var udpSrc *net.UDPAddr switch srcAddr.(type) { case *net.UDPAddr: udpSrc = srcAddr.(*net.UDPAddr) } var name string var ifi *net.Interface var err2 error if cm != nil { ifi, err2 = net.InterfaceByIndex(cm.IfIndex) if err2 != nil { log.Printf("udpReader: unable to solve ifIndex=%d: error: %v", cm.IfIndex, err2) } } if ifi == nil { name = "ifname?" } else { name = ifi.Name } udpDst := net.UDPAddr{IP: cm.Dst, Port: listenPort} //log.Printf("udpReader: recv %d bytes from %v to %v on %s ifIndex=%d", n, udpSrc, &udpDst, name, cm.IfIndex) // make a copy because we will overwrite buf b := make([]byte, n) copy(b, buf) // deliver udp packet to main rip goroutine input <- &udpInfo{info: b, src: *udpSrc, dst: udpDst, ifIndex: cm.IfIndex, ifName: name} } log.Printf("udpReader: exiting '%s' -- trying", ifname) readerDone <- 1 // tell rip router goroutine log.Printf("udpReader: exiting '%s'", ifname) }
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 n, err := p.WriteTo(wb, &cm, dst); err != nil { b.Fatal(err) } else if n != len(wb) { b.Fatalf("got %v; want %v", n, len(wb)) } if _, _, _, err := p.ReadFrom(rb); err != nil { b.Fatal(err) } }