Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

arp.h File Reference

#include "lwip/pbuf.h"
#include "lwip/ip_addr.h"
#include "lwip/netif.h"

Include dependency graph for arp.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  eth_addr
struct  eth_hdr

Defines

#define ARP_TMR_INTERVAL   10000
#define ETHTYPE_ARP   0x0806
#define ETHTYPE_IP   0x0800

Functions

void string2mac (struct eth_addr *mac, char *name)
void mac2string (struct eth_addr *mac, char *name)
void arp_init (void)
void arp_tmr (void)
void arp_ip_input (struct netif *netif, struct pbuf *p)
pbufarp_arp_input (struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
eth_addrarp_lookup (struct ip_addr *ipaddr)
pbufarp_query (struct netif *netif, struct eth_addr *ethaddr, struct ip_addr *ipaddr)

Variables

eth_addr PACK_STRUCT_STRUCT


Define Documentation

#define ARP_TMR_INTERVAL   10000
 

Definition at line 62 of file arp.h.

Referenced by rt_3c905cif_init(), rt_3com905cif_etharp_timer(), rt_rtl8139_ifetharp_timer(), and rt_rtl8139if_init().

#define ETHTYPE_ARP   0x0806
 

Definition at line 64 of file arp.h.

Referenced by arp_arp_input(), arp_query(), etharp_arp_input(), etharp_query(), rt_3c905cif_input(), and rt_rtl8139if_input().

#define ETHTYPE_IP   0x0800
 

Definition at line 65 of file arp.h.

Referenced by arp_arp_input(), arp_query(), etharp_arp_input(), etharp_output(), etharp_query(), rt_3c905cif_input(), rt_rtl8139if_input(), and update_arp_entry().


Function Documentation

struct pbuf* arp_arp_input struct netif netif,
struct eth_addr ethaddr,
struct pbuf p
 

Definition at line 257 of file arp.c.

References add_arp_entry(), ARP_REPLY, ARP_REQUEST, ARPH_HWLEN_SET, ARPH_PROTOLEN_SET, ETHTYPE_ARP, ETHTYPE_IP, htons, HWTYPE_ETHERNET, netif::ip_addr, ip_addr_cmp, ip_addr_set, NULL, pbuf::payload, pbuf_free(), pbuf::tot_len, and u8_t.

00258 {
00259   struct arp_hdr *hdr;
00260   u8_t i;
00261   
00262   if(p->tot_len < sizeof(struct arp_hdr)) {
00263 
00264     pbuf_free(p);
00265     return NULL;
00266   }
00267 
00268   hdr = p->payload;
00269   
00270   switch(htons(hdr->opcode)) {
00271   case ARP_REQUEST:
00272     /* ARP request. If it asked for our address, we send out a
00273        reply. */
00274 
00275     if(ip_addr_cmp(&(hdr->dipaddr), &(netif->ip_addr))) {
00276       hdr->opcode = htons(ARP_REPLY);
00277 
00278       ip_addr_set(&(hdr->dipaddr), &(hdr->sipaddr));
00279       ip_addr_set(&(hdr->sipaddr), &(netif->ip_addr));
00280 
00281       for(i = 0; i < 6; ++i) {
00282         hdr->dhwaddr.addr[i] = hdr->shwaddr.addr[i];
00283         hdr->shwaddr.addr[i] = ethaddr->addr[i];
00284         hdr->ethhdr.dest.addr[i] = hdr->dhwaddr.addr[i];
00285         hdr->ethhdr.src.addr[i] = ethaddr->addr[i];
00286       }
00287 
00288       hdr->hwtype = htons(HWTYPE_ETHERNET);
00289       ARPH_HWLEN_SET(hdr, 6);
00290       
00291       hdr->proto = htons(ETHTYPE_IP);
00292       ARPH_PROTOLEN_SET(hdr, sizeof(struct ip_addr));      
00293       
00294       hdr->ethhdr.type = htons(ETHTYPE_ARP);      
00295       return p;
00296     }
00297     break;
00298   case ARP_REPLY:    
00299     /* ARP reply. We insert or update the ARP table. */
00300 
00301     if(ip_addr_cmp(&(hdr->dipaddr), &(netif->ip_addr))) {
00302       add_arp_entry(&(hdr->sipaddr), &(hdr->shwaddr));
00303 #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
00304       dhcp_arp_reply(&hdr->sipaddr);
00305 #endif      
00306     }
00307     break;
00308   default:
00309 
00310     break;
00311   }
00312 
00313   pbuf_free(p);
00314   return NULL;
00315 }

Here is the call graph for this function:

void arp_init void   ) 
 

Definition at line 155 of file arp.c.

References arp_table, IP_ADDR_ANY, ip_addr_set, ipaddr, and u8_t.

00156 {
00157   u8_t i;
00158   
00159   for(i = 0; i < ARP_TABLE_SIZE; ++i) {
00160     ip_addr_set(&(arp_table[i].ipaddr),
00161                 IP_ADDR_ANY);
00162   }
00163 }

void arp_ip_input struct netif netif,
struct pbuf p
 

Definition at line 242 of file arp.c.

References add_arp_entry(), netif::ip_addr, ip_addr_maskcmp, netif::netmask, and pbuf::payload.

