11 #include "LibEndian.hpp"
13 #include "NetChecksum.hpp"
15 void NetIp::processFrame(NetDefs::FRAME& frame, NetDefs::IP_HEADER& header) {
18 if (checkDstAddress(header.dstAddr)) {
21 int headerLen = (int) ((header.headerLen) << 2);
22 int optionLen = headerLen -
sizeof(NetDefs::IP_HEADER);
23 int len = header.totalLen - headerLen;
25 switch (header.protocol) {
26 case NetDefs::IP_PROTOCOL_ICMP:
27 NetIcmp::processFrame(frame, *((NetDefs::ICMP_HEADER*) (((uint8_t*) &header) + headerLen + optionLen)), len);
29 case NetDefs::IP_PROTOCOL_UDP:
30 NetUdp::processFrame(frame, *((NetDefs::UDP_HEADER*) (((uint8_t*) &header) + headerLen + optionLen)), len);
32 case NetDefs::IP_PROTOCOL_TCP:
33 NetTcp::processFrame(frame, *((NetDefs::TCP_HEADER*) (((uint8_t*) &header) + headerLen + optionLen)), len);
36 Net::freeFrame(frame);
41 Net::freeFrame(frame);
46 bool NetIp::checkDstAddress(NetDefs::IP_ADDR& address) {
48 if (address == NetDefs::IP_BROADCAST) {
52 if ((address.val ^ (~Net::sConfig.mask.val)) == (Net::sConfig.ipAddr.val & Net::sConfig.mask.val)) {
56 if (address == Net::sConfig.ipAddr) {
63 void NetIp::putHeader(NetDefs::FRAME& frame,
const NetDefs::MAC_ADDR& macDst,
const NetDefs::IP_ADDR& ipDst,
int dataLen, uint8_t protocol) {
64 static int identification = 0x0000;
66 frame.types.ip.ipHeader.version = 4;
67 frame.types.ip.ipHeader.headerLen = 5;
68 frame.types.ip.ipHeader.typeOfService = 0x00;
69 frame.types.ip.ipHeader.totalLen =
sizeof(NetDefs::IP_HEADER) + dataLen;
70 frame.types.ip.ipHeader.identification = ++identification;
71 frame.types.ip.ipHeader.fragmentInfo = 0;
72 frame.types.ip.ipHeader.timeToLive = 0x80;
73 frame.types.ip.ipHeader.protocol = (NetDefs::IP_PROTOCOL) protocol;
74 frame.types.ip.ipHeader.headerChecksum = 0;
75 frame.types.ip.ipHeader.dstAddr = ipDst;
76 frame.types.ip.ipHeader.srcAddr = Net::sConfig.ipAddr;
78 swapHeader(frame.types.ip.ipHeader);
80 frame.types.ip.ipHeader.headerChecksum = NetChecksum::finalizeCheckSum(NetChecksum::calcPartialChecksum((uint8_t*) &frame.types.ip.ipHeader,
sizeof(NetDefs::IP_HEADER)));
82 Net::putHeader(frame, macDst, NetDefs::MAC_TYPE_IP);
85 void NetIp::flush(NetDefs::FRAME& frame,
int dataLen,
bool discardable) {
86 Net::flush(frame,
sizeof(NetDefs::IP_HEADER) + dataLen, discardable);
89 void NetIp::swapHeader(NetDefs::IP_HEADER& header) {
90 header.totalLen = LibEndian::hwToBe(header.totalLen);
91 header.identification = LibEndian::hwToBe(header.identification);
92 header.headerChecksum = LibEndian::hwToBe(header.headerChecksum);