title: How to generate packet having sequence number as `first:last` with Scapy?
body: <p>I am trying to generate pcap file from a tcpdump output, how can I generate those packets having sequence number as <code>first:last</code>?</p>
  
  <p>Here is what my tcpdump input looks like:</p>
  
  <p><code>tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
  1509471560.944080 MAC1 &gt; MAC2, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 23237, offset 0, flags [DF], proto TCP (6), length 60)
      IP1.port &gt; IP2.port: Flags [S], cksum 0x6d2f (incorrect -&gt; 0x0b4a), seq 1127096708, win 65535, options [mss 1460,sackOK,TS val 817985 ecr 0,nop,wscale 6], length 0
  1509471561.042855 MAC2 &gt; MAC1, ethertype IPv4 (0x0800), length 58: (tos 0x0, ttl 64, id 3107, offset 0, flags [none], proto TCP (6), length 44)
      IP2.port &gt; IP1.port: Flags [S.], cksum 0x85d8 (correct), seq 449984001, ack 1127096709, win 65535, options [mss 1460], length 0
  1509471561.044008 MAC1 &gt; MAC2, ethertype IPv4 (0x0800), length 54: (tos 0x0, ttl 64, id 23238, offset 0, flags [DF], proto TCP (6), length 40)
      IP1.port &gt; IP2.port: Flags [.], cksum 0x6d1b (incorrect -&gt; 0x9d95), seq 1, ack 1, win 65535, length 0
  1509471561.046607 MAC1 &gt; MAC2, ethertype IPv4 (0x0800), length 191: (tos 0x0, ttl 64, id 23239, offset 0, flags [DF], proto TCP (6), length 177)
      IP1.port &gt; IP2.port: Flags [P.], cksum 0x6da4 (incorrect -&gt; 0x98df), seq 1:138, ack 1, win 65535, length 137
  1509471914.089046 MAC1 &gt; MAC2, ethertype IPv4 (0x0800), length 82: (tos 0x0, ttl 64, id 54304, offset 0, flags [DF], proto UDP (17), length 68)</code></p>
  
  <p>Following is the code I have prepared to process the TCP packets: </p>
  
  <pre class="lang-py prettyprint-override"><code>from scapy.all import *
  import secrets
  
  def generatePcapfromText(inputtxt,output):
      with open (inputtxt,encoding='cp850') as input:
          framenum=0
          for line in input:
              if line[0].isdigit(): # line one
                  framenum += 1
                  frametime=float(line[:16])
  
                  srcmac= line[18:34]
                  dstmac= line[38:54]
                  ethertype = int(line[line.find('(')+1:line.find(')')], 16)
                  frameLen=int(line[line.find('length')+7:line.find(': (')])
                  frameTos=int(line[line.find('tos')+4:line.find(', ttl')],16)
                  frameTtl=int(line[line.find('ttl')+4:line.find(', id')])
                  frameId=int(line[line.find('id')+3:line.find(', offset')])
                  frameOffset=line[line.find('offset')+7:line.find(', flags')]
                  frameFlags=line[line.find('[')+1:line.find(']')]
                  protocol = line[line.find('proto')+6:line.rfind('(')-1]
                  ipLen = int(line[line.rfind('length')+6:line.rfind(')')])
  
                  if frameFlags == "none":
                      frameFlags = ""
  
                  ether = Ether(dst=dstmac, src=srcmac, type=ethertype) 
  
              elif len(line)&gt;5:
                  if line[5].isdigit(): # line two
                      srcinfo = line[4:line.find ( '&gt;' )]
                      dstinfo = line[line.find ( '&gt;' ) + 2:line.find ( ':' )]
                      ipsrc = srcinfo[:srcinfo.rfind ( '.' )]
                      ipdst = dstinfo[:dstinfo.rfind ( '.' )]
                      srcport = int(srcinfo[srcinfo.rfind ( '.' ) + 1:])
                      dstport = int(dstinfo[dstinfo.rfind ( '.' ) + 1:])
  
                      ip = ether/IP(src=ipsrc, dst=ipdst, len=frameLen, tos=frameTos, ttl=frameTtl, id=frameId, flags=frameFlags, proto=protocol.lower())
  
                      if protocol == "TCP":
  
                          frameFlag = line[line.find ( '[' ) + 1:line.find ( ']' )]
                          frameFlag=frameFlag.replace(".","A")
  
                          cksum = int(line[line.find ( 'cksum' ) + 6:line.find ( '(' )],16)
  
                          if ", ack" in line:      
                              seq_n = line[line.find ( ', seq' ) + 6:line.find ( ', ack' )]
                              ack_n = int(line[line.find ( 'ack' ) + 4:line.find ( ', win' )])
                          else:
                              seq_n = line[line.find ( ', seq' ) + 6:line.find ( ', win' )]
                              ack_n = 0
  
                          if "options" in line:
                              win = int(line[line.find ( 'win' ) + 4:line.find ( ', options' )])
                              options= line[line.find ( 'options' ) + 8:line.find ( ', length' )]
                          else:    
                              win = int(line[line.find ( 'win' ) + 4:line.find ( ', length' )])
                              options="[]"
  
                          pktlen = int(line[line.find ( ', length' ) + 9:])
  
                          if ":" in seq_n: 
                              # ???
                          else:   
                              pkt = ip / TCP(sport=srcport, dport=dstport , flags=frameFlag, seq=int(seq_n), ack=ack_n, chksum=cksum, window=win) / secrets.token_hex(pktlen)                  
  
                      pkt.time = frametime
  
                      wrpcap(output, pkt, append=True)
  </code></pre>
  
  <p>As <code>TCP</code> in Scapy need an integer for the sequence number I cannot pass it <code>first:last</code> as the sequence number, so It needs some modification which I am not familiar with as It is my first time working with Scapy. I have mark where this modification should be done via <code>#???</code> in the code above.</p>
  
  <p>For my purpose it is important that the packets have the same timestamp as the tcpdump input, so I have set the packet timestamp via <code>pkt.time=timestamp</code>.</p>
  
  <p>PS: You can find history behind this question <a href="https://stackoverflow.com/questions/58097621/how-to-generate-a-pcap-traffic-from-text-file-with-the-help-of-scapy">here</a>.</p>