c++socketsudpfragmentation

udp packet fragmentation for raw sockets


Follow-up of question packet fragmentation for raw sockets

If I have a raw socket implemented as such:

  if ((sip_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
      {
    cout << "Unable to create the SIP sockets."<< sip_socket<<" \n";
    return -3;
      }

   if ( setsockopt(sip_socket, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) == -1)
      {
   cerr << "Unable to set option to Raw Socket.\n";
   return -4;
      };  

how can I set the ipHdr->fragment_offset (16 bits including 3 bit flags) if I have a packet of size 1756 (not including the IP header)?
Do I need to prepare two packets-one of size 1480 and another of size 276, and then slap IP headers on both packets?

Can anyone point to an example code for this?


Solution

  • Yes, you need to prepare two packets, each with their own IP header.

    If you put 1480 bytes of data in the first packet and 276 in the second, then the IP headers should be identical, except for these fields: