VirtualBox

Ignore:
Timestamp:
Apr 15, 2008 4:17:52 PM (17 years ago)
Author:
vboxsync
Message:

slirp: make it possible to configure the netmask

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

Legend:

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

    r7809 r8009  
    261261        *q++ = RFC1533_NETMASK;
    262262        *q++ = 4;
    263         *q++ = 0xff;
    264         *q++ = 0xff;
    265         *q++ = 0xff;
    266         *q++ = 0x00;
     263        *q++ = (pData->netmask & 0xff000000) >> 24;
     264        *q++ = (pData->netmask & 0x00ff0000) >> 16;
     265        *q++ = (pData->netmask & 0x0000ff00) >>  8;
     266        *q++ = (pData->netmask & 0x000000ff);
    267267
    268268        *q++ = RFC1533_GATEWAY;
  • trunk/src/VBox/Devices/Network/slirp/ctl.h

    r1796 r8009  
    55#define CTL_BROADCAST   255
    66
     7#if 0
    78#define CTL_SPECIAL     "10.0.2.0"
    89#define CTL_LOCAL       "10.0.2.15"
     10#endif
  • trunk/src/VBox/Devices/Network/slirp/ip_icmp.c

    r5436 r8009  
    136136      /* Send the packet */
    137137      addr.sin_family = AF_INET;
    138       if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) {
     138      if ((so->so_faddr.s_addr & htonl(~pData->netmask)) == special_addr.s_addr) {
    139139        /* It's an alias */
    140         switch(ntohl(so->so_faddr.s_addr) & 0xff) {
     140        switch(ntohl(so->so_faddr.s_addr) & ~pData->netmask) {
    141141        case CTL_DNS:
    142142          addr.sin_addr = dns_addr;
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r5436 r8009  
    2727#endif
    2828
    29 int slirp_init(PNATState *, const char *, bool, const char *, const char *, void *);
     29int slirp_init(PNATState *, const char *, uint32_t, bool, const char *, const char *, void *);
    3030void slirp_term(PNATState);
    3131void slirp_link_up(PNATState);
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r6761 r8009  
    195195}
    196196
    197 int slirp_init(PNATState *ppData, const char *pszNetAddr, bool fPassDomain,
    198                const char *pszTFTPPrefix, const char *pszBootFile,
    199                void *pvUser)
     197int slirp_init(PNATState *ppData, const char *pszNetAddr, uint32_t u32Netmask,
     198               bool fPassDomain, const char *pszTFTPPrefix,
     199               const char *pszBootFile, void *pvUser)
    200200{
    201201    int fNATfailed = 0;
     
    204204    if (!pData)
    205205        return VERR_NO_MEMORY;
     206    if (u32Netmask & 0x1f)
     207        /* CTL is x.x.x.15, bootp passes up to 16 IPs (15..31) */
     208        return VERR_INVALID_PARAMETER;
    206209    memset(pData, '\0', sizeof(NATState));
    207210    pData->fPassDomain = fPassDomain;
     
    212215    tftp_prefix = pszTFTPPrefix;
    213216    bootp_filename = pszBootFile;
     217    pData->netmask = u32Netmask;
    214218
    215219#ifdef _WIN32
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r5999 r8009  
    8484    struct in_addr dns_addr;
    8585    struct in_addr loopback_addr;
     86    uint32_t netmask;
    8687    uint8_t client_ethaddr[6];
    8788    struct ex_list *exec_list;
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r5716 r8009  
    497497
    498498        addr.sin_family = AF_INET;
    499         if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) {
     499        if ((so->so_faddr.s_addr & htonl(pData->netmask)) == special_addr.s_addr) {
    500500          /* It's an alias */
    501           switch(ntohl(so->so_faddr.s_addr) & 0xff) {
     501          uint32_t last_byte = ntohl(so->so_faddr.s_addr) & ~pData->netmask;
     502          switch(last_byte) {
     503#if 0
     504          /* handle this case at 'default:' */
    502505          case CTL_BROADCAST:
    503506            addr.sin_addr.s_addr = INADDR_BROADCAST;
    504 #if 0
     507# if 0
    505508            /* Send the packet to host to fully emulate broadcast */
    506509            /** @todo r=klaus: on Linux host this causes the host to receive
     
    513516            sendto(so->s, m->m_data, m->m_len, 0,
    514517                  (struct sockaddr *)&host_addr, sizeof (struct sockaddr));
    515 #endif
     518# endif
    516519            break;
     520#endif
    517521          case CTL_DNS:
    518522            if (!get_dns_addr(pData, &dns_addr))
     
    523527          case CTL_ALIAS:
    524528          default:
    525             addr.sin_addr = loopback_addr;
     529            if (last_byte == ~pData->netmask)
     530              addr.sin_addr.s_addr = INADDR_BROADCAST;
     531            else
     532              addr.sin_addr = loopback_addr;
    526533            break;
    527534          }
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r3391 r8009  
    624624           * tcp_ctl once connected, otherwise connect
    625625           */
    626           if ((so->so_faddr.s_addr&htonl(0xffffff00)) == special_addr.s_addr) {
    627             int lastbyte=ntohl(so->so_faddr.s_addr) & 0xff;
     626          if ((so->so_faddr.s_addr&htonl(pData->netmask)) == special_addr.s_addr) {
     627            int lastbyte=ntohl(so->so_faddr.s_addr) & ~pData->netmask;
    628628            if (lastbyte!=CTL_ALIAS && lastbyte!=CTL_DNS) {
    629629#if 0
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r5716 r8009  
    391391
    392392    addr.sin_family = AF_INET;
    393     if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) {
     393    if ((so->so_faddr.s_addr & htonl(pData->netmask)) == special_addr.s_addr) {
    394394      /* It's an alias */
    395       switch(ntohl(so->so_faddr.s_addr) & 0xff) {
     395      switch(ntohl(so->so_faddr.s_addr) & ~pData->netmask) {
    396396      case CTL_DNS:
    397397        if (!get_dns_addr(pData, &dns_addr))
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r5723 r8009  
    302302
    303303    saddr = *addr;
    304     if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) {
     304    if ((so->so_faddr.s_addr & htonl(pData->netmask)) == special_addr.s_addr) {
    305305        saddr.sin_addr.s_addr = so->so_faddr.s_addr;
    306         if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff))
     306        if ((so->so_faddr.s_addr & htonl(~pData->netmask)) == htonl(~pData->netmask))
    307307            saddr.sin_addr.s_addr = alias_addr.s_addr;
    308308    }
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