VirtualBox

Changeset 41987 in vbox for trunk


Ignore:
Timestamp:
Jul 2, 2012 4:44:45 PM (12 years ago)
Author:
vboxsync
Message:

NAT: hide TFTP internals.

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

Legend:

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

    r41977 r41987  
    354354    rc = slirpInitializeDnsSettings(pData);
    355355    AssertRCReturn(rc, VINF_NAT_DNS);
     356    rc = slirpTftpInit(pData);
     357    AssertRCReturn(rc, VINF_NAT_DNS);
    356358
    357359    if (i32AliasMode & ~(PKT_ALIAS_LOG|PKT_ALIAS_SAME_PORTS|PKT_ALIAS_PROXY_ONLY))
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r41970 r41987  
    4848
    4949/** TFTP session entry. */
    50 typedef enum ENMTFTPSESSIONFMT
    51 {
    52     TFTPFMT_NONE = 0,
    53     TFTPFMT_OCTET,
    54     TFTPFMT_NETASCII,
    55     TFTPFMT_MAIL,
    56     TFTPFMT_NOT_FMT = 0xffff
    57 } ENMTFTPSESSIONFMT;
    58 
    59 typedef struct TFTPSESSION
    60 {
    61     int         fInUse;
    62     unsigned char pszFilename[TFTP_FILENAME_MAX];
    63     struct      in_addr IpClientAddress;
    64     uint16_t    u16ClientPort;
    65     int         iTimestamp;
    66     ENMTFTPSESSIONFMT enmTftpFmt;
    67     uint16_t    u16BlkSize;
    68     uint16_t    u16TSize;
    69     uint16_t    u16Size;
    70     uint16_t    u16Timeout;
    71 } TFTPSESSION, *PTFTPSESSION;
    72 
    73 typedef const PTFTPSESSION PCTFTPSESSION;
    74 
    7550struct dns_domain_entry
    7651{
     
    196171    int tcp_reass_overflows;
    197172    /* Stuff from tftp.c */
    198     TFTPSESSION aTftpSessions[TFTP_SESSIONS_MAX];
     173    void         *pvTftpSessions;
     174    int          cTftpSession;
    199175    const char *tftp_prefix;
    200176    /* Stuff from udp.c */
  • trunk/src/VBox/Devices/Network/slirp/tftp.c

    r41970 r41987  
    4646#include <iprt/asm-math.h>
    4747
     48typedef enum ENMTFTPSESSIONFMT
     49{
     50    TFTPFMT_NONE = 0,
     51    TFTPFMT_OCTET,
     52    TFTPFMT_NETASCII,
     53    TFTPFMT_MAIL,
     54    TFTPFMT_NOT_FMT = 0xffff
     55} ENMTFTPSESSIONFMT;
     56
     57typedef struct TFTPSESSION
     58{
     59    int         fInUse;
     60    unsigned char pszFilename[TFTP_FILENAME_MAX];
     61    struct      in_addr IpClientAddress;
     62    uint16_t    u16ClientPort;
     63    int         iTimestamp;
     64    ENMTFTPSESSIONFMT enmTftpFmt;
     65    uint16_t    u16BlkSize;
     66    uint16_t    u16TSize;
     67    uint16_t    u16Size;
     68    uint16_t    u16Timeout;
     69} TFTPSESSION, *PTFTPSESSION, **PPTFTPSESSION;
     70
     71#pragma pack(1)
     72typedef struct TFTPCOREHDR
     73{
     74    uint16_t    u16TftpOpCode;
     75    /* Data lays here (might be raw uint8_t* or header of payload ) */
     76} TFTPCOREHDR, *PTFTPCOREHDR;
     77
     78typedef struct TFTPIPHDR
     79{
     80    struct ip       IPv4Hdr;
     81    struct udphdr   UdpHdr;
     82    uint16_t        u16TftpOpType;
     83    TFTPCOREHDR     Core;
     84    /* Data lays here */
     85} TFTPIPHDR, *PTFTPIPHDR;
     86#pragma pack()
     87
     88typedef const PTFTPIPHDR PCTFTPIPHDR;
     89
     90typedef const PTFTPSESSION PCTFTPSESSION;
     91
     92
    4893typedef struct TFTPOPTIONDESC
    4994{
     
    297342}
    298343
    299 static int tftpAllocateSession(PNATState pData, PCTFTPIPHDR pcTftpIpHeader)
    300 {
    301     PTFTPSESSION pTftpSession;
     344static int tftpAllocateSession(PNATState pData, PCTFTPIPHDR pcTftpIpHeader, PPTFTPSESSION ppTftpSession)
     345{
     346    PTFTPSESSION pTftpSession = NULL;
    302347    int rc = VINF_SUCCESS;
    303348    int idxSession;
     349    AssertPtrReturn(pData, VERR_INVALID_PARAMETER);
     350    AssertPtrReturn(pcTftpIpHeader, VERR_INVALID_PARAMETER);
     351    AssertPtrReturn(ppTftpSession, VERR_INVALID_PARAMETER);
    304352
    305353    for (idxSession = 0; idxSession < TFTP_SESSIONS_MAX; idxSession++)
    306354    {
    307         pTftpSession = &pData->aTftpSessions[idxSession];
     355        pTftpSession = &((PTFTPSESSION)pData->pvTftpSessions)[idxSession];
    308356
    309357        if (!pTftpSession->fInUse)
     
    315363    }
    316364
    317     return -1;
     365    return VERR_NOT_FOUND;
    318366
    319367 found:
     
    322370    pTftpSession->u16ClientPort = pcTftpIpHeader->UdpHdr.uh_sport;
    323371    rc = tftpSessionOptionParse(pTftpSession, pcTftpIpHeader);
    324     AssertRCReturn(rc, -1);
     372    AssertRCReturn(rc, VERR_INTERNAL_ERROR);
     373    *ppTftpSession = pTftpSession;
    325374
    326375    tftpSessionUpdate(pData, pTftpSession);
    327376
    328     return idxSession;
    329 }
    330 
    331 static int tftpSessionFind(PNATState pData, PCTFTPIPHDR pcTftpIpHeader)
     377    return VINF_SUCCESS;
     378}
     379
     380static int tftpSessionFind(PNATState pData, PCTFTPIPHDR pcTftpIpHeader, PPTFTPSESSION ppTftpSessions)
    332381{
    333382    PTFTPSESSION pTftpSession;
    334     int k;
    335 
    336     for (k = 0; k < TFTP_SESSIONS_MAX; k++)
    337     {
    338         pTftpSession = &pData->aTftpSessions[k];
     383    int idxTftpSession;
     384    AssertPtrReturn(pData, VERR_INVALID_PARAMETER);
     385    AssertPtrReturn(pcTftpIpHeader, VERR_INVALID_PARAMETER);
     386    AssertPtrReturn(ppTftpSessions, VERR_INVALID_PARAMETER);
     387
     388    for (idxTftpSession = 0; idxTftpSession < TFTP_SESSIONS_MAX; idxTftpSession++)
     389    {
     390        pTftpSession = &((PTFTPSESSION)pData->pvTftpSessions)[idxTftpSession];
    339391
    340392        if (pTftpSession->fInUse)
     
    343395            {
    344396                if (pTftpSession->u16ClientPort == pcTftpIpHeader->UdpHdr.uh_sport)
    345                     return k;
     397                {
     398                    *ppTftpSessions = pTftpSession;
     399                    return VINF_SUCCESS;
     400                }
    346401            }
    347402        }
    348403    }
    349404
    350     return -1;
     405    return VERR_NOT_FOUND;
    351406}
    352407
     
    647702DECLINLINE(void) tftpProcessRRQ(PNATState pData, PCTFTPIPHDR pTftpIpHeader, int pktlen)
    648703{
    649     PTFTPSESSION pTftpSession;
    650     int idxTftpSession = 0;
     704    PTFTPSESSION pTftpSession = NULL;
    651705    uint8_t *pu8Payload = NULL;
    652706    int     cbPayload = 0;
    653707    int cbFileName = 0;
     708    int rc = VINF_SUCCESS;
    654709
    655710    AssertPtrReturnVoid(pTftpIpHeader);
     
    658713    LogFlowFunc(("ENTER: pTftpIpHeader:%p, pktlen:%d\n", pTftpIpHeader, pktlen));
    659714
    660     idxTftpSession = tftpAllocateSession(pData, pTftpIpHeader);
    661     if (idxTftpSession < 0)
     715    rc = tftpAllocateSession(pData, pTftpIpHeader, &pTftpSession);
     716    if (   RT_FAILURE(rc)
     717        || pTftpSession == NULL)
    662718    {
    663719        LogFlowFuncLeave();
     
    665721    }
    666722
    667     pTftpSession = &pData->aTftpSessions[idxTftpSession];
    668723    pu8Payload = (uint8_t *)&pTftpIpHeader->Core;
    669724    cbPayload = pktlen - sizeof(TFTPIPHDR);
     
    702757static void tftpProcessACK(PNATState pData, PTFTPIPHDR pTftpIpHeader)
    703758{
    704     int s;
    705 
    706     s = tftpSessionFind(pData, pTftpIpHeader);
    707     if (s < 0)
     759    int rc;
     760    PTFTPSESSION pTftpSession = NULL;
     761
     762    rc = tftpSessionFind(pData, pTftpIpHeader, &pTftpSession);
     763    if (RT_FAILURE(rc))
    708764        return;
    709765
    710     if (tftpSendData(pData, &pData->aTftpSessions[s],
    711                        RT_N2H_U16(pTftpIpHeader->Core.u16TftpOpCode) + 1, pTftpIpHeader) < 0)
    712     {
    713         /* XXX */
    714     }
    715 }
    716 
    717 DECLCALLBACK(void) tftp_input(PNATState pData, struct mbuf *pMbuf)
     766    AssertReturnVoid(tftpSendData(pData,
     767                                    pTftpSession,
     768                                    RT_N2H_U16(pTftpIpHeader->Core.u16TftpOpCode) + 1, pTftpIpHeader));
     769}
     770
     771DECLCALLBACK(int) slirpTftpInit(PNATState pData)
     772{
     773    AssertPtrReturn(pData, VERR_INVALID_PARAMETER);
     774    pData->pvTftpSessions = RTMemAllocZ(sizeof(TFTPSESSION) * TFTP_SESSIONS_MAX);
     775    AssertPtrReturn(pData->pvTftpSessions, VERR_NO_MEMORY);
     776    return VINF_SUCCESS;
     777}
     778
     779DECLCALLBACK(int) slirpTftpInput(PNATState pData, struct mbuf *pMbuf)
    718780{
    719781    PTFTPIPHDR pTftpIpHeader = NULL;
     
    731793            tftpProcessACK(pData, pTftpIpHeader);
    732794            break;
    733         default:
    734             LogFlowFuncLeave();
    735             return;
    736     }
    737 }
     795        default:;
     796    }
     797    LogFlowFuncLeaveRC(VINF_SUCCESS);
     798    return VINF_SUCCESS;
     799}
  • trunk/src/VBox/Devices/Network/slirp/tftp.h

    r41970 r41987  
    1818/* tftp defines */
    1919
     20#ifndef _SLIRP_TFTP_H_
     21#define _SLIRP_TFTP_H_
     22
    2023#define TFTP_SESSIONS_MAX 3
    2124
     
    3134#define TFTP_FILENAME_MAX 512
    3235
    33 #if 0
    34 struct tftp_t
    35 {
    36     struct ip ip;
    37     struct udphdr udp;
    38     u_int16_t tp_op;
    39     union
    40     {
    41         struct
    42         {
    43             u_int16_t tp_block_nr;
    44             u_int8_t  tp_buf[512];
    45         } tp_data;
    46         struct
    47         {
    48             u_int16_t tp_error_code;
    49             u_int8_t  tp_msg[512];
    50         } tp_error;
    51         u_int8_t tp_buf[512 + 2];
    52     } x;
    53 };
    54 #else
    55 #pragma pack(0)
    56 typedef struct TFTPCOREHDR
    57 {
    58     uint16_t    u16TftpOpCode;
    59 #if 0
    60     union {
    61         uint16_t u16BlockNum;
    62         uint16_t u16TftpErrorCode;
    63     } X;
     36
     37int slirpTftpInput(PNATState pData, struct mbuf *m);
     38int slirpTftpInit(PNATState);
    6439#endif
    65     /* Data lays here (might be raw uint8_t* or header of payload ) */
    66 } TFTPCOREHDR, *PTFTPCOREHDR;
    67 
    68 typedef struct TFTPIPHDR
    69 {
    70     struct ip       IPv4Hdr;
    71     struct udphdr   UdpHdr;
    72     uint16_t        u16TftpOpType;
    73     TFTPCOREHDR     Core;
    74     /* Data lays here */
    75 } TFTPIPHDR, *PTFTPIPHDR;
    76 #pragma pack()
    77 
    78 typedef const PTFTPIPHDR PCTFTPIPHDR;
    79 #endif
    80 
    81 void tftp_input(PNATState pData, struct mbuf *m);
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r41856 r41987  
    204204        && CTL_CHECK(ip->ip_dst.s_addr, CTL_TFTP))
    205205    {
    206         tftp_input(pData, m);
     206        if (pData->pvTftpSessions)
     207            slirpTftpInput(pData, m);
    207208        goto done_free_mbuf;
    208209    }
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