injector

package
v0.28.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 17, 2021 License: Apache-2.0 Imports: 9 Imported by: 4

Documentation

Index

Constants

This section is empty.

Variables

View Source
var InjectPacketCmd = &cobra.Command{
	Use:          "inject-packet",
	Short:        "inject packet",
	Long:         "inject packet",
	SilenceUsage: false,
	Run: func(cmd *cobra.Command, args []string) {
		pir, err := client.GetPacketInjectRequest()
		if err != nil {
			fmt.Fprintf(os.Stderr, "%s\n", err)
			cmd.Usage()
			os.Exit(1)
		}

		if ifName == "" {
			if ifName = getNameFromMac(pir.SrcMAC); ifName == "" {
				fmt.Fprintf(os.Stderr, "Could not find interface with MAC %s", pir.SrcMAC)
				os.Exit(1)
			}
		}

		rawSocket, err := rawsocket.NewRawSocket(ifName, rawsocket.OnlyIPPackets)
		if err != nil {
			fmt.Fprintf(os.Stderr, "Failed to open socket for interface %s, err: %s\n", ifName, err)
			os.Exit(1)
		}
		defer rawSocket.Close()

		var packetForger pi.PacketForger
		if len(pir.Pcap) > 0 {
			packetForger, err = pi.NewPcapPacketGenerator(pir)
		} else {
			packetForger, err = pi.NewForgedPacketGenerator(pir, encapType)
		}
		if err != nil {
			fmt.Fprintf(os.Stderr, "Failed to create packet generator for interface %s, err: %s\n", ifName, err)
			os.Exit(1)
		}
		defer packetForger.Close()

		lastPacketCount := 0
		showPacketCount := func() {
			if lastPacketCount != 0 {
				fmt.Fprintf(os.Stderr, "%d packet(s) injected on interface %s\n", lastPacketCount, ifName)
			}
			lastPacketCount = 0
		}

		debouncer := debouncer.New(time.Second, showPacketCount)
		debouncer.Start()
		defer debouncer.Stop()

		packetCount := 0
		for packet := range packetForger.PacketSource() {
			if packet == nil {
				break
			}

			if _, err := rawSocket.Write(packet.Data()); err != nil {
				fmt.Fprintf(os.Stderr, "Write error on interface %s: %s\n", ifName, err)
				os.Exit(1)
			}

			packetCount++
			lastPacketCount++
			debouncer.Call()
		}

		showPacketCount()

		fmt.Fprintf(os.Stderr, "%d packet(s) injected successfully\n", packetCount)
	},
}

InjectPacketCmd injects packets without using any Skydive analyzer/agent

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL