525950c8008d080ca873214b776c45aa9a45566evboxsync/** @file
525950c8008d080ca873214b776c45aa9a45566evboxsync * Main - Network Interfaces.
525950c8008d080ca873214b776c45aa9a45566evboxsync */
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2008-2012 Oracle Corporation
525950c8008d080ca873214b776c45aa9a45566evboxsync *
525950c8008d080ca873214b776c45aa9a45566evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
525950c8008d080ca873214b776c45aa9a45566evboxsync * available from http://www.virtualbox.org. This file is free software;
525950c8008d080ca873214b776c45aa9a45566evboxsync * you can redistribute it and/or modify it under the terms of the GNU
525950c8008d080ca873214b776c45aa9a45566evboxsync * General Public License (GPL) as published by the Free Software
525950c8008d080ca873214b776c45aa9a45566evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
525950c8008d080ca873214b776c45aa9a45566evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
525950c8008d080ca873214b776c45aa9a45566evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
525950c8008d080ca873214b776c45aa9a45566evboxsync */
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync#ifndef ___netif_h
525950c8008d080ca873214b776c45aa9a45566evboxsync#define ___netif_h
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync#include <iprt/cdefs.h>
525950c8008d080ca873214b776c45aa9a45566evboxsync#include <iprt/types.h>
525950c8008d080ca873214b776c45aa9a45566evboxsync#include <iprt/net.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync/** @todo r=bird: The inlined code below that drags in asm.h here. I doubt
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync * speed is very important here, so move it into a .cpp file, please. */
9017f267fa420046f899f77b0c83d9327b38bb4fvboxsync#include <iprt/asm.h>
525950c8008d080ca873214b776c45aa9a45566evboxsync
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync#ifndef RT_OS_WINDOWS
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync# include <arpa/inet.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync# include <stdio.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#endif /* !RT_OS_WINDOWS */
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync#define VBOXNET_IPV4ADDR_DEFAULT 0x0138A8C0 /* 192.168.56.1 */
b09004e17d8096e3983fb0ecf5aad272877037ccvboxsync#define VBOXNET_IPV4MASK_DEFAULT "255.255.255.0"
525950c8008d080ca873214b776c45aa9a45566evboxsync
0b0a875644c31b5836a66dfc68594a2db58d47davboxsync#define VBOXNET_MAX_SHORT_NAME 50
0b0a875644c31b5836a66dfc68594a2db58d47davboxsync
7bb91888f724cf8f14131a3d575fa77ef9591396vboxsync#if 1
525950c8008d080ca873214b776c45aa9a45566evboxsync/**
525950c8008d080ca873214b776c45aa9a45566evboxsync * Encapsulation type.
525950c8008d080ca873214b776c45aa9a45566evboxsync */
525950c8008d080ca873214b776c45aa9a45566evboxsynctypedef enum NETIFTYPE
525950c8008d080ca873214b776c45aa9a45566evboxsync{
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_T_UNKNOWN,
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_T_ETHERNET,
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_T_PPP,
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_T_SLIP
525950c8008d080ca873214b776c45aa9a45566evboxsync} NETIFTYPE;
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync/**
525950c8008d080ca873214b776c45aa9a45566evboxsync * Current state of the interface.
525950c8008d080ca873214b776c45aa9a45566evboxsync */
525950c8008d080ca873214b776c45aa9a45566evboxsynctypedef enum NETIFSTATUS
525950c8008d080ca873214b776c45aa9a45566evboxsync{
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_S_UNKNOWN,
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_S_UP,
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIF_S_DOWN
525950c8008d080ca873214b776c45aa9a45566evboxsync} NETIFSTATUS;
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync/**
525950c8008d080ca873214b776c45aa9a45566evboxsync * Host Network Interface Information.
525950c8008d080ca873214b776c45aa9a45566evboxsync */
525950c8008d080ca873214b776c45aa9a45566evboxsynctypedef struct NETIFINFO
525950c8008d080ca873214b776c45aa9a45566evboxsync{
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIFINFO *pNext;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTNETADDRIPV4 IPAddress;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTNETADDRIPV4 IPNetMask;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTNETADDRIPV6 IPv6Address;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTNETADDRIPV6 IPv6NetMask;
60c4fce228bff6a0716dc741be8ad82dd327614dvboxsync BOOL bDhcpEnabled;
392c0523cb59e9ef48eb5b8eb7798d6912fef7aevboxsync BOOL bIsDefault;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTMAC MACAddress;
623338655274e3a4330698638fbab19b17da4cc9vboxsync NETIFTYPE enmMediumType;
525950c8008d080ca873214b776c45aa9a45566evboxsync NETIFSTATUS enmStatus;
986eb022f9ed91353388b58ff989774debca29acvboxsync uint32_t uSpeedMbits;
525950c8008d080ca873214b776c45aa9a45566evboxsync RTUUID Uuid;
0b0a875644c31b5836a66dfc68594a2db58d47davboxsync char szShortName[VBOXNET_MAX_SHORT_NAME];
525950c8008d080ca873214b776c45aa9a45566evboxsync char szName[1];
525950c8008d080ca873214b776c45aa9a45566evboxsync} NETIFINFO;
525950c8008d080ca873214b776c45aa9a45566evboxsync
525950c8008d080ca873214b776c45aa9a45566evboxsync/** Pointer to a network interface info. */
525950c8008d080ca873214b776c45aa9a45566evboxsynctypedef NETIFINFO *PNETIFINFO;
525950c8008d080ca873214b776c45aa9a45566evboxsync/** Pointer to a const network interface info. */
525950c8008d080ca873214b776c45aa9a45566evboxsynctypedef NETIFINFO const *PCNETIFINFO;
7bb91888f724cf8f14131a3d575fa77ef9591396vboxsync#endif
525950c8008d080ca873214b776c45aa9a45566evboxsync
32529464ff2d4288a3c949ab8042126b0fa903devboxsyncint NetIfList(std::list <ComObjPtr<HostNetworkInterface> > &list);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfEnableStaticIpConfig(VirtualBox *pVBox, HostNetworkInterface * pIf, ULONG aOldIp, ULONG aNewIp, ULONG aMask);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfEnableStaticIpConfigV6(VirtualBox *pVBox, HostNetworkInterface * pIf, IN_BSTR aOldIPV6Address, IN_BSTR aIPV6Address, ULONG aIPV6MaskPrefixLength);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfEnableDynamicIpConfig(VirtualBox *pVBox, HostNetworkInterface * pIf);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfCreateHostOnlyNetworkInterface (VirtualBox *pVBox, IHostNetworkInterface **aHostNetworkInterface, IProgress **aProgress, const char *pcszName = NULL);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfRemoveHostOnlyNetworkInterface (VirtualBox *pVBox, IN_GUID aId, IProgress **aProgress);
c1367e053933211e2e4869cf3d5e5e7c0620fdd8vboxsyncint NetIfGetConfig(HostNetworkInterface * pIf, NETIFINFO *);
8e9951d7663b4c2e1ea75c5ce62df9f2910954favboxsyncint NetIfGetConfigByName(PNETIFINFO pInfo);
3fb18f864d3a3a6727c51f29be516f268d3baa96vboxsyncint NetIfGetState(const char *pcszIfName, NETIFSTATUS *penmState);
3fb18f864d3a3a6727c51f29be516f268d3baa96vboxsyncint NetIfGetLinkSpeed(const char *pcszIfName, uint32_t *puMbits);
1468b39c8bba83821c9a88039ead6315de21da51vboxsyncint NetIfDhcpRediscover(VirtualBox *pVBox, HostNetworkInterface * pIf);
e35d51bc86d234abdf08fe247ea901501faa022fvboxsyncint NetIfAdpCtlOut(const char * pcszName, const char * pcszCmd, char *pszBuffer, size_t cBufSize);
525950c8008d080ca873214b776c45aa9a45566evboxsync
45677251379f493b12e17b018a00fb421bc03210vboxsyncDECLINLINE(Bstr) composeIPv6Address(PRTNETADDRIPV6 aAddrPtr)
45677251379f493b12e17b018a00fb421bc03210vboxsync{
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync char szTmp[8*5] = "";
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync if (aAddrPtr->s.Lo || aAddrPtr->s.Hi)
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync RTStrPrintf(szTmp, sizeof(szTmp),
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync "%02x%02x:%02x%02x:%02x%02x:%02x%02x:"
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync "%02x%02x:%02x%02x:%02x%02x:%02x%02x",
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[0], aAddrPtr->au8[1],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[2], aAddrPtr->au8[3],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[4], aAddrPtr->au8[5],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[6], aAddrPtr->au8[7],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[8], aAddrPtr->au8[9],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[10], aAddrPtr->au8[11],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[12], aAddrPtr->au8[13],
eaa6b4b3907b130823d6d0789716d83cec7ab243vboxsync aAddrPtr->au8[14], aAddrPtr->au8[15]);
45677251379f493b12e17b018a00fb421bc03210vboxsync return Bstr(szTmp);
45677251379f493b12e17b018a00fb421bc03210vboxsync}
45677251379f493b12e17b018a00fb421bc03210vboxsync
65d9eb0b2a96389c8512d1234c02aada7c131531vboxsyncDECLINLINE(ULONG) composeIPv6PrefixLenghFromAddress(PRTNETADDRIPV6 aAddrPtr)
65d9eb0b2a96389c8512d1234c02aada7c131531vboxsync{
a54fad028e14590f00f2bdc889ad5b0ff5995faevboxsync int res = ASMBitFirstClear(aAddrPtr, sizeof(RTNETADDRIPV6)*8);
0540e6bca441e6944e98497c082a076f0d857f10vboxsync return res != -1 ? res : 128;
65d9eb0b2a96389c8512d1234c02aada7c131531vboxsync}
65d9eb0b2a96389c8512d1234c02aada7c131531vboxsync
45677251379f493b12e17b018a00fb421bc03210vboxsyncDECLINLINE(int) prefixLength2IPv6Address(ULONG cPrefix, PRTNETADDRIPV6 aAddrPtr)
45677251379f493b12e17b018a00fb421bc03210vboxsync{
f6b7b6d2dcdb1fdc4d01e32baf9d504af2946597vboxsync if (cPrefix > 128)
45677251379f493b12e17b018a00fb421bc03210vboxsync return VERR_INVALID_PARAMETER;
f6b7b6d2dcdb1fdc4d01e32baf9d504af2946597vboxsync if (!aAddrPtr)
45677251379f493b12e17b018a00fb421bc03210vboxsync return VERR_INVALID_PARAMETER;
45677251379f493b12e17b018a00fb421bc03210vboxsync
94d8af34a7773eba6a53e3dcbf2b363a6639d867vboxsync RT_ZERO(*aAddrPtr);
45677251379f493b12e17b018a00fb421bc03210vboxsync
70952f879dbd707ae2c9be41f22fcaf7c760c615vboxsync ASMBitSetRange(aAddrPtr, 0, cPrefix);
45677251379f493b12e17b018a00fb421bc03210vboxsync
45677251379f493b12e17b018a00fb421bc03210vboxsync return VINF_SUCCESS;
45677251379f493b12e17b018a00fb421bc03210vboxsync}
45677251379f493b12e17b018a00fb421bc03210vboxsync
45677251379f493b12e17b018a00fb421bc03210vboxsyncDECLINLINE(Bstr) composeHardwareAddress(PRTMAC aMacPtr)
45677251379f493b12e17b018a00fb421bc03210vboxsync{
45677251379f493b12e17b018a00fb421bc03210vboxsync char szTmp[6*3];
45677251379f493b12e17b018a00fb421bc03210vboxsync
45677251379f493b12e17b018a00fb421bc03210vboxsync RTStrPrintf(szTmp, sizeof(szTmp),
45677251379f493b12e17b018a00fb421bc03210vboxsync "%02x:%02x:%02x:%02x:%02x:%02x",
45677251379f493b12e17b018a00fb421bc03210vboxsync aMacPtr->au8[0], aMacPtr->au8[1],
45677251379f493b12e17b018a00fb421bc03210vboxsync aMacPtr->au8[2], aMacPtr->au8[3],
45677251379f493b12e17b018a00fb421bc03210vboxsync aMacPtr->au8[4], aMacPtr->au8[5]);
45677251379f493b12e17b018a00fb421bc03210vboxsync return Bstr(szTmp);
45677251379f493b12e17b018a00fb421bc03210vboxsync}
45677251379f493b12e17b018a00fb421bc03210vboxsync
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsyncDECLINLINE(Bstr) getDefaultIPv4Address(Bstr bstrIfName)
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync{
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync /* Get the index from the name */
d00ff02d6b6a967cd356b3a2a9b184148ea14851vboxsync Utf8Str strTmp = bstrIfName;
d00ff02d6b6a967cd356b3a2a9b184148ea14851vboxsync const char *pszIfName = strTmp.c_str();
d085c1b69a7bcc74007ecdf3e9a013140827aeb2vboxsync int iInstance = 0;
d085c1b69a7bcc74007ecdf3e9a013140827aeb2vboxsync size_t iPos = strcspn(pszIfName, "0123456789");
d00ff02d6b6a967cd356b3a2a9b184148ea14851vboxsync if (pszIfName[iPos])
d00ff02d6b6a967cd356b3a2a9b184148ea14851vboxsync iInstance = RTStrToUInt32(pszIfName + iPos);
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync in_addr tmp;
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync#if defined(RT_OS_WINDOWS)
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync tmp.S_un.S_addr = VBOXNET_IPV4ADDR_DEFAULT + (iInstance << 16);
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync#else
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync tmp.s_addr = VBOXNET_IPV4ADDR_DEFAULT + (iInstance << 16);
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync#endif
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync char *addr = inet_ntoa(tmp);
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync return Bstr(addr);
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync}
53b0fdeac7f9c6951c13042aa63c0a45fa606cfavboxsync
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#endif /* !___netif_h */
5e3a885d489b1c99d79d576813f8f321bae46927vboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */