#include "ipv4.h" #include "net_sys.h" #include "inet.h" #include "eth.h" #include "icmp.h" #include "udp.h" bool ipv4_incoming(struct netdev *dev,struct eth_hdr *hdr) { struct ipv4_hdr *ipv4=hdr->payload; klog("ipv4 incoming with checksum: 0x%04X",ntohs(ipv4->csum)); ipv4->csum=0; // klog("expected checksum: 0x%04X",checksum(ipv4,ntohs(ipv4->len))); // klog("ipv4 header len=%d",ipv4->ihl); if(ipv4->proto==IPV4_P_ICMP) { icmp_incoming(dev,hdr); } if(ipv4->proto==IPV4_P_UDP) { udp_incoming(hdr,ipv4+1); } return true; } uint32_t ipv4_generic(struct netdev *dev, uint32_t ip, uint8_t type, uint8_t* pos,uint8_t *end) { pos-=20; // we need 20 bytes for the ipv4 header. struct ipv4_hdr *ipv4=pos; ipv4->ihl=5; // 20 bytes ipv4->version=4; // ipv 4 ipv4->tos=0; // type of service? ipv4->len=htons(end-pos); // total length of ip datagramm in bytes ipv4->id=0; // index of datagram for fragmentation //ipv4->flags=0x2; // various control flags 0x20 do not fragment //ipv4->frag_offset=0; // fragment offset 0 - first ipv4->flags_and_offset=0; // TODO! 0x2? ipv4->ttl=64; // time to live - countdown decreased by each receiver ipv4->proto=type; // payload protocol / 1-icmp, 16 - udp , 6 -tcp ipv4->csum=0; // header checksum ipv4->saddr=dev->ip; // source ip address ipv4->daddr=ip; // destination ip address //ipv4->csum=checksum(ipv4,ntohs(ipv4->len)); ipv4->csum=checksum(ipv4,20); return eth_generic(dev,ip,ETH_P_IPV4,pos,end); }