PERFORCE change 95547 for review
Warner Losh
imp at FreeBSD.org
Tue Apr 18 22:08:58 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=95547
Change 95547 by imp at imp_Speedy on 2006/04/18 22:08:27
Some common sense optimizations of the tftp code. Saves about
300 bytes, about a 10% savings. bootspi is now < 12k, but
bootiic is still just over.
Affected files ...
.. //depot/projects/arm/src/sys/boot/arm/at91/Makefile.inc#5 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#2 edit
Differences ...
==== //depot/projects/arm/src/sys/boot/arm/at91/Makefile.inc#5 (text+ko) ====
==== //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#2 (text+ko) ====
@@ -32,8 +32,7 @@
static unsigned localMACSet, serverMACSet, MAC_init;
static unsigned char localMACAddr[6], serverMACAddr[6];
-static unsigned localIPSet, serverIPSet;
-static unsigned char localIPAddr[4], serverIPAddr[4];
+static unsigned localIPAddr, serverIPAddr;
static unsigned short serverPort, localPort;
static int ackBlock;
@@ -89,11 +88,8 @@
p_ARP->operation = SWAP16(ARP_REQUEST);
p_memcpy((char*)p_ARP->sender_mac, (char*)localMACAddr, 6);
-
p_memcpy((char*)p_ARP->sender_ip, (char*)localIPAddr, 4);
-
p_memset((char*)p_ARP->target_mac, 0, 6);
-
p_memcpy((char*)p_ARP->target_ip, (char*)serverIPAddr, 4);
// wait until transmit is available
@@ -120,7 +116,6 @@
unsigned t_checksum;
p_memcpy((char*)macHdr->dest_mac, (char*)serverMACAddr, 6);
-
p_memcpy((char*)macHdr->src_mac, (char*)localMACAddr, 6);
macHdr->proto_mac = SWAP16(PROTOCOL_IP);
@@ -137,15 +132,14 @@
ipHdr->ip_sum = 0;
p_memcpy((char*)ipHdr->ip_src, (char*)localIPAddr, 4);
-
p_memcpy((char*)ipHdr->ip_dst, (char*)serverIPAddr, 4);
ipHdr->ip_sum = SWAP16(IP_checksum(ipHdr, 20));
udpHdr = (udp_header_t*)(ipHdr + 1);
- udpHdr->src_port = SWAP16(localPort);
- udpHdr->dst_port = SWAP16(serverPort);
+ udpHdr->src_port = localPort;
+ udpHdr->dst_port = serverPort;
udpHdr->udp_len = SWAP16(8 + tftpLength);
udpHdr->udp_cksum = 0;
@@ -207,7 +201,7 @@
{
tftp_header_t tftpHeader;
- if (block_num == (ackBlock + 1)) {
+ if (block_num == SWAP16(ackBlock + 1)) {
++ackBlock;
p_memcpy(dlAddress, data, len);
dlAddress += len;
@@ -215,7 +209,7 @@
}
tftpHeader.opcode = SWAP16(TFTP_ACK_OPCODE);
- tftpHeader.block_num = SWAP16(block_num);
+ tftpHeader.block_num = block_num;
Send_TFTP_Packet((char*)&tftpHeader, 4);
if (len < 512)
@@ -231,7 +225,7 @@
* .KB_C_FN_DEFINITION_END
*/
static void
-CheckForNewPacket(ip_header_t *pHeader)
+CheckForNewPacket(void)
{
unsigned short *pFrameType;
unsigned i;
@@ -262,7 +256,8 @@
case PROTOCOL_ARP:
p_ARP = (arp_header_t*)pData;
- if (SWAP16(p_ARP->operation) == ARP_REPLY) {
+ i = SWAP16(p_ARP->operation);
+ if (i == ARP_REPLY) {
// check if new server info is available
if ((!serverMACSet) &&
@@ -274,30 +269,22 @@
p_memcpy((char*)serverMACAddr,
(char*)p_ARP->sender_mac, 6);
}
- }
-
- if (SWAP16(p_ARP->operation) == ARP_REQUEST) {
+ } else if (i == ARP_REQUEST) {
// ARP REPLY operation
p_ARP->operation = SWAP16(ARP_REPLY);
- // Fill the dest address and src address
- for (i = 0; i <6; i++) {
- // swap ethernet dest address and ethernet src address
- pData[i] = pData[i+6];
- pData[i+6] = localMACAddr[i];
- // swap sender ethernet address and target ethernet address
- pData[i+22] = localMACAddr[i];
- pData[i+32] = pData[i+6];
- }
+ // Swap the src/dst MAC addr
+ p_memcpy(p_ARP->dest_mac, p_ARP->src_mac, 6);
+ p_memcpy(p_ARP->src_mac, localMACAddr, 6);
+
+ // Do IP and MAC addr at same time.
+ p_memcpy(p_ARP->target_mac, p_ARP->sender_mac, 10);
+ p_memcpy(p_ARP->sender_mac, localMACAddr, 6);
+ p_memcpy(p_ARP->sender_ip, (char *)&localIPAddr, 4);
- // swap sender IP address and target IP address
- for (i = 0; i<4; i++) {
- pData[i+38] = pData[i+28];
- pData[i+28] = localIPAddr[i];
- }
-
- if (!(*AT91C_EMAC_TSR & AT91C_EMAC_BNQ)) break;
+ if (!(*AT91C_EMAC_TSR & AT91C_EMAC_BNQ))
+ break;
*AT91C_EMAC_TSR |= AT91C_EMAC_COMP;
*AT91C_EMAC_TAR = (unsigned)pData;
@@ -307,10 +294,7 @@
case PROTOCOL_IP:
pIpHeader = (ip_header_t*)(pData + 14);
- p_memcpy((char*)pHeader, (char*)pIpHeader,sizeof(ip_header_t));
-
switch(pIpHeader->ip_p) {
-
case PROTOCOL_UDP:
{
udp_header_t *udpHdr;
@@ -319,24 +303,24 @@
udpHdr = (udp_header_t*)((char*)pIpHeader+20);
tftpHdr = (tftp_header_t*)((char*)udpHdr + 8);
- if (SWAP16(udpHdr->dst_port) != localPort)
+ if (udpHdr->dst_port != localPort)
break;
- if (SWAP16(tftpHdr->opcode) != TFTP_DATA_OPCODE)
+ if (tftpHdr->opcode != SWAP16(TFTP_DATA_OPCODE))
break;
if (ackBlock == -1) {
- if (SWAP16(tftpHdr->block_num) != 1)
+ if (tftpHdr->block_num != SWAP16(1))
break;
- serverPort = SWAP16(udpHdr->src_port);
+ serverPort = udpHdr->src_port;
ackBlock = 0;
}
- if (serverPort != SWAP16(udpHdr->src_port))
+ if (serverPort != udpHdr->src_port)
break;
TFTP_ACK_Data(tftpHdr->data,
- SWAP16(tftpHdr->block_num),
+ tftpHdr->block_num,
SWAP16(udpHdr->udp_len) - 12);
}
break;
@@ -502,13 +486,7 @@
{
// force update in case the IP has changed
serverMACSet = 0;
-
- serverIPAddr[0] = (address >> 24) & 0xFF;
- serverIPAddr[1] = (address >> 16) & 0xFF;
- serverIPAddr[2] = (address >> 8) & 0xFF;
- serverIPAddr[3] = (address >> 0) & 0xFF;
-
- serverIPSet = 1;
+ serverIPAddr = address;
}
@@ -523,13 +501,7 @@
{
// force update in case the IP has changed
serverMACSet = 0;
-
- localIPAddr[0] = (address >> 24) & 0xFF;
- localIPAddr[1] = (address >> 16) & 0xFF;
- localIPAddr[2] = (address >> 8) & 0xFF;
- localIPAddr[3] = (address >> 0) & 0xFF;
-
- localIPSet = 1;
+ localIPAddr = address;
}
@@ -544,7 +516,6 @@
void
TFTP_Download(unsigned address, char *filename)
{
- ip_header_t IpHeader;
unsigned thisSeconds, running, state;
int timeout, tickUpdate;
@@ -556,7 +527,7 @@
return ;
}
- if ((!localMACSet) || (!localIPSet) || (!serverIPSet))
+ if ((!localMACSet) || (!localIPAddr) || (!serverIPAddr))
return ;
if (!MAC_init) {
@@ -617,13 +588,13 @@
state = TFTP_WAITING_SERVER_MAC;
timeout = 10;
thisSeconds = GetSeconds();
- serverPort = 69;
- ++localPort;
+ serverPort = SWAP16(69);
+ localPort++; /* In network byte order, but who cares */
ackBlock = -1;
while (running && timeout) {
- CheckForNewPacket(&IpHeader);
+ CheckForNewPacket();
tickUpdate = 0;
@@ -685,9 +656,7 @@
p_rxBD = (receive_descriptor_t*)RX_BUFFER_START;
localMACSet = 0;
serverMACSet = 0;
- localIPSet = 0;
- serverIPSet = 0;
- localPort = 0x8002;
+ localPort = SWAP16(0x8002);
lastAddress = 0;
lastSize = 0;
MAC_init = 0;
More information about the p4-projects
mailing list