diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2007-09-16 22:12:04 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2007-09-16 22:12:04 +0000 |
commit | 702355cea2f6ab614b8baded85121ee96fb122e5 (patch) | |
tree | 77fe706483352a68b683ecde64215d54cbc89f4f /nuttx/net/uip/uip-arp.c | |
parent | b185533abad887ed4e8e4af41d7488181f16efb4 (diff) |
Associate address with network driver; implement ioctl calls to set addresses
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@345 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx/net/uip/uip-arp.c')
-rw-r--r-- | nuttx/net/uip/uip-arp.c | 102 |
1 files changed, 51 insertions, 51 deletions
diff --git a/nuttx/net/uip/uip-arp.c b/nuttx/net/uip/uip-arp.c index 9e029f3729..90ff6047e1 100644 --- a/nuttx/net/uip/uip-arp.c +++ b/nuttx/net/uip/uip-arp.c @@ -40,7 +40,9 @@ */ #include <sys/types.h> +#include <sys/ioctl.h> #include <string.h> +#include <netinet/in.h> #include <net/uip/uip-arch.h> #include <net/uip/uip-arp.h> @@ -53,24 +55,27 @@ struct arp_hdr uint8 protolen; uint16 opcode; struct uip_eth_addr shwaddr; - uint16 sipaddr[2]; + in_addr_t sipaddr; struct uip_eth_addr dhwaddr; - uint16 dipaddr[2]; + in_addr_t dipaddr; }; -struct ethip_hdr { +struct ethip_hdr +{ struct uip_eth_hdr ethhdr; + /* IP header. */ - uint8 vhl, - tos, - len[2], - ipid[2], - ipoffset[2], - ttl, - proto; + + uint8 vhl; + uint8 tos; + uint8 len[2]; + uint8 ipid[2]; + uint8 ipoffset[2]; + uint8 ttl; + uint8 proto; uint16 ipchksum; - uint16 srcipaddr[2], - destipaddr[2]; + in_addr_t srcipaddr; + in_addr_t destipaddr; }; #define ARP_REQUEST 1 @@ -78,8 +83,9 @@ struct ethip_hdr { #define ARP_HWTYPE_ETH 1 -struct arp_entry { - uint16 ipaddr[2]; +struct arp_entry +{ + in_addr_t ipaddr; struct uip_eth_addr ethaddr; uint8 time; }; @@ -89,7 +95,7 @@ static const struct uip_eth_addr broadcast_ethaddr = static const uint16 broadcast_ipaddr[2] = {0xffff,0xffff}; static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; -static uint16 ipaddr[2]; +static in_addr_t ipaddr; static uint8 i, c; static uint8 arptime; @@ -104,7 +110,7 @@ void uip_arp_init(void) { for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { - memset(arp_table[i].ipaddr, 0, 4); + memset(&arp_table[i].ipaddr, 0, sizeof(in_addr_t)); } } @@ -123,14 +129,14 @@ void uip_arp_timer(void) for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { tabptr = &arp_table[i]; - if ((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && arptime - tabptr->time >= UIP_ARP_MAXAGE) + if (tabptr->ipaddr != 0 && arptime - tabptr->time >= UIP_ARP_MAXAGE) { - memset(tabptr->ipaddr, 0, 4); + tabptr->ipaddr = 0; } } } -static void uip_arp_update(uint16 *pipaddr, struct uip_eth_addr *ethaddr) +static void uip_arp_update(in_addr_t pipaddr, struct uip_eth_addr *ethaddr) { struct arp_entry *tabptr; @@ -145,16 +151,16 @@ static void uip_arp_update(uint16 *pipaddr, struct uip_eth_addr *ethaddr) /* Only check those entries that are actually in use. */ - if (tabptr->ipaddr[0] != 0 && tabptr->ipaddr[1] != 0) + if (tabptr->ipaddr != 0) { /* Check if the source IP address of the incoming packet matches * the IP address in this ARP table entry. */ - if (pipaddr[0] == tabptr->ipaddr[0] && pipaddr[1] == tabptr->ipaddr[1]) + if (uip_ipaddr_cmp(pipaddr, tabptr->ipaddr)) { /* An old entry found, update this and return. */ - memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + memcpy(tabptr->ethaddr.addr, ethaddr->addr, IFHWADDRLEN); tabptr->time = arptime; return; @@ -170,7 +176,7 @@ static void uip_arp_update(uint16 *pipaddr, struct uip_eth_addr *ethaddr) for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { tabptr = &arp_table[i]; - if (tabptr->ipaddr[0] == 0 && tabptr->ipaddr[1] == 0) + if (tabptr->ipaddr == 0) { break; } @@ -201,8 +207,8 @@ static void uip_arp_update(uint16 *pipaddr, struct uip_eth_addr *ethaddr) * information. */ - memcpy(tabptr->ipaddr, pipaddr, 4); - memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + tabptr->ipaddr = pipaddr; + memcpy(tabptr->ethaddr.addr, ethaddr->addr, IFHWADDRLEN); tabptr->time = arptime; } @@ -225,15 +231,11 @@ void uip_arp_ipin(void) /* Only insert/update an entry if the source IP address of the incoming IP packet comes from a host on the local network. */ - if ((IPBUF->srcipaddr[0] & uip_netmask[0]) != (uip_hostaddr[0] & uip_netmask[0])) + if ((IPBUF->srcipaddr & dev->d_netmask) != (dev->d_ipaddr & dev->d_netmask)) { return; } - if ((IPBUF->srcipaddr[1] & uip_netmask[1]) != (uip_hostaddr[1] & uip_netmask[1])) - { - return; - } uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src)); } #endif /* 0 */ @@ -273,7 +275,7 @@ void uip_arp_arpin(struct uip_driver_s *dev) case HTONS(ARP_REQUEST): /* ARP request. If it asked for our address, we send out a reply. */ - if (uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) + if (uip_ipaddr_cmp(BUF->dipaddr, dev->d_ipaddr)) { /* First, we register the one who made the request in our ARP * table, since it is likely that we will do more communication @@ -286,15 +288,13 @@ void uip_arp_arpin(struct uip_driver_s *dev) BUF->opcode = HTONS(2); - memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6); - memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); - memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); - memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6); + memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, IFHWADDRLEN); + memcpy(BUF->shwaddr.addr, dev->d_mac.addr, IFHWADDRLEN); + memcpy(BUF->ethhdr.src.addr, dev->d_mac.addr, IFHWADDRLEN); + memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, IFHWADDRLEN); - BUF->dipaddr[0] = BUF->sipaddr[0]; - BUF->dipaddr[1] = BUF->sipaddr[1]; - BUF->sipaddr[0] = uip_hostaddr[0]; - BUF->sipaddr[1] = uip_hostaddr[1]; + BUF->dipaddr = BUF->sipaddr; + BUF->sipaddr = dev->d_ipaddr; BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); dev->d_len = sizeof(struct arp_hdr); @@ -306,7 +306,7 @@ void uip_arp_arpin(struct uip_driver_s *dev) * for us. */ - if (uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) + if (uip_ipaddr_cmp(BUF->dipaddr, dev->d_ipaddr)) { uip_arp_update(BUF->sipaddr, &BUF->shwaddr); } @@ -354,20 +354,20 @@ void uip_arp_out(struct uip_driver_s *dev) if (uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr)) { - memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6); + memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, IFHWADDRLEN); } else { /* Check if the destination address is on the local network. */ - if (!uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask)) + if (!uip_ipaddr_maskcmp(IPBUF->destipaddr, dev->d_ipaddr, dev->d_netmask)) { /* Destination address was not on the local network, so we need to * use the default router's IP address instead of the destination * address when determining the MAC address. */ - uip_ipaddr_copy(ipaddr, uip_draddr); + uip_ipaddr_copy(ipaddr, dev->d_draddr); } else { @@ -391,17 +391,17 @@ void uip_arp_out(struct uip_driver_s *dev) * overwrite the IP packet with an ARP request. */ - memset(BUF->ethhdr.dest.addr, 0xff, 6); - memset(BUF->dhwaddr.addr, 0x00, 6); - memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); - memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); + memset(BUF->ethhdr.dest.addr, 0xff, IFHWADDRLEN); + memset(BUF->dhwaddr.addr, 0x00, IFHWADDRLEN); + memcpy(BUF->ethhdr.src.addr, dev->d_mac.addr, IFHWADDRLEN); + memcpy(BUF->shwaddr.addr, dev->d_mac.addr, IFHWADDRLEN); uip_ipaddr_copy(BUF->dipaddr, ipaddr); - uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr); + uip_ipaddr_copy(BUF->sipaddr, dev->d_ipaddr); BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */ BUF->hwtype = HTONS(ARP_HWTYPE_ETH); BUF->protocol = HTONS(UIP_ETHTYPE_IP); - BUF->hwlen = 6; + BUF->hwlen = IFHWADDRLEN; BUF->protolen = 4; BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); @@ -413,9 +413,9 @@ void uip_arp_out(struct uip_driver_s *dev) /* Build an ethernet header. */ - memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6); + memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, IFHWADDRLEN); } - memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(IPBUF->ethhdr.src.addr, dev->d_mac.addr, IFHWADDRLEN); IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP); |