VirtualBox

Ignore:
Timestamp:
Dec 8, 2011 5:55:10 AM (13 years ago)
Author:
vboxsync
Message:

NAT/service: registering port-forawarding from command line.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp

    r39498 r39557  
    7272*   Structures and Typedefs                                                    *
    7373*******************************************************************************/
     74static RTGETOPTDEF g_aGetOptDef[] =
     75{
     76    { "--pf",           'p',   RTGETOPT_REQ_STRING }
     77};
     78
     79typedef struct NATSEVICEPORTFORWARDRULE
     80{
     81    char            *pszPortForwardRuleName;
     82    struct in_addr  IpV4HostAddr;
     83    uint16_t        u16HostPort;
     84    struct in_addr  IpV4GuestAddr;
     85    uint16_t        u16GuestPort;
     86    bool            fUdp;
     87    char            *pszStrRaw;
     88} NATSEVICEPORTFORWARDRULE, *PNATSEVICEPORTFORWARDRULE;
    7489
    7590class VBoxNetNAT : public VBoxNetBaseService
     
    8095    void usage(void);
    8196    void run(void);
    82     void init(void);
     97    virtual int init(void);
     98    virtual int parseOpt(int rc, const RTGETOPTUNION& getOptVal);
    8399
    84100public:
     
    107123    volatile uint32_t       cPkt;
    108124    bool                    fIsRunning;
     125    std::vector<PNATSEVICEPORTFORWARDRULE> m_vecPortForwardRuleFromCmdLine;
    109126};
    110127
     
    155172    cPkt = 0;
    156173    cUrgPkt = 0;
     174    VBoxNetBaseService::init();
     175    for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i)
     176        m_vecOptionDefs.push_back(&g_aGetOptDef[i]);
    157177}
    158178
    159179VBoxNetNAT::~VBoxNetNAT() { }
    160 void VBoxNetNAT::init()
     180int VBoxNetNAT::init()
    161181{
    162182    int rc;
     
    174194    AssertReleaseRC(rc);
    175195
     196    /* Why ? */
    176197    slirp_set_ethaddr_and_activate_port_forwarding(m_pNATState, &m_MacAddress.au8[0], INADDR_ANY);
     198#if 0
     199    in_addr ipv4HostAddr;
     200    in_addr ipv4GuestAddr;
     201    ipv4GuestAddr.s_addr = RT_H2N_U32_C(RT_BSWAP_U32_C(RT_MAKE_U32_FROM_U8( 10,  0,  2,  15)));
     202    ipv4HostAddr.s_addr = INADDR_ANY;
     203    slirp_add_redirect(m_pNATState, false, ipv4HostAddr, 2022, ipv4GuestAddr , 22, NULL);
     204#endif
     205    std::vector<PNATSEVICEPORTFORWARDRULE>::iterator it;
     206    for (it = m_vecPortForwardRuleFromCmdLine.begin(); it != m_vecPortForwardRuleFromCmdLine.end(); ++it)
     207    {
     208        slirp_add_redirect(m_pNATState, (*it)->fUdp, (*it)->IpV4HostAddr, (*it)->u16HostPort, (*it)->IpV4GuestAddr , (*it)->u16GuestPort, NULL);
     209        RTStrFree((*it)->pszStrRaw);
     210        RTMemFree((*it));
     211    }
     212    m_vecPortForwardRuleFromCmdLine.clear();
    177213#ifndef RT_OS_WINDOWS
    178214    /*
     
    202238    rc = RTSemEventCreate(&m_EventUrgSend);
    203239    AssertReleaseRC(rc);
     240    return VINF_SUCCESS;
    204241}
    205242
     
    304341                                              RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
    305342                                              (PFNRT)SendWorker, 2, m, cbSegFrame);
     343                        natNotifyNATThread();
    306344                        AssertReleaseRC(rc);
    307345                    }
     
    326364}
    327365
     366int VBoxNetNAT::parseOpt(int rc, const RTGETOPTUNION& Val)
     367{
     368    switch (rc)
     369    {
     370        case 'p':
     371        {
     372#define ITERATE_TO_NEXT_TERM(ch, pRule, strRaw)                            \
     373    do {                                                                   \
     374        while (*ch != ',')                                                 \
     375        {                                                                  \
     376            if (*ch == 0)                                                  \
     377            {                                                              \
     378                if (pRule)                                                 \
     379                    RTMemFree(pRule);                                      \
     380                if(strRaw)                                                \
     381                    RTStrFree(strRaw);                                     \
     382                return VERR_INVALID_PARAMETER;                             \
     383            }                                                              \
     384            ch++;                                                          \
     385        }                                                                  \
     386        *ch = '\0';                                                        \
     387        ch++;                                                              \
     388    } while(0)
     389            PNATSEVICEPORTFORWARDRULE pRule = (PNATSEVICEPORTFORWARDRULE)RTMemAlloc(sizeof(NATSEVICEPORTFORWARDRULE));
     390            if (!pRule)
     391                return VERR_NO_MEMORY;
     392            char *strName;
     393            char *strProto;
     394            char *strHostIp;
     395            char *strHostPort;
     396            char *strGuestIp;
     397            char *strGuestPort;
     398            char *strRaw = RTStrDup(Val.psz);
     399            char *ch = strRaw;
     400            if (!strRaw)
     401            {
     402                RTMemFree(pRule);
     403                return VERR_NO_MEMORY;
     404            }
     405
     406            strName = RTStrStrip(ch);
     407            ITERATE_TO_NEXT_TERM(ch, pRule, strRaw);
     408            strProto = RTStrStrip(ch);
     409            ITERATE_TO_NEXT_TERM(ch, pRule, strRaw);
     410            strHostIp = RTStrStrip(ch);
     411            ITERATE_TO_NEXT_TERM(ch, pRule, strRaw);
     412            strHostPort = RTStrStrip(ch);
     413            ITERATE_TO_NEXT_TERM(ch, pRule, strRaw);
     414            strGuestIp = RTStrStrip(ch);
     415            ITERATE_TO_NEXT_TERM(ch, pRule, strRaw);
     416            strGuestPort = RTStrStrip(ch);
     417            if (RTStrICmp(strProto, "udp") == 0)
     418                pRule->fUdp = true;
     419            else if (RTStrICmp(strProto, "tcp") == 0)
     420                pRule->fUdp = false;
     421            else
     422            {
     423                RTStrFree(strRaw);
     424                RTMemFree(pRule);
     425                return VERR_INVALID_PARAMETER;
     426            }
     427            if (    strHostIp == NULL
     428                ||  inet_aton(strHostIp, &pRule->IpV4HostAddr) == 0)
     429                pRule->IpV4HostAddr.s_addr = INADDR_ANY;
     430            if (    strGuestIp == NULL
     431                ||  inet_aton(strGuestIp, &pRule->IpV4GuestAddr) == 0)
     432            {
     433                RTMemFree(pRule);
     434                RTMemFree(strRaw);
     435                return VERR_INVALID_PARAMETER;
     436            }
     437            pRule->u16HostPort = RTStrToUInt16(strHostPort);
     438            pRule->u16GuestPort = RTStrToUInt16(strGuestPort);
     439            if (   !pRule->u16HostPort
     440                || !pRule->u16GuestPort)
     441            {
     442                RTMemFree(pRule);
     443                RTMemFree(strRaw);
     444                return VERR_INVALID_PARAMETER;
     445            }
     446            pRule->pszStrRaw = strRaw;
     447            m_vecPortForwardRuleFromCmdLine.push_back(pRule);
     448            return VINF_SUCCESS;
     449#undef ITERATE_TO_NEXT_TERM
     450        }
     451        default:;
     452    }
     453    return VERR_NOT_FOUND;
     454}
     455
    328456/**
    329457 *  Entry point.
     
    333461    Log2(("NAT: main\n"));
    334462    g_pNAT = new VBoxNetNAT();
    335     Log2(("NAT: parsing command line\n"));
     463    Log2(("NAT: initialization\n"));
    336464    int rc = g_pNAT->parseArgs(argc - 1, argv + 1);
    337465    if (!rc)
    338466    {
    339         Log2(("NAT: initialization\n"));
    340467        g_pNAT->init();
     468        Log2(("NAT: parsing command line\n"));
    341469        Log2(("NAT: try go online\n"));
    342470        g_pNAT->tryGoOnline();
     
    347475    return 0;
    348476}
     477
    349478
    350479/** slirp's hooks */
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