| 15 | ) |
| 16 | |
| 17 | func Main() error { |
| 18 | var args struct { |
| 19 | Interface string `arg:"positional,required"` |
| 20 | Remote string `arg:"positional,required"` |
| 21 | Count int `default:"2"` |
| 22 | } |
| 23 | arg.MustParse(&args) |
| 24 | |
| 25 | // packetsource, err := afpacket.NewTPacket(afpacket.OptInterface(args.Interface)) |
| 26 | // if err != nil { |
| 27 | // return nil |
| 28 | // } |
| 29 | |
| 30 | iface, err := net.InterfaceByName(args.Interface) |
| 31 | if err != nil { |
| 32 | return err |
| 33 | } |
| 34 | |
| 35 | // packet.Raw means listen for raw IP packets (requires root permissions) |
| 36 | // unix.ETH_P_ALL means listen for all packets |
| 37 | conn, err := packet.Listen(iface, packet.Raw, unix.ETH_P_ALL, nil) |
| 38 | if err != nil { |
| 39 | if errors.Is(err, unix.EPERM) { |
| 40 | return fmt.Errorf("you need root permissions to read raw packets (%w)", err) |
| 41 | } |
| 42 | return fmt.Errorf("error listening for raw packet: %w", err) |
| 43 | } |
| 44 | |
| 45 | // set promiscuous mode so that we see everything |
| 46 | err = conn.SetPromiscuous(true) |
| 47 | if err != nil { |
| 48 | return fmt.Errorf("error setting raw packet connection to promiscuous mode: %w", err) |
| 49 | } |
| 50 | |
| 51 | // write a udp packet |
| 52 | udpconn, err := net.Dial("udp", args.Remote) |
| 53 | if err != nil { |
| 54 | return fmt.Errorf("error dialing %v: %w", args.Remote, err) |
| 55 | } |
| 56 | udpconn.Write([]byte("hello from udp-experiment...")) |
| 57 | |
| 58 | // read a packet |
| 59 | buf := make([]byte, iface.MTU) |
| 60 | for i := 0; i < args.Count; i++ { |
| 61 | n, srcmac, err := conn.ReadFrom(buf) |
| 62 | if err != nil { |
| 63 | return fmt.Errorf("error reading raw packet: %w", err) |
| 64 | } |
| 65 | _ = srcmac |
| 66 | |
| 67 | // decode with gopacket |
| 68 | log.Printf("read %d bytes", n) |
| 69 | packet := gopacket.NewPacket(buf[:n], layers.LayerTypeIPv4, gopacket.NoCopy) |
| 70 | log.Println(packet.Dump()) |
| 71 | } |
| 72 | |
| 73 | return nil |
| 74 | } |