VirtualBox

Changeset 22500 in vbox


Ignore:
Timestamp:
Aug 27, 2009 9:44:23 AM (15 years ago)
Author:
vboxsync
Message:

NAT: replacing dhcp_cache update with arp_cache,
leasing dhcp updates arp_cache.

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/bootp.c

    r22494 r22500  
    4747    return NULL;
    4848}
    49 BOOTPClient *bc_alloc_client(PNATState pData)
     49static BOOTPClient *bc_alloc_client(PNATState pData)
    5050{
    5151    int i;
     
    428428               memcpy(bc->macaddr, bp->bp_hwaddr, bp->bp_hlen);
    429429               bc->addr.s_addr = bp->bp_ciaddr.s_addr;
     430               slirp_update_arp_cache(pData, bp->bp_ciaddr.s_addr, bp->bp_hwaddr);
    430431            }
    431432        }
     
    450451            memcpy(bc->macaddr, bp->bp_hwaddr, bp->bp_hlen);
    451452            bc->addr.s_addr = ui32;
     453            slirp_update_arp_cache(pData, bp->bp_ciaddr.s_addr, bp->bp_hwaddr);
    452454        break;
    453455        case NONE:
  • trunk/src/VBox/Devices/Network/slirp/bootp.h

    r22494 r22500  
    133133
    134134void bootp_input(PNATState, struct mbuf *m);
    135 BOOTPClient *bc_alloc_client(PNATState pData);
  • trunk/src/VBox/Devices/Network/slirp/ip_output.c

    r22478 r22500  
    4949{
    5050    int i;
     51    struct arp_cache_entry *ac = NULL;
    5152   /* @todo (vasily) to quick ramp up on routing rails
    5253    * we use information from DHCP server leasings, this
     
    5455    * and should be borrowed from other places
    5556    */
     57    LIST_FOREACH(ac, &pData->arp_cache, list)
     58    {
     59        if (ac->ip == dst)
     60            return &ac->ether[0];
     61    }
    5662    for (i = 0; i < NB_ADDR; i++)
    5763    {
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r22495 r22500  
    637637    ftp_alias_unload(pData);
    638638    nbt_alias_unload(pData);
    639     while(!LIST_EMPTY(&instancehead)) {
     639    while(!LIST_EMPTY(&instancehead))
     640    {
    640641        struct libalias *la = LIST_FIRST(&instancehead);
    641642        /* libalias do all clean up */
    642643        LibAliasUninit(la);
     644    }
     645    while(!LIST_EMPTY(&pData->arp_cache))
     646    {
     647        struct arp_cache_entry *ac = LIST_FIRST(&pData->arp_cache);
     648        LIST_REMOVE(ac, list);
     649        RTMemFree(ac);
    643650    }
    644651#ifdef RT_OS_WINDOWS
     
    13711378            break;
    13721379        case ARPOP_REPLY:
    1373         /* @todo check if we already have requested address */
    1374         /* if no*/
    1375         {
    1376             BOOTPClient *bc = bc_alloc_client(pData);
    1377             bc->addr.s_addr = *(uint32_t *)ah->ar_sip;
    1378             memcpy(bc->macaddr, ah->ar_sha, ETH_ALEN);
    1379             m_free(pData, m);
     1380        {
     1381            struct arp_cache_entry *ac = NULL;
     1382            if (slirp_update_arp_cache(pData, ah->ar_sip, ah->ar_sha) == 0)
     1383                break;
     1384            ac = RTMemAllocZ(sizeof(struct arp_cache_entry));
     1385            if (ac == NULL)
     1386            {
     1387                LogRel(("NAT: Can´t allocate arp cache entry\n"));
     1388                m_free(pData, m);
     1389                return;
     1390            }
     1391            ac->ip = *(uint32_t *)ah->ar_sip;
     1392            memcpy(ac->ether, ah->ar_sha, ETH_ALEN);
     1393            LIST_INSERT_HEAD(&pData->arp_cache, ac, list);
    13801394        }
    13811395        break;
     
    18251839    LogRel(("NAT: ARP request sent\n"));
    18261840}
     1841/* updates the arp cache
     1842 * @returns 0 - if has found and updated
     1843 *          1 - if hasn´t found.
     1844 */
     1845int slirp_update_arp_cache(PNATState pData, uint32_t dst, const uint8_t *mac)
     1846{
     1847    struct arp_cache_entry *ac;
     1848    LIST_FOREACH(ac, &pData->arp_cache, list)
     1849    {
     1850        if (memcmp(ac->ether, mac, ETH_ALEN) == 0)
     1851        {
     1852            ac->ip = dst;
     1853            return 0;
     1854        }
     1855    }
     1856    return 1;
     1857}
  • trunk/src/VBox/Devices/Network/slirp/slirp.h

    r22494 r22500  
    310310/*slirp.c*/
    311311void slirp_arp_who_has(PNATState pData, uint32_t dst);
     312int slirp_update_arp_cache(PNATState pData, uint32_t dst, const uint8_t *mac);
    312313#define MIN_MRU 128
    313314#define MAX_MRU 16384
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r22494 r22500  
    3838/** DHCP Lease time. */
    3939#define LEASE_TIME (24 * 3600)
     40
     41/*
     42 * ARP cache this is naive implementaion of ARP
     43 * cache of mapping 4 byte IPv4 address to 6 byte
     44 * ethernet one.
     45 */
     46struct arp_cache_entry
     47{
     48    uint32_t ip;
     49    uint8_t ether[6];
     50    LIST_ENTRY(arp_cache_entry) list;
     51};
     52LIST_HEAD(arp_cache_head, arp_cache_entry);
    4053
    4154/** TFTP session entry. */
     
    241254    struct port_forward_rule_list port_forward_rule_head;
    242255    int port_forwarding_activated;
     256    struct arp_cache_head arp_cache;
    243257    /*libalis modules' handlers*/
    244258    struct proto_handler *ftp_module;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette