VirtualBox

Changeset 15768 in vbox


Ignore:
Timestamp:
Dec 29, 2008 8:16:06 AM (16 years ago)
Author:
vboxsync
Message:

slirp: if_encap is place to call slirp_output. removing duplcates in ARP and IP
protocol hanling

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

Legend:

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

    r15765 r15768  
    225225
    226226        /* Encapsulate the packet for sending */
    227         if_encap(pData, (const uint8_t *)ifm->m_data, ifm->m_len);
     227        if_encap(pData, ETH_P_IP, (const uint8_t *)ifm->m_data, ifm->m_len);
    228228
    229229        m_free(pData, ifm);
  • trunk/src/VBox/Devices/Network/slirp/if.h

    r14964 r15768  
    3030#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm))
    3131
     32#ifdef ETH_P_ARP
     33# undef ETH_P_ARP
     34#endif /* ETH_P_ARP*/
     35#define ETH_P_ARP       0x0806          /* Address Resolution packet    */
     36
     37#ifdef ETH_P_IP
     38# undef ETH_P_IP
     39#endif /* ETH_P_IP */
     40#define ETH_P_IP        0x0800          /* Internet Protocol packet     */
     41
    3242#endif
  • trunk/src/VBox/Devices/Network/slirp/main.h

    r14964 r15768  
    1010#endif
    1111
    12 void if_encap(PNATState pData, const uint8_t *ip_data, int ip_data_len);
     12void if_encap(PNATState pData, uint16_t eth_proto, const uint8_t *ip_data, int ip_data_len);
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r15765 r15768  
    932932#define ETH_HLEN        14
    933933
    934 #define ETH_P_IP        0x0800          /* Internet Protocol packet     */
    935 #define ETH_P_ARP       0x0806          /* Address Resolution packet    */
    936 
    937934#define ARPOP_REQUEST   1               /* ARP request                  */
    938935#define ARPOP_REPLY     2               /* ARP reply                    */
     
    963960
    964961static
    965 void arp_input(PNATState pData, const uint8_t *pkt, int pkt_len)
    966 {
    967     struct ethhdr *eh = (struct ethhdr *)pkt;
    968     struct arphdr *ah = (struct arphdr *)(pkt + ETH_HLEN);
    969 #ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC
    970     size_t arp_reply_size = ETH_HLEN + sizeof(struct arphdr);
    971     uint8_t *arp_reply = malloc(arp_reply_size); /*XXX: temporal solution, here should be mbuf used*/
    972 #else
    973     uint8_t arp_reply[ETH_HLEN + sizeof(struct arphdr)];
    974 #endif
    975     struct ethhdr *reh = (struct ethhdr *)arp_reply;
    976     struct arphdr *rah = (struct arphdr *)(arp_reply + ETH_HLEN);
     962void arp_input(PNATState pData, struct mbuf *m)
     963{
     964    struct ethhdr *eh = mtod(m, struct ethhdr *);
     965    struct arphdr *ah = (struct arphdr *)&eh[1];
     966    uint8_t arp_reply[sizeof(struct arphdr)];
     967    struct arphdr *rah;
    977968    int ar_op;
    978969    struct ex_list *ex_ptr;
    979970    uint32_t htip = ntohl(*(uint32_t*)ah->ar_tip);
     971
     972    rah = (struct arphdr *)arp_reply;
    980973
    981974    ar_op = ntohs(ah->ar_op);
     
    995988                return;
    996989        arp_ok:
    997                 /* XXX: make an ARP request to have the client address */
    998                 memcpy(client_ethaddr, eh->h_source, ETH_ALEN);
    999 
    1000                 /* ARP request for alias/dns mac address */
    1001                 memcpy(reh->h_dest, pkt + ETH_ALEN, ETH_ALEN);
    1002                 memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 1);
    1003                 reh->h_source[5] = ah->ar_tip[3];
    1004                 reh->h_proto = htons(ETH_P_ARP);
    1005990
    1006991                rah->ar_hrd = htons(1);
     
    1009994                rah->ar_pln = 4;
    1010995                rah->ar_op = htons(ARPOP_REPLY);
    1011                 memcpy(rah->ar_sha, reh->h_source, ETH_ALEN);
     996                memcpy(rah->ar_sha, special_ethaddr, ETH_ALEN);
     997                switch (htip & ~pData->netmask)
     998                {
     999                    case CTL_DNS:
     1000                    case CTL_ALIAS:
     1001                        rah->ar_sha[5] = (uint8_t)(htip & ~pData->netmask);
     1002                        break;
     1003                    default:;
     1004                }
     1005               
    10121006                memcpy(rah->ar_sip, ah->ar_tip, 4);
    10131007                memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
    10141008                memcpy(rah->ar_tip, ah->ar_sip, 4);
    10151009#ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC
    1016                 slirp_output(pData->pvUser, arp_reply, arp_reply_size);
     1010                if_encap(pData, ETH_P_ARP, arp_reply, sizeof(struct arphdr));
     1011                m_free(pData, m);
    10171012#else
    10181013                slirp_output(pData->pvUser, arp_reply, sizeof(arp_reply));
     
    10301025    int proto;
    10311026
    1032     if (pkt_len < ETH_HLEN)
     1027    if (pkt_len < ETH_HLEN)
     1028    {
     1029        LogRel(("packet having size %d has been ingnored\n", pkt_len));
    10331030        return;
     1031    }
     1032   
     1033    m = m_get(pData);
     1034    if (m == NULL)
     1035    {
     1036        LogRel(("can't allocate new mbuf\n"));
     1037    }
     1038    /* Note: we add to align the IP header */
     1039
     1040#if 0
     1041    m->m_data += 2 + ETH_HLEN;
     1042    m->m_len -= 2 + ETH_HLEN;
     1043#endif
    10341044
    10351045    proto = ntohs(*(uint16_t *)(pkt + 12));
     
    10371047    {
    10381048        case ETH_P_ARP:
    1039             arp_input(pData, pkt, pkt_len);
     1049            memcpy(m->m_data, pkt, pkt_len);
     1050            m->m_len = pkt_len;
     1051            arp_input(pData, m);
    10401052            break;
    10411053        case ETH_P_IP:
     
    10431055             * the first outgoing connection gets an incorrect timestamp. */
    10441056            updtime(pData);
    1045 
    1046             m = m_get(pData);
    1047             if (!m)
    1048                 return;
    1049             /* Note: we add to align the IP header */
    10501057            if (M_FREEROOM(m) < pkt_len + 2)
    10511058            {
    1052                 m_inc(m, pkt_len + 2);
     1059               m_inc(m, pkt_len + 2);
    10531060            }
    10541061            m->m_len = pkt_len + 2;
    10551062            memcpy(m->m_data + 2, pkt, pkt_len);
    1056 
    10571063            m->m_data += 2 + ETH_HLEN;
    10581064            m->m_len -= 2 + ETH_HLEN;
    1059 
    10601065            ip_input(pData, m);
    10611066            break;
     
    10661071
    10671072/* output the IP packet to the ethernet device */
    1068 void if_encap(PNATState pData, const uint8_t *ip_data, int ip_data_len)
     1073void if_encap(PNATState pData, uint16_t eth_proto, const uint8_t *ip_data, int ip_data_len)
    10691074{
    10701075#ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC
     
    10871092    /* XXX: not correct */
    10881093    eh->h_source[5] = CTL_ALIAS;
    1089     eh->h_proto = htons(ETH_P_IP);
     1094    eh->h_proto = htons(eth_proto);
    10901095    memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len);
    10911096    slirp_output(pData->pvUser, buf, ip_data_len + ETH_HLEN);
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