diff options
Diffstat (limited to 'firmware/zpu/lib')
| -rw-r--r-- | firmware/zpu/lib/eth_addrs.c | 132 | ||||
| -rw-r--r-- | firmware/zpu/lib/ethernet.h | 21 | ||||
| -rw-r--r-- | firmware/zpu/lib/net_common.c | 28 | ||||
| -rw-r--r-- | firmware/zpu/lib/net_common.h | 5 | 
4 files changed, 90 insertions, 96 deletions
| diff --git a/firmware/zpu/lib/eth_addrs.c b/firmware/zpu/lib/eth_addrs.c index c45ce7559..6d3347cf3 100644 --- a/firmware/zpu/lib/eth_addrs.c +++ b/firmware/zpu/lib/eth_addrs.c @@ -1,5 +1,5 @@  /* - * Copyright 2010-2011 Ettus Research LLC + * Copyright 2010-2012 Ettus Research LLC   * Copyright 2007 Free Software Foundation, Inc.   *   * This program is free software: you can redistribute it and/or modify @@ -20,6 +20,7 @@  #include "memory_map.h"  #include "nonstdio.h"  #include <stdbool.h> +#include <string.h>  #include "i2c.h"  #include "usrp2/fw_common.h" @@ -37,104 +38,69 @@ unprogrammed(const void *t, size_t len)    return all_ones | all_zeros;  } -//////////////////// MAC Addr Stuff /////////////////////// +typedef struct{ +    eth_mac_addr_t mac_addr; +    struct ip_addr ip_addr; +    struct ip_addr gateway; +    struct ip_addr subnet; +} eth_addrs_t; -static bool src_mac_addr_initialized = false; +static bool eth_addrs_initialized = false; -static const eth_mac_addr_t default_mac_addr = {{ -    0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff -  }}; +static const eth_addrs_t default_eth_addrs = { +    .mac_addr = {{0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff}}, +    .ip_addr = {(192 << 24 | 168 << 16 | 10  << 8  | 2 << 0)}, +    .gateway = {(192 << 24 | 168 << 16 | 10  << 8  | 1 << 0)}, +    .subnet  = {(255 << 24 | 255 << 16 | 255 << 8  | 0 << 0)}, +}; -static eth_mac_addr_t src_mac_addr = {{ -    0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff -  }}; -   -void set_default_mac_addr(void) -{ -    src_mac_addr_initialized = true; -    src_mac_addr = default_mac_addr; -} +static eth_addrs_t current_eth_addrs; -const eth_mac_addr_t * -ethernet_mac_addr(void) -{ -  if (!src_mac_addr_initialized){    // fetch from eeprom -    src_mac_addr_initialized = true; +static void eth_addrs_init(void){ +    if (eth_addrs_initialized) return; +    eth_addrs_initialized = true; -    // if we're simulating, don't read the EEPROM model, it's REALLY slow -    if (hwconfig_simulation_p()) -      return &src_mac_addr; - -    eth_mac_addr_t tmp; -    bool ok = eeprom_read(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_MAC_ADDR, &tmp, sizeof(tmp)); -    if (!ok || unprogrammed(&tmp, sizeof(tmp))){ -      // use the default +    #define eth_addrs_init_x(addr, x){ \ +        const bool ok = eeprom_read(USRP2_I2C_ADDR_MBOARD, addr, ¤t_eth_addrs.x, sizeof(current_eth_addrs.x)); \ +        if (!ok || unprogrammed(¤t_eth_addrs.x, sizeof(current_eth_addrs.x))){ \ +            memcpy(¤t_eth_addrs.x, &default_eth_addrs.x, sizeof(current_eth_addrs.x)); \ +        } \      } -    else -      src_mac_addr = tmp; -  } -  return &src_mac_addr; -} +    eth_addrs_init_x(USRP2_EE_MBOARD_MAC_ADDR, mac_addr); +    eth_addrs_init_x(USRP2_EE_MBOARD_IP_ADDR,  ip_addr); +    eth_addrs_init_x(USRP2_EE_MBOARD_GATEWAY,  gateway); +    eth_addrs_init_x(USRP2_EE_MBOARD_SUBNET,   subnet); -bool -ethernet_set_mac_addr(const eth_mac_addr_t *t) -{ -  bool ok = eeprom_write(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_MAC_ADDR, t, sizeof(eth_mac_addr_t)); -  if (ok){ -    src_mac_addr = *t; -    src_mac_addr_initialized = true; -    //eth_mac_set_addr(t); //this breaks the link -  } - -  return ok;  } -//////////////////// IP Addr Stuff /////////////////////// - -static bool src_ip_addr_initialized = false; - -static const struct ip_addr default_ip_addr = { -    (192 << 24 | 168 << 16 | 10 << 8 | 2 << 0) -}; - -static struct ip_addr src_ip_addr = { -    (192 << 24 | 168 << 16 | 10 << 8 | 2 << 0) -}; - -void set_default_ip_addr(void) -{ -    src_ip_addr_initialized = true; -    src_ip_addr = default_ip_addr; +const eth_mac_addr_t *ethernet_mac_addr(void){ +    eth_addrs_init(); +    return ¤t_eth_addrs.mac_addr;  } -const struct ip_addr *get_ip_addr(void) -{ -  if (!src_ip_addr_initialized){    // fetch from eeprom -    src_ip_addr_initialized = true; - -    // if we're simulating, don't read the EEPROM model, it's REALLY slow -    if (hwconfig_simulation_p()) -      return &src_ip_addr; +const struct ip_addr *get_ip_addr(void){ +    eth_addrs_init(); +    return ¤t_eth_addrs.ip_addr; +} -    struct ip_addr tmp; -    bool ok = eeprom_read(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_IP_ADDR, &tmp, sizeof(tmp)); -    if (!ok || unprogrammed(&tmp, sizeof(tmp))){ -      // use the default -    } -    else -      src_ip_addr = tmp; -  } +const struct ip_addr *get_subnet(void){ +    eth_addrs_init(); +    return ¤t_eth_addrs.subnet; +} -  return &src_ip_addr; +const struct ip_addr *get_gateway(void){ +    eth_addrs_init(); +    return ¤t_eth_addrs.gateway;  }  bool set_ip_addr(const struct ip_addr *t){ -  bool ok = eeprom_write(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_IP_ADDR, t, sizeof(struct ip_addr)); -  if (ok){ -    src_ip_addr = *t; -    src_ip_addr_initialized = true; -  } +    const bool ok = eeprom_write(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_IP_ADDR, t, sizeof(struct ip_addr)); +    if (ok) current_eth_addrs.ip_addr = *t; +    return ok; +} -  return ok; +void eth_addrs_set_default(void){ +    eth_addrs_initialized = true; +    memcpy(¤t_eth_addrs, &default_eth_addrs, sizeof(default_eth_addrs));  } diff --git a/firmware/zpu/lib/ethernet.h b/firmware/zpu/lib/ethernet.h index 52b297349..b5b08cb8c 100644 --- a/firmware/zpu/lib/ethernet.h +++ b/firmware/zpu/lib/ethernet.h @@ -1,5 +1,5 @@ -/* -*- c -*- */  /* + * Copyright 2010-2012 Ettus Research LLC   * Copyright 2007 Free Software Foundation, Inc.   *   * This program is free software: you can redistribute it and/or modify @@ -44,27 +44,28 @@ void ethernet_register_link_changed_callback(ethernet_link_changed_callback_t cb   */  const eth_mac_addr_t *ethernet_mac_addr(void); -/*!set mac addr to default*/ -void set_default_mac_addr(void); -  /*! - * \brief write mac address to eeprom and begin using it + * \returns IP address   */ -bool ethernet_set_mac_addr(const eth_mac_addr_t *t); +const struct ip_addr *get_ip_addr(void);  /*! - * \returns IP address + * \returns gateway address   */ -const struct ip_addr *get_ip_addr(void); +const struct ip_addr *get_gateway(void); -/*!set ip addr to default*/ -void set_default_ip_addr(void); +/*! + * \returns subnet address + */ +const struct ip_addr *get_subnet(void);  /*!   * \brief write ip address to eeprom and begin using it   */  bool set_ip_addr(const struct ip_addr *t); +//! Apply default settings to eth addrs +void eth_addrs_set_default(void);  /*   * \brief read RMON regs and return error mask diff --git a/firmware/zpu/lib/net_common.c b/firmware/zpu/lib/net_common.c index 42e365393..9b75006d3 100644 --- a/firmware/zpu/lib/net_common.c +++ b/firmware/zpu/lib/net_common.c @@ -1,5 +1,5 @@  /* - * Copyright 2009-2011 Ettus Research LLC + * Copyright 2009-2012 Ettus Research LLC   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -374,6 +374,22 @@ send_arp_reply(struct arp_eth_ipv4 *req, eth_mac_addr_t our_mac)    send_pkt(t, ETHERTYPE_ARP, &reply, sizeof(reply), 0, 0, 0, 0);  } +void net_common_send_arp_request(const struct ip_addr *addr){ +    struct arp_eth_ipv4 req _AL4; +    req.ar_hrd = ARPHRD_ETHER; +    req.ar_pro = ETHERTYPE_IPV4; +    req.ar_hln = sizeof(eth_mac_addr_t); +    req.ar_pln = sizeof(struct ip_addr); +    req.ar_op = ARPOP_REQUEST; +    memcpy(req.ar_sha, ethernet_mac_addr(), sizeof(eth_mac_addr_t)); +    memcpy(req.ar_sip, get_ip_addr(), sizeof(struct ip_addr)); +    memset(req.ar_tha, 0x00, sizeof(eth_mac_addr_t)); +    memcpy(req.ar_tip, addr, sizeof(struct ip_addr)); + +    //send the request with a broadcast ethernet mac address +    send_pkt(BCAST_MAC_ADDR, ETHERTYPE_ARP, &req, sizeof(req), 0, 0, 0, 0); +} +  void send_gratuitous_arp(void){    struct arp_eth_ipv4 req _AL4;    req.ar_hrd = ARPHRD_ETHER; @@ -415,7 +431,15 @@ handle_arp_packet(struct arp_eth_ipv4 *p, size_t size)        || p->ar_hln != 6        || p->ar_pln != 4)      return; -   + +  if (p->ar_op == ARPOP_REPLY){ +    struct ip_addr ip_addr; +    memcpy(&ip_addr, p->ar_sip, sizeof(ip_addr)); +    eth_mac_addr_t mac_addr; +    memcpy(&mac_addr, p->ar_sha, sizeof(mac_addr)); +    arp_cache_update(&ip_addr, &mac_addr); +  } +    if (p->ar_op != ARPOP_REQUEST)      return; diff --git a/firmware/zpu/lib/net_common.h b/firmware/zpu/lib/net_common.h index 3cbc5c514..5e6daf689 100644 --- a/firmware/zpu/lib/net_common.h +++ b/firmware/zpu/lib/net_common.h @@ -1,5 +1,5 @@  /* - * Copyright 2009-2011 Ettus Research LLC + * Copyright 2009-2012 Ettus Research LLC   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -55,4 +55,7 @@ void handle_eth_packet(uint32_t *p, size_t nlines);  void send_gratuitous_arp(void); +//! Send an ARP request for the given IP address +void net_common_send_arp_request(const struct ip_addr *addr); +  #endif /* INCLUDED_NET_COMMON_H */ | 
