
Hi Joe,
On Thu, Jan 19, 2012 at 4:53 PM, Joe Hershberger joe.hershberger@ni.com wrote:
ICMP (ping) was reimplementing IP header code... it now shares code.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com Cc: Joe Hershberger joe.hershberger@gmail.com Cc: Wolfgang Denk wd@denx.de
include/net.h | 4 +++- net/bootp.c | 6 +++--- net/net.c | 47 ++++++++++++++++++++++++++++------------------- net/ping.c | 52 +++++++++++++++++++++++----------------------------- 4 files changed, 57 insertions(+), 52 deletions(-)
To be honest these sorts of cleanup are great, but they are very hard to review unless you know the code well. In particular your commit message makes me imagine that you are cutting out duplicate code, but it is changing a bit also.
diff --git a/include/net.h b/include/net.h index add2080..19e9463 100644 --- a/include/net.h +++ b/include/net.h @@ -421,7 +421,9 @@ extern int NetEthHdrSize(void); extern int NetSetEther(uchar *, uchar *, uint);
/* Set IP header */ -extern void NetSetIP(uchar *, IPaddr_t, int, int, int); +extern void NetSetIPHeader(uchar *pkt, IPaddr_t dest, IPaddr_t source); +extern void NetSetUDPHeader(uchar *pkt, IPaddr_t dest, int dport,
- int sport, int len);
/* Checksum */ extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */ diff --git a/net/bootp.c b/net/bootp.c index 2be8083..0c2af48 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -619,7 +619,7 @@ BootpRequest(void) * determined. * C. Hallinan, DS4.COM, Inc. */
- /* NetSetIP(pkt, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC,
- /* NetSetUDPHeader(pkt, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC,
sizeof (struct Bootp_t)); */ iphdr = pkt; /* We need this later for NetSetUDPHeader() */ pkt += IP_UDP_HDR_SIZE; @@ -663,7 +663,7 @@ BootpRequest(void) pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len; iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len;
- NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
- NetSetUDPHeader(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
NetSetTimeout(SELECT_TIMEOUT, BootpTimeout);
#if defined(CONFIG_CMD_DHCP) @@ -844,7 +844,7 @@ static void DhcpSendRequestPkt(struct Bootp_t *bp_offer) pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen; iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;
- NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
- NetSetUDPHeader(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
debug("Transmitting DHCPREQUEST packet: len = %d\n", pktlen); #ifdef CONFIG_BOOTP_DHCP_REQUEST_DELAY diff --git a/net/net.c b/net/net.c index 9bf74d5..a47b215 100644 --- a/net/net.c +++ b/net/net.c @@ -625,7 +625,7 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, pkt = NetArpWaitTxPacket; pkt += NetSetEther(pkt, NetArpWaitPacketMAC, PROT_IP);
- NetSetIP(pkt, dest, dport, sport, payload_len);
- NetSetUDPHeader(pkt, dest, dport, sport, payload_len);
memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket + (pkt - (uchar *)NetArpWaitTxPacket) + IP_UDP_HDR_SIZE, payload_len); @@ -645,7 +645,7 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
pkt = (uchar *)NetTxPacket; pkt += NetSetEther(pkt, ether, PROT_IP);
- NetSetIP(pkt, dest, dport, sport, payload_len);
- NetSetUDPHeader(pkt, dest, dport, sport, payload_len);
eth_send(NetTxPacket, (pkt - NetTxPacket) + IP_UDP_HDR_SIZE + payload_len);
@@ -1250,40 +1250,49 @@ NetSetEther(uchar *xet, uchar * addr, uint prot) }
void -NetSetIP(uchar *xip, IPaddr_t dest, int dport, int sport, int len) +NetSetIPHeader(uchar *pkt, IPaddr_t dest, IPaddr_t source) {
- struct IP_UDP_t *ip = (struct IP_UDP_t *)xip;
- struct IP_UDP_t *ip = (struct IP_UDP_t *)pkt;
/*
- * If the data is an odd number of bytes, zero the
- * byte after the last byte so that the checksum
- * will work.
- */
- if (len & 1)
- xip[IP_UDP_HDR_SIZE + len] = 0;
- /*
- * Construct an IP and UDP header.
- * (need to set no fragment bit - XXX)
- * Construct an IP header.
*/ /* IP_HDR_SIZE / 4 (not including UDP) */ ip->ip_hl_v = 0x45; ip->ip_tos = 0;
- ip->ip_len = htons(IP_UDP_HDR_SIZE + len);
- ip->ip_len = htons(IP_HDR_SIZE);
ip->ip_id = htons(NetIPID++); ip->ip_off = htons(IP_FLAGS_DFRAG); /* Don't fragment */ ip->ip_ttl = 255;
- ip->ip_p = 17; /* UDP */
ip->ip_sum = 0; /* already in network byte order */
- NetCopyIP((void *)&ip->ip_src, &NetOurIP);
- /* - "" - */
- NetCopyIP((void *)&ip->ip_src, &source);
- /* already in network byte order */
NetCopyIP((void *)&ip->ip_dst, &dest); +}
+void +NetSetUDPHeader(uchar *pkt, IPaddr_t dest, int dport, int sport, int len) +{
- struct IP_UDP_t *ip = (struct IP_UDP_t *)pkt;
- /*
- * If the data is an odd number of bytes, zero the
- * byte after the last byte so that the checksum
- * will work.
- */
- if (len & 1)
- pkt[IP_UDP_HDR_SIZE + len] = 0;
- NetSetIPHeader(pkt, dest, NetOurIP);
- ip->ip_len = htons(IP_UDP_HDR_SIZE + len);
- ip->ip_p = IPPROTO_UDP;
- ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE >> 1);
ip->udp_src = htons(sport); 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 / 2);
}
void copy_filename(char *dst, const char *src, int size) diff --git a/net/ping.c b/net/ping.c index 34e287c..356f107 100644 --- a/net/ping.c +++ b/net/ping.c @@ -16,11 +16,31 @@ static ushort PingSeqNo; /* The ip address to ping */ IPaddr_t NetPingIP;
+static void SetICMPHeader(uchar *pkt, IPaddr_t dest) +{
- /*
- * Construct an IP and ICMP header.
- */
- struct IP_UDP_t *ip = (struct IP_UDP_t *)pkt;
- struct ICMP_t *icmp = (struct ICMP_t *)&ip->udp_src;
- NetSetIPHeader(pkt, dest, NetOurIP);
- ip->ip_len = htons(IP_ICMP_HDR_SIZE);
- ip->ip_p = IPPROTO_ICMP;
- ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE >> 1);
Is >> 1 better than / 2 ?
- icmp->type = ICMP_ECHO_REQUEST;
- icmp->code = 0;
- icmp->checksum = 0;
- icmp->un.echo.id = 0;
- icmp->un.echo.sequence = htons(PingSeqNo++);
- icmp->checksum = ~NetCksum((uchar *)icmp, ICMP_HDR_SIZE >> 1);
+}
static int PingSend(void) { static uchar mac[6];
- struct IP_UDP_t *ip;
- ushort *s;
uchar *pkt;
/* XXX always send arp request */ @@ -35,33 +55,7 @@ static int PingSend(void) pkt = NetArpWaitTxPacket; pkt += NetSetEther(pkt, mac, PROT_IP);
- ip = (struct IP_UDP_t *)pkt;
- /*
- * Construct an IP and ICMP header.
- * (need to set no fragment bit - XXX)
- */
- /* IP_HDR_SIZE / 4 (not including UDP) */
- ip->ip_hl_v = 0x45;
- ip->ip_tos = 0;
- 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;
- ip->ip_p = 0x01; /* ICMP */
- ip->ip_sum = 0;
- /* already in network byte order */
- NetCopyIP((void *)&ip->ip_src, &NetOurIP);
- /* - "" - */
- NetCopyIP((void *)&ip->ip_dst, &NetPingIP);
- 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 */
- s[1] = 0; /* checksum */
- s[2] = 0; /* identifier */
- s[3] = htons(PingSeqNo++); /* sequence number */
- s[1] = ~NetCksum((uchar *)s, 8/2);
- SetICMPHeader(pkt, NetPingIP);
/* size of the waiting packet */ NetArpWaitTxPacketSize = -- 1.6.0.2
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Regards, Simon