VirtualBox

Changeset 36901 in vbox for trunk/src


Ignore:
Timestamp:
Apr 29, 2011 6:03:48 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71480
Message:

NAT: Each service should use right ethernet address (see xTracker/5664)

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h

    r28181 r36901  
    10431043#define PACKET_TAG_CARP                         28 /* CARP info */
    10441044#ifdef VBOX
    1045 #define PACKET_TAG_ALIAS                        0xab01
    1046 #define PACKET_TAG_ETHER                        0xab02
     1045# define        PACKET_TAG_ALIAS                        0xab01
     1046# define        PACKET_TAG_ETHER                        0xab02
     1047# define        PACKET_SERVICE                          0xab03
    10471048#endif
    10481049
  • trunk/src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c

    r34103 r36901  
    133133            return;
    134134        }
    135         m = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
     135        m = slirpDnsMbufAlloc(pData);
    136136        if (m == NULL)
    137137        {
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r36410 r36901  
    14351435                    case CTL_DNS:
    14361436                    case CTL_ALIAS:
     1437                    case CTL_TFTP:
     1438                        if (!slirpMbufTagService(pData, mr, (uint8_t)(htip & ~pData->netmask)))
     1439                        {
     1440                            static bool fTagErrorReported;
     1441                            if (!fTagErrorReported)
     1442                            {
     1443                                LogRel(("NAT: couldn't add the tag(PACKET_SERVICE:%d) to mbuf:%p\n",
     1444                                            (uint8_t)(htip & ~pData->netmask), m));
     1445                                fTagErrorReported = true;
     1446                            }
     1447                        }
    14371448                        rah->ar_sha[5] = (uint8_t)(htip & ~pData->netmask);
    14381449                        break;
     
    15591570    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) != 0)
    15601571    {
     1572        struct m_tag *t = m_tag_first(m);
     1573        uint8_t u8ServiceId = CTL_ALIAS;
    15611574        memcpy(eh->h_dest, eh->h_source, ETH_ALEN);
    15621575        memcpy(eh->h_source, special_ethaddr, ETH_ALEN);
     
    15681581            goto done;
    15691582        }
     1583        if (   t
     1584            && (t = m_tag_find(m, PACKET_SERVICE, NULL)))
     1585        {
     1586            Assert(t);
     1587            u8ServiceId = *(uint8_t *)&t[1];
     1588        }
     1589        eh->h_source[5] = u8ServiceId;
    15701590    }
    15711591    /*
  • trunk/src/VBox/Devices/Network/slirp/slirp.h

    r36353 r36901  
    473473        return 0;
    474474}
    475 #endif
    476 
     475
     476static inline bool slirpMbufTagService(PNATState pData, struct mbuf *m, uint8_t u8ServiceId)
     477{
     478    struct m_tag * t = NULL;
     479    /* if_encap assumes that all packets goes through aliased address(gw) */
     480    if (u8ServiceId == CTL_ALIAS)
     481        return true;
     482    t = m_tag_get(PACKET_SERVICE, sizeof(uint8_t), 0);
     483    if (!t)
     484        return false;
     485    *(uint8_t *)&t[1] = u8ServiceId;
     486    m_tag_prepend(m, t);
     487    return true;
     488}
     489
     490/**
     491 * This function tags mbuf allocated for special services.
     492 * @todo: add service id verification.
     493 */
     494static inline struct mbuf *slirpServiceMbufAlloc(PNATState pData, uint8_t u8ServiceId)
     495{
     496    struct mbuf *m = NULL;
     497    m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
     498    if (!m)
     499        return m;
     500    if(!slirpMbufTagService(pData, m, u8ServiceId))
     501    {
     502        m_freem(pData, m);
     503        return NULL;
     504    }
     505    return m;
     506}
     507
     508static inline struct mbuf *slirpTftpMbufAlloc(PNATState pData)
     509{
     510    return slirpServiceMbufAlloc(pData, CTL_TFTP);
     511}
     512static inline struct mbuf *slirpDnsMbufAlloc(PNATState pData)
     513{
     514    return slirpServiceMbufAlloc(pData, CTL_DNS);
     515}
     516#endif
     517
  • trunk/src/VBox/Devices/Network/slirp/tftp.c

    r30363 r36901  
    145145    int n = 0;
    146146
    147     m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
     147    m = slirpTftpMbufAlloc(pData);
    148148    if (!m)
    149149        return -1;
     
    181181    int nobytes;
    182182
    183     m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
     183    m = slirpTftpMbufAlloc(pData);
    184184    if (!m)
    185185        return -1;
     
    229229        return -1;
    230230
    231     m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
     231    m = slirpTftpMbufAlloc(pData);
    232232    if (!m)
    233233        return -1;
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r35924 r36901  
    189189        dst.sin_port = uh->uh_sport;
    190190
     191        slirpMbufTagService(pData, m, CTL_DNS);
    191192        /* udp_output2() expects a pointer to the body of UDP packet. */
    192193        m->m_data += sizeof(struct udpiphdr);
Note: See TracChangeset for help on using the changeset viewer.

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