diff --git a/include/net.h b/include/net.h index 3e4f304204..7692153b30 100644 --- a/include/net.h +++ b/include/net.h @@ -193,6 +193,30 @@ typedef struct { #define IPPROTO_ICMP 1 /* Internet Control Message Protocol */ #define IPPROTO_UDP 17 /* User Datagram Protocol */ +/* + * Internet Protocol (IP) header. + */ +struct ip_hdr { + uchar ip_hl_v; /* header length and version */ + uchar ip_tos; /* type of service */ + ushort ip_len; /* total length */ + ushort ip_id; /* identification */ + ushort ip_off; /* fragment offset field */ + uchar ip_ttl; /* time to live */ + uchar ip_p; /* protocol */ + ushort ip_sum; /* checksum */ + IPaddr_t ip_src; /* Source IP address */ + IPaddr_t ip_dst; /* Destination IP address */ +}; + +#define IP_OFFS 0x1fff /* ip offset *= 8 */ +#define IP_FLAGS 0xe000 /* first 3 bits */ +#define IP_FLAGS_RES 0x8000 /* reserved */ +#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */ +#define IP_FLAGS_MFRAG 0x2000 /* more fragments */ + +#define IP_HDR_SIZE (sizeof(struct ip_hdr)) + /* * Internet Protocol (IP) + UDP header. */ @@ -213,16 +237,8 @@ struct ip_udp_hdr { ushort udp_xsum; /* Checksum */ }; -#define IP_OFFS 0x1fff /* ip offset *= 8 */ -#define IP_FLAGS 0xe000 /* first 3 bits */ -#define IP_FLAGS_RES 0x8000 /* reserved */ -#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */ -#define IP_FLAGS_MFRAG 0x2000 /* more fragments */ - -#define IP_HDR_SIZE_NO_UDP (sizeof(struct ip_udp_hdr) - 8) - #define IP_UDP_HDR_SIZE (sizeof(struct ip_udp_hdr)) -#define UDP_HDR_SIZE (IP_UDP_HDR_SIZE - IP_HDR_SIZE_NO_UDP) +#define UDP_HDR_SIZE (IP_UDP_HDR_SIZE - IP_HDR_SIZE) /* * Address Resolution Protocol (ARP) header. diff --git a/net/net.c b/net/net.c index f0e8a6798f..2bf5631f0d 100644 --- a/net/net.c +++ b/net/net.c @@ -663,7 +663,7 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len) static struct rpc_t rpc_specimen; #define IP_PKTSIZE (CONFIG_NET_MAXDEFRAG + sizeof(rpc_specimen.u.reply)) -#define IP_MAXUDP (IP_PKTSIZE - IP_HDR_SIZE_NO_UDP) +#define IP_MAXUDP (IP_PKTSIZE - IP_HDR_SIZE) /* * this is the packet being assembled, either data or frag control. @@ -688,11 +688,11 @@ static struct ip_udp_hdr *__NetDefragment(struct ip_udp_hdr *ip, int *lenp) u16 ip_off = ntohs(ip->ip_off); /* payload starts after IP header, this fragment is in there */ - payload = (struct hole *)(pkt_buff + IP_HDR_SIZE_NO_UDP); + payload = (struct hole *)(pkt_buff + IP_HDR_SIZE); offset8 = (ip_off & IP_OFFS); thisfrag = payload + offset8; start = offset8 * 8; - len = ntohs(ip->ip_len) - IP_HDR_SIZE_NO_UDP; + len = ntohs(ip->ip_len) - IP_HDR_SIZE; if (start + len > IP_MAXUDP) /* fragment extends too far */ return NULL; @@ -705,7 +705,7 @@ static struct ip_udp_hdr *__NetDefragment(struct ip_udp_hdr *ip, int *lenp) payload[0].prev_hole = 0; first_hole = 0; /* any IP header will work, copy the first we received */ - memcpy(localip, ip, IP_HDR_SIZE_NO_UDP); + memcpy(localip, ip, IP_HDR_SIZE); } /* @@ -788,12 +788,12 @@ static struct ip_udp_hdr *__NetDefragment(struct ip_udp_hdr *ip, int *lenp) } /* finally copy this fragment and possibly return whole packet */ - memcpy((uchar *)thisfrag, indata + IP_HDR_SIZE_NO_UDP, len); + memcpy((uchar *)thisfrag, indata + IP_HDR_SIZE, len); if (!done) return NULL; localip->ip_len = htons(total_len); - *lenp = total_len + IP_HDR_SIZE_NO_UDP; + *lenp = total_len + IP_HDR_SIZE; return localip; } @@ -983,7 +983,7 @@ NetReceive(uchar *inpkt, int len) if ((ip->ip_hl_v & 0x0f) > 0x05) return; /* Check the Checksum of the header */ - if (!NetCksumOk((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2)) { + if (!NetCksumOk((uchar *)ip, IP_HDR_SIZE / 2)) { puts("checksum bad\n"); return; } @@ -1273,7 +1273,7 @@ void NetSetIP(uchar *xip, IPaddr_t dest, int dport, int sport, int len) ip->udp_dst = htons(dport); ip->udp_len = htons(UDP_HDR_SIZE + len); ip->udp_xsum = 0; - ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2); + ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE / 2); } void copy_filename(char *dst, const char *src, int size) diff --git a/net/ping.c b/net/ping.c index 6a2e85dabc..8542e2299b 100644 --- a/net/ping.c +++ b/net/ping.c @@ -44,7 +44,7 @@ static int ping_send(void) /* IP_HDR_SIZE / 4 (not including UDP) */ ip->ip_hl_v = 0x45; ip->ip_tos = 0; - ip->ip_len = htons(IP_HDR_SIZE_NO_UDP + 8); + ip->ip_len = htons(IP_HDR_SIZE + 8); ip->ip_id = htons(NetIPID++); ip->ip_off = htons(IP_FLAGS_DFRAG); /* Don't fragment */ ip->ip_ttl = 255; @@ -54,7 +54,7 @@ static int ping_send(void) NetCopyIP((void *)&ip->ip_src, &NetOurIP); /* - "" - */ NetCopyIP((void *)&ip->ip_dst, &NetPingIP); - ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2); + ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE / 2); s = &ip->udp_src; /* XXX ICMP starts here */ s[0] = htons(0x0800); /* echo-request, code */ @@ -65,7 +65,7 @@ static int ping_send(void) /* size of the waiting packet */ NetArpWaitTxPacketSize = - (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8; + (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE + 8; /* and do the ARP request */ NetArpWaitTry = 1; @@ -125,12 +125,12 @@ void ping_receive(Ethernet_t *et, struct ip_udp_hdr *ip, int len) NetCopyIP((void *)&ip->ip_dst, &ip->ip_src); NetCopyIP((void *)&ip->ip_src, &NetOurIP); ip->ip_sum = ~NetCksum((uchar *)ip, - IP_HDR_SIZE_NO_UDP >> 1); + IP_HDR_SIZE >> 1); icmph->type = ICMP_ECHO_REPLY; icmph->checksum = 0; icmph->checksum = ~NetCksum((uchar *)icmph, - (len - IP_HDR_SIZE_NO_UDP) >> 1); + (len - IP_HDR_SIZE) >> 1); (void) eth_send((uchar *)et, ETHER_HDR_SIZE + len); return;