@@ -7,6 +7,7 @@ package generator
7
7
import (
8
8
"fmt"
9
9
"math/rand"
10
+ "os"
10
11
"unsafe"
11
12
12
13
"github.com/intel-go/nff-go/packet"
@@ -229,6 +230,77 @@ func generateICMPIPv4(pkt *packet.Packet, config *PacketConfig, rnd *rand.Rand)
229
230
pktICMP .Cksum = packet .SwapBytesUint16 (packet .CalculateIPv4ICMPChecksum (pktIP , pktICMP , pkt .Data ))
230
231
}
231
232
233
+ func generatePcap (pkt * packet.Packet , config * PacketConfig , _ * rand.Rand ) {
234
+ if pkt == nil {
235
+ panic ("Failed to create new packet" )
236
+ }
237
+ pcapConfig := & config .Pcap
238
+ if pcapConfig .FileReader == nil {
239
+ f , err := os .Open (pcapConfig .Path )
240
+ if err != nil {
241
+ panic (fmt .Sprintf ("Failed to open pcap file %s" , pcapConfig .Path ))
242
+ }
243
+ pcapConfig .FileReader = f
244
+ var glHdr packet.PcapGlobHdr
245
+ if err := packet .ReadPcapGlobalHdr (f , & glHdr ); err != nil {
246
+ f .Close ()
247
+ panic (fmt .Sprintf ("Failed to read pcap file header, returned %v" , err ))
248
+ }
249
+ }
250
+ isEOF , err := pkt .ReadPcapOnePacket (pcapConfig .FileReader )
251
+ if err != nil {
252
+ panic ("Failed to read one packet from pcap" )
253
+ }
254
+ if isEOF {
255
+ if _ , err := pcapConfig .FileReader .Seek (packet .PcapGlobHdrSize , 0 ); err != nil {
256
+ panic ("Failed to parse pcap file header" )
257
+ }
258
+ if _ , err := pkt .ReadPcapOnePacket (pcapConfig .FileReader ); err != nil {
259
+ panic ("Failed to read one packet from pcap" )
260
+ }
261
+ }
262
+ }
263
+
264
+ func generatePcapInMemory (pkt * packet.Packet , config * PacketConfig , _ * rand.Rand ) {
265
+ if pkt == nil {
266
+ panic ("Failed to create new packet" )
267
+ }
268
+ pcapConfig := & config .Pcap
269
+ if ! pcapConfig .ReachedEOF {
270
+ if pcapConfig .FileReader == nil {
271
+ f , err := os .Open (pcapConfig .Path )
272
+ if err != nil {
273
+ panic (fmt .Sprintf ("Failed to open pcap file %s" , pcapConfig .Path ))
274
+ }
275
+ pcapConfig .FileReader = f
276
+ var glHdr packet.PcapGlobHdr
277
+ if err := packet .ReadPcapGlobalHdr (f , & glHdr ); err != nil {
278
+ f .Close ()
279
+ panic (fmt .Sprintf ("Failed to read pcap file header, returned %v" , err ))
280
+ }
281
+ }
282
+ isEOF , err := pkt .ReadPcapOnePacket (pcapConfig .FileReader )
283
+ if err != nil {
284
+ panic ("Failed to read one packet from pcap" )
285
+ }
286
+ if isEOF {
287
+ pcapConfig .FileReader .Close ()
288
+ pcapConfig .ReachedEOF = true
289
+ } else {
290
+ data := pkt .GetRawPacketBytes ()
291
+ pcapConfig .Packets = append (pcapConfig .Packets , data )
292
+ }
293
+ }
294
+ if pcapConfig .ReachedEOF {
295
+ bytes := pcapConfig .Packets [pcapConfig .NextPacket ]
296
+ pcapConfig .NextPacket = (pcapConfig .NextPacket + 1 ) % len (pcapConfig .Packets )
297
+ ok := packet .GeneratePacketFromByte (pkt , bytes )
298
+ if ! ok {
299
+ panic ("Failed to generate packet from byte" )
300
+ }
301
+ }
302
+ }
303
+
232
304
func FillTCPHdr (pkt * packet.Packet , l4 * TCPConfig , rnd * rand.Rand ) {
233
305
emptyPacketTCP := (* packet .TCPHdr )(pkt .L4 )
234
306
emptyPacketTCP .SrcPort = packet .SwapBytesUint16 (uint16 (l4 .SPort .Current ))
0 commit comments