C++ for building Ipv4 packet

93 views
Skip to first unread message

Nick Gian

unread,
Nov 21, 2022, 5:51:50 PM11/21/22
to OMNeT++ Users
Hello all

I need help with C++ code to build an Ipv4 packet with costume data sections.

I use this but is not working and i dont know why. I use ethHeader & EtherFcs because i want to send it via aodv router that's it connected at AODV router and after that the node0<-->Aodv router 1 communicate with Aodv router 2 <--> node1 , where <--> ethernet line( see at bottom for the error)

        auto ethHeader = makeShared<EthernetMacHeader>();
                ethHeader->setDest(destMac);
                ethHeader->setSrc(sourceMac);
                ethHeader->setTypeOrLength(tmp_ethertype);

                auto ethernetFcs = makeShared<EthernetFcs>();
                ethernetFcs->setFcsMode(FCS_DECLARED_CORRECT);

                auto tmp_packet = makeShared<myPacket>();
                tmp_packet->setName("tmp_packet");
                unsigned int tmp_packet_length=(unsigned int) (Rcvpacket->length-14);
                tmp_packet->setLength(tmp_packet_length); //only the payload after striping dst, src, ethertype

                    my_Version = (short) 4;                 
                    my_IHL = (B) 20;                   
                    my_TOS= (short) (Rcvpacket->data[15]);                  
                    my_Total_Length=(B)((Rcvpacket->data[17]<<8) + (Rcvpacket->data[16]&0xFF));

                   my_Identification = 0;
                    my_Flags_DF=(bool)(Rcvpacket->data[20]&0x02);
                    my_Flags_MF=(bool)(Rcvpacket->data[20]&0x04);
                    my_Fragment_Offset = 0;
                    my_Time_to_Live= (short) (Rcvpacket->data[22]);
                                // 6
                    my_Protocol= IP_PROT_IP; //IP_PROT_TCP =6 ;  or ? IP_PROT_IP = 4 // old -> (int)6// Rcvpacket->data[23]; //try 6 suppress the icmp casting error in wireless routers



                    //--------------- END IP Decapsulation ---------------

                    //----------------- Build Datagram -----------


                    datagram = makeShared<Ipv4Header>();
                    icmp = makeShared<IcmpHeader>();



                    Ipv4Address IP_src,IP_dest;
                    // inet/src/inet/networklayer/contract/ipv4/IPv4Address.cc
                    IP_src.set(my_source_ip[0],my_source_ip[1],my_source_ip[2],my_source_ip[3]);
                    IP_dest.set(my_dest_ip[0],my_dest_ip[1],my_dest_ip[2],my_dest_ip[3]);

                    //------ set datagram ---
                    datagram->setVersion(my_Version);   //old -> datagram->setVersion(my_Version);
                    datagram->setHeaderLength(my_IHL);  //old -> datagram->setHeaderLength(my_IHL);
                    datagram->setTypeOfService(my_TOS); //old -> datagram->setTypeOfService(my_TOS);
                    datagram->setTotalLengthField(my_Total_Length); //old -> datagram->setTotalLengthField(my_Total_Length);
                    datagram->setIdentification(my_Identification); //old -> datagram->setIdentification(my_Identification);

                    datagram->setDontFragment(my_Flags_DF); //old -> datagram->setDontFragment(my_Flags_DF); // bit 2/8
                    datagram->setMoreFragments(my_Flags_MF); //old -> datagram->setMoreFragments(my_Flags_MF); //bit 3/8
                    datagram->setFragmentOffset(my_Fragment_Offset); //old -> datagram->setFragmentOffset(my_Fragment_Offset);// bits: 4,5,6,7,8 + 8 = 13 bits

                    datagram->setTimeToLive(my_Time_to_Live); //old -> datagram->setTimeToLive(my_Time_to_Live);
                    datagram->setProtocolId(my_Protocol); //old -> datagram->setProtocolId(my_Protocol);   //old -> datagram->setTransportProtocol(my_Protocol);

                    //Header Checksum omitted, modeled by error bit of packets
                    datagram->setSrcAddress(IP_src);    //old -> datagram->setSrcAddress(IP_src);
                    datagram->setDestAddress(IP_dest);  //old -> datagram->setDestAddress(IP_dest);
                   // datagram->setChunkLength(ETHER_MAC_FRAME_BYTES);  //old -> datagram->setTotalLengthField(ETHER_MAC_HEADER_BYTES);      //old ->datagram->setTotalLengthField(IP_HEADER_BYTES);

                    datagram->setCrcMode(CRC_DECLARED_CORRECT);


                   const auto& protocolTag = packet->addTagIfAbsent<PacketProtocolTag>();
                   protocolTag->setProtocol(&Protocol::ipv4);
                   packet->addTagIfAbsent<NetworkProtocolInd>()->setProtocol(&Protocol::ipv4);
                   packet->addTagIfAbsent<NetworkProtocolInd>()->setNetworkProtocolHeader(datagram);

                    /*  old
                    inet::Ieee80211 *etherctrl;
                    etherctrl = new Ieee802Ctrl();

                    etherctrl->setSrc(sourceMac);
                    etherctrl->setDest(destMac);
                    etherctrl->setEtherType(tmp_ethertype);
                    */



                    if (B((datagram->getChunkLength())) > MAX_ETHERNET_FRAME_BYTES)
                        throw cRuntimeError("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)",datagram->getTotalLengthField(), MAX_ETHERNET_FRAME_BYTES);

                    packet->insertAtFront(datagram);
                    packet->insertAtFront(ethHeader);
                    packet->insertAtBack(tmp_packet);
                    packet->insertAtBack(ethernetFcs);

