1 // jumbo-frames is simple example how to send larger and larger jumbo packets with libmemif adapter. This is simple copy
2 // of raw-data but with sending larger packets, so for more information read its code and docs.
12 "go.fd.io/govpp/extras/libmemif"
16 Socket = "/tmp/jumbo-frames-example"
23 var stopCh chan struct{}
25 func OnConnect(memif *libmemif.Memif) (err error) {
26 details, err := memif.GetDetails()
28 fmt.Printf("libmemif.GetDetails() error: %v\n", err)
30 fmt.Printf("memif %s has been connected: %+v\n", memif.IfName, details)
32 stopCh = make(chan struct{})
34 for i = 0; i < uint8(len(details.RxQueues)); i++ {
36 go ReadAndPrintPackets(memif, i)
38 for i = 0; i < uint8(len(details.TxQueues)); i++ {
40 go SendPackets(memif, i)
45 func OnDisconnect(memif *libmemif.Memif) (err error) {
46 fmt.Printf("memif %s has been disconnected\n", memif.IfName)
52 func ReadAndPrintPackets(memif *libmemif.Memif, queueID uint8) {
55 interruptCh, err := memif.GetQueueInterruptChan(queueID)
58 case libmemif.ErrQueueID:
59 fmt.Printf("libmemif.Memif.GetQueueInterruptChan() complains about invalid queue id!?")
61 fmt.Printf("libmemif.Memif.GetQueueInterruptChan() error: %v\n", err)
72 packets, err := memif.RxBurst(queueID, 10)
74 fmt.Printf("libmemif.Memif.RxBurst() error: %v\n", err)
76 if len(packets) == 0 {
79 for _, packet := range packets {
80 fmt.Printf("Received packet queue=%d: %v in burst %d\n", queueID, len(packet), counter)
90 func SendPackets(memif *libmemif.Memif, queueID uint8) {
96 case <-time.After(3 * time.Second):
98 packetMul := counter % 100 + 1 // Limit max iterations to 100 to not go out of bounds
99 packets := []libmemif.RawPacketData{
100 make([]byte, 128*packetMul),
101 make([]byte, 256*packetMul),
102 make([]byte, 512*packetMul),
106 count, err := memif.TxBurst(queueID, packets[sent:])
108 fmt.Printf("libmemif.Memif.TxBurst() error: %v\n", err)
111 fmt.Printf("libmemif.Memif.TxBurst() has sent %d packets in burst %v.\n", count, counter)
113 if sent == len(packets) {
127 if len(os.Args) > 1 && (os.Args[1] == "--slave" || os.Args[1] == "-slave") {
132 appName := "jumbo-frames" + appSuffix
133 fmt.Println("Initializing libmemif as ", appName)
134 err := libmemif.Init(appName)
136 fmt.Printf("libmemif.Init() error: %v\n", err)
139 defer libmemif.Cleanup()
141 memifCallbacks := &libmemif.MemifCallbacks{
142 OnConnect: OnConnect,
143 OnDisconnect: OnDisconnect,
146 memifConfig := &libmemif.MemifConfig{
147 MemifMeta: libmemif.MemifMeta{
149 ConnID: ConnectionID,
150 SocketFilename: Socket,
153 Mode: libmemif.IfModeEthernet,
155 MemifShmSpecs: libmemif.MemifShmSpecs{
156 NumRxQueues: NumQueues,
157 NumTxQueues: NumQueues,
163 fmt.Printf("Callbacks: %+v\n", memifCallbacks)
164 fmt.Printf("Config: %+v\n", memifConfig)
166 memif, err := libmemif.CreateInterface(memifConfig, memifCallbacks)
168 fmt.Printf("libmemif.CreateInterface() error: %v\n", err)
173 sigChan := make(chan os.Signal, 1)
174 signal.Notify(sigChan, os.Interrupt)