00243 {
00244   struct ethip_hdr *hdr;
00245   
00246   hdr = p->payload;
00247   
00248   /* Only insert/update an entry if the source IP address of the
00249      incoming IP packet comes from a host on the local network. */
00250   if(!ip_addr_maskcmp(&(hdr->ip.src), &(netif->ip_addr), &(netif->netmask))) {
00251     return;
00252   }
00253   add_arp_entry(&(hdr->ip.src), &(hdr->eth.src));
00254 }

Here is the call graph for this function:

struct eth_addr* arp_lookup struct ip_addr ipaddr  ) 
 

Definition at line 318 of file arp.c.

References arp_table, arp_entry::ethaddr, ip_addr_cmp, ipaddr, NULL, and u8_t.

00319 {
00320   u8_t i;
00321   
00322   for(i = 0; i < ARP_TABLE_SIZE; ++i) {
00323     if(ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
00324       return &arp_table[i].ethaddr;
00325     }
00326   }
00327   return NULL;  
00328 }

struct pbuf* arp_query struct netif netif,
struct eth_addr ethaddr,
struct ip_addr ipaddr
 

Definition at line 331 of file arp.c.

References ARP_REQUEST, ARPH_HWLEN_SET, ARPH_PROTOLEN_SET, ETHTYPE_ARP, ETHTYPE_IP, htons, HWTYPE_ETHERNET, netif::ip_addr, ip_addr_set, ipaddr, NULL, pbuf_alloc(), PBUF_LINK, PBUF_RAM, and u8_t.

00332 {
00333   struct arp_hdr *hdr;
00334   struct pbuf *p;
00335   u8_t i;
00336 
00337   p = pbuf_alloc(PBUF_LINK, sizeof(struct arp_hdr), PBUF_RAM);
00338   if(p == NULL) {
00339     return NULL;
00340   }
00341 
00342   hdr = p->payload;
00343   
00344   hdr->opcode = htons(ARP_REQUEST);
00345 
00346   for(i = 0; i < 6; ++i) {
00347     hdr->dhwaddr.addr[i] = 0x00;
00348     hdr->shwaddr.addr[i] = ethaddr->addr[i];
00349   }
00350   
00351   ip_addr_set(&(hdr->dipaddr), ipaddr);
00352   ip_addr_set(&(hdr->sipaddr), &(netif->ip_addr));
00353 
00354   hdr->hwtype = htons(HWTYPE_ETHERNET);
00355   ARPH_HWLEN_SET(hdr, 6);
00356 
00357   hdr->proto = htons(ETHTYPE_IP);
00358   ARPH_PROTOLEN_SET(hdr, sizeof(struct ip_addr));
00359 
00360   for(i = 0; i < 6; ++i) {
00361     hdr->ethhdr.dest.addr[i] = 0xff;
00362     hdr->ethhdr.src.addr[i] = ethaddr->addr[i];
00363   }
00364   
00365   hdr->ethhdr.type = htons(ETHTYPE_ARP);      
00366   return p;
00367 }

Here is the call graph for this function:

void arp_tmr void   ) 
 

Definition at line 166 of file arp.c.

References ARP_MAXAGE, arp_table, ctime, arp_entry::ctime, IP_ADDR_ANY, ip_addr_isany, ip_addr_set, ipaddr, and u8_t.

00167 {
00168   u8_t i;
00169   
00170   ++ctime;
00171   for(i = 0; i < ARP_TABLE_SIZE; ++i) {
00172     if(!ip_addr_isany(&arp_table[i].ipaddr) &&       
00173        ctime - arp_table[i].ctime >= ARP_MAXAGE) {
00174       ip_addr_set(&(arp_table[i].ipaddr),
00175                   IP_ADDR_ANY);
00176     }
00177   }  
00178 }

void mac2string struct eth_addr mac,
char *  name
 

Definition at line 138 of file arp.c.

References get_char_from_u8_t(), name, and u8_t.

00138                                                  {
00139   int i,hop=0;
00140   u8_t aux;
00141 
00142   for(i=0; i<5; i++){
00143     aux = mac->addr[i];
00144     name[hop] = get_char_from_u8_t((aux & 0xf0)>>4);
00145     name[hop+1] = get_char_from_u8_t((aux & 0x0f));
00146     name[hop+2] = 0x3a; //0x3a is the code ascii (in hex) for ':'
00147     hop+=3;
00148   }
00149   name[hop] = get_char_from_u8_t((mac->addr[5] & 0xf0)>>4);
00150   name[hop+1] = get_char_from_u8_t((mac->addr[5] & 0x0f));
00151 }

Here is the call graph for this function:

void string2mac struct eth_addr mac,
char *  name
 

Definition at line 128 of file arp.c.

References get_u8_t_from_char(), and name.

00128                                                  {
00129   int i,hop=0;
00130 
00131   for(i=0; i<6; i++){
00132     mac->addr[i] = get_u8_t_from_char(name[hop],0) + get_u8_t_from_char(name[hop+1],1);
00133     hop+=3;
00134   }
00135 }

Here is the call graph for this function:


Variable Documentation

struct eth_hdr PACK_STRUCT_STRUCT
 


Generated on Wed Jan 14 12:59:01 2004 for RTL-lwIP-0.4 by doxygen 1.3.4