The errro i getting

INFO: (inet::physicallayer::EthernetSignal)packet (367 ns 367 b) (inet::Packet)packet (367 b) (inet::SequenceChunk) length = 367 b received.
INFO: Reception of , packet = (Packet)packet (303 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)] successfully completed.
INFO: Sending (inet::Packet)packet (303 b) (inet::SequenceChunk) length = 367 b to upper layer.
INFO (MessageDispatcher)ARPTest.micro_router1.li: Dispatching packet to protocol, protocol = ethernetmac(12), servicePrimitive = 2, inGate = (omnetpp::cGate)in[4] <-- eth[0].upperLayerOut, outGate = (omnetpp::cGate)out[1] --> ethernet.lowerLayerIn, packet = (Packet)packet (303 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)].
** Event #8430  t=2.804000367  ARPTest.micro_router1.ethernet (EthernetEncapsulation, id=95)  on packet (inet::Packet, id=8507)

INFO: Received (inet::Packet)packet (303 b) (inet::SequenceChunk) length = 367 b from lower layer.
DETAIL: Decapsulating frame `packet', passing up contained packet `packet' to higher layer
INFO: Sending (inet::Packet)packet (159 b) (inet::SequenceChunk) length = 367 b to upper layer.
INFO (MessageDispatcher)ARPTest.micro_router1.bl: Dispatching packet to protocol, protocol = ipv4(38), servicePrimitive = 2, inGate = (omnetpp::cGate)in[2] <-- ethernet.upperLayerOut, outGate = (omnetpp::cGate)out[0] --> cb.in[0], packet = (Packet)packet (159 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (MessageDispatcher)ARPTest.micro_router1.cb: Dispatching packet to protocol, protocol = ipv4(38), servicePrimitive = 2, inGate = (omnetpp::cGate)in[0] <-- bl.out[0], outGate = (omnetpp::cGate)out[1] --> nl.in[1], packet = (Packet)packet (159 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (MessageDispatcher)ARPTest.micro_router1.nl: Dispatching packet to protocol, protocol = ipv4(38), servicePrimitive = 2, inGate = (omnetpp::cGate)in[1] <-- cb.out[1], outGate = (omnetpp::cGate)out[0] --> ipv4.ifIn, packet = (Packet)packet (159 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (MessageDispatcher)ARPTest.micro_router1.ipv4.lp: Dispatching packet to protocol, protocol = ipv4(38), servicePrimitive = 2, inGate = (omnetpp::cGate)in[2] <-- <parent>.ifIn, (ned.IdealChannel)channel , outGate = (omnetpp::cGate)out[1] --> ip.queueIn, packet = (Packet)packet (159 b) [EthernetPhyHeader | EthernetMacHeader, typeOrLength = 2048 | Ipv4Header, version = 4, headerLength = 20 B, typeOfService = 0, totalLengthField = 21504 B, identification = 0, reservedBit = false, moreFragments = false, dontFragment = false, fragmentOffset = 0, timeToLive = 64, protocolId = 4 (IP_PROT_IP), crc = 0, crcMode = 1 (CRC_DECLARED_CORRECT), srcAddress = 10.0.2.2, destAddress = 10.0.1.2, options =  | myPacket, sourceAddress = 0, destAddress = 0, length = 84, time = 0u, name = tmp_packet | EthernetFcs, fcs = 0, fcsMode = 1 (FCS_DECLARED_CORRECT)].
** Event #8431  t=2.804000367  ARPTest.micro_router1.ipv4.ip (Ipv4, id=161)  on packet (inet::Packet, id=8507)

INFO: Received (inet::Packet)packet (159 b) (inet::SequenceChunk) length = 367 b from network.
<!> Returning an incomplete chunk is not allowed according to the flags: 0 -- in module (inet::Ipv4) ARPTest.micro_router1.ipv4.ip (id=161), at t=2.804000367s, event #8431
Reply all
Reply to author
Forward
0 new messages