Stefan Schuermans
do not store boradcast addresses in ARP table, store only local addresses, fix comparing with broadcast addr
Stefan Schuermans commited 9a81f6c at 2012-04-04 22:24:19
#include "arp.h"
#include "config.h"
#include "ethernet.h"
#include "ip.h"
#include "macros.h"
#include "nethelp.h"
// timing parameters
#define ARP_TICKS_MAX (150) /**< maximum age of ARP table entries
(in 200ms steps) */
#define ARP_NO_MAC_TICKS_MAX (50) /**< maximum age of ARP table entries
without MAC (in 200ms steps) */
#define ARP_RETRY_TICKS (8) /**< time after which to retry ARP query
(must be power of 2, in 200ms steps) */
/// ARP table
#define ARP_TAB_FLAG_IN_USE (1)
#define ARP_TAB_FLAG_MAC_OK (2)
struct arp_table
{
unsigned int flags; /// flags - see constants
unsigned int ticks; /// age of entry in 200ms steps
unsigned char mac[6];
unsigned char ip[4];
} arp_tab[16];
/**
* @brief send an ARP request
* @param[in] ip IP address to query MAC for
*/
static void arp_send_request(unsigned char ip[4])
{
struct arp_packet arp_request;
// build ARP request
arp_request.arp_hdr.hw_type = htons(0x0001); // ethernet
arp_request.arp_hdr.proto_type = htons(0x0800); // IP
arp_request.arp_hdr.hw_len = 0x06; // length of a MAC address
arp_request.arp_hdr.proto_len = 0x04; // length of an IP address
arp_request.arp_hdr.op = htons(0x0001); // ARP request
mac_cpy(arp_request.arp_hdr.src_mac, config_mac.mac); // own MAC
ip_cpy(arp_request.arp_hdr.src_ip, config_ip.ip); // own IP
mac_cpy(arp_request.arp_hdr.dest_mac,
"\xFF\xFF\xFF\xFF\xFF\xFF"); // broadcast MAC
ip_cpy(arp_request.arp_hdr.dest_ip, ip); // requested IP
// send ARP request
mac_cpy(arp_request.eth_hdr.dest, arp_request.arp_hdr.dest_mac);
arp_request.eth_hdr.type = htons(0x0806); // ethernet packet type: ARP
ethernet_send(&arp_request, sizeof(arp_request));
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX