mirror of
https://github.com/GNS3/gns3-server
synced 2024-12-25 00:08:11 +00:00
Get MAC addresses for host interfaces to use for filtering frames from vmnet interfaces.
This commit is contained in:
parent
93e2d4096d
commit
a018c5b0f5
@ -26,7 +26,7 @@ import asyncio
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from gns3server.utils.telnet_server import TelnetServer
|
from gns3server.utils.telnet_server import TelnetServer
|
||||||
from gns3server.utils.interfaces import get_windows_interfaces
|
from gns3server.utils.interfaces import interfaces, get_windows_interfaces
|
||||||
from gns3server.utils.asyncio import wait_for_file_creation, wait_for_named_pipe_creation
|
from gns3server.utils.asyncio import wait_for_file_creation, wait_for_named_pipe_creation
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from .vmware_error import VMwareError
|
from .vmware_error import VMwareError
|
||||||
@ -322,16 +322,25 @@ class VMwareVM(BaseVM):
|
|||||||
elif sys.platform.startswith("win"):
|
elif sys.platform.startswith("win"):
|
||||||
windows_interfaces = get_windows_interfaces()
|
windows_interfaces = get_windows_interfaces()
|
||||||
npf = None
|
npf = None
|
||||||
|
source_mac = None
|
||||||
for interface in windows_interfaces:
|
for interface in windows_interfaces:
|
||||||
if "netcard" in interface and vmnet_interface in interface["netcard"]:
|
if "netcard" in interface and vmnet_interface in interface["netcard"]:
|
||||||
npf = interface["id"]
|
npf = interface["id"]
|
||||||
|
source_mac = interface["mac_address"]
|
||||||
elif vmnet_interface in interface["name"]:
|
elif vmnet_interface in interface["name"]:
|
||||||
npf = interface["id"]
|
npf = interface["id"]
|
||||||
|
source_mac = interface["mac_address"]
|
||||||
if npf:
|
if npf:
|
||||||
yield from self._ubridge_hypervisor.send('bridge add_nio_ethernet {name} "{interface}"'.format(name=vnet,
|
yield from self._ubridge_hypervisor.send('bridge add_nio_ethernet {name} "{interface}"'.format(name=vnet,
|
||||||
interface=npf))
|
interface=npf))
|
||||||
else:
|
else:
|
||||||
raise VMwareError("Could not find NPF id for VMnet interface {}".format(vmnet_interface))
|
raise VMwareError("Could not find NPF id for VMnet interface {}".format(vmnet_interface))
|
||||||
|
|
||||||
|
# TODO: should provide that as an option
|
||||||
|
#if source_mac:
|
||||||
|
# yield from self._ubridge_hypervisor.send('bridge set_pcap_filter {name} "not ether src {mac}"'.format(name=vnet,
|
||||||
|
# mac=source_mac))
|
||||||
|
|
||||||
elif sys.platform.startswith("darwin"):
|
elif sys.platform.startswith("darwin"):
|
||||||
yield from self._ubridge_hypervisor.send('bridge add_nio_fusion_vmnet {name} "{interface}"'.format(name=vnet,
|
yield from self._ubridge_hypervisor.send('bridge add_nio_fusion_vmnet {name} "{interface}"'.format(name=vnet,
|
||||||
interface=vmnet_interface))
|
interface=vmnet_interface))
|
||||||
@ -351,6 +360,14 @@ class VMwareVM(BaseVM):
|
|||||||
|
|
||||||
yield from self._ubridge_hypervisor.send('bridge start {name}'.format(name=vnet))
|
yield from self._ubridge_hypervisor.send('bridge start {name}'.format(name=vnet))
|
||||||
|
|
||||||
|
# TODO: this only work when using PCAP (NIO Ethernet)
|
||||||
|
# source_mac = None
|
||||||
|
# for interface in interfaces():
|
||||||
|
# if interface["name"] == vmnet_interface:
|
||||||
|
# source_mac = interface["mac_address"]
|
||||||
|
# if source_mac:
|
||||||
|
# yield from self._ubridge_hypervisor.send('bridge set_pcap_filter {name} "not ether src {mac}"'.format(name=vnet, mac=source_mac))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def _delete_ubridge_connection(self, adapter_number):
|
def _delete_ubridge_connection(self, adapter_number):
|
||||||
"""
|
"""
|
||||||
|
@ -23,7 +23,7 @@ import struct
|
|||||||
import psutil
|
import psutil
|
||||||
|
|
||||||
if psutil.version_info < (3, 0, 0):
|
if psutil.version_info < (3, 0, 0):
|
||||||
raise Exception("psutil version should >= 3.0.0. If you are under ubuntu/debian install gns3 via apt instead of pip")
|
raise Exception("psutil version should >= 3.0.0. If you are under Ubuntu/Debian install gns3 via apt instead of pip")
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -59,6 +59,7 @@ def _get_windows_interfaces_from_registry():
|
|||||||
interfaces.append({"id": npf_interface,
|
interfaces.append({"id": npf_interface,
|
||||||
"name": name,
|
"name": name,
|
||||||
"ip_address": ip_address,
|
"ip_address": ip_address,
|
||||||
|
"mac_address": "", # TODO: find MAC address in registry
|
||||||
"netcard": netcard})
|
"netcard": netcard})
|
||||||
winreg.CloseKey(hkeyinterface)
|
winreg.CloseKey(hkeyinterface)
|
||||||
winreg.CloseKey(hkeycon)
|
winreg.CloseKey(hkeycon)
|
||||||
@ -99,6 +100,7 @@ def get_windows_interfaces():
|
|||||||
interfaces.append({"id": npf_interface,
|
interfaces.append({"id": npf_interface,
|
||||||
"name": adapter.NetConnectionID,
|
"name": adapter.NetConnectionID,
|
||||||
"ip_address": ip_address,
|
"ip_address": ip_address,
|
||||||
|
"mac_address": adapter.MACAddress,
|
||||||
"netcard": adapter.name})
|
"netcard": adapter.name})
|
||||||
except (AttributeError, pywintypes.com_error):
|
except (AttributeError, pywintypes.com_error):
|
||||||
log.warn("Could not use the COM service to retrieve interface info, trying using the registry...")
|
log.warn("Could not use the COM service to retrieve interface info, trying using the registry...")
|
||||||
@ -148,14 +150,17 @@ def interfaces():
|
|||||||
if not sys.platform.startswith("win"):
|
if not sys.platform.startswith("win"):
|
||||||
for interface in sorted(psutil.net_if_addrs().keys()):
|
for interface in sorted(psutil.net_if_addrs().keys()):
|
||||||
ip_address = ""
|
ip_address = ""
|
||||||
|
mac_address = ""
|
||||||
for addr in psutil.net_if_addrs()[interface]:
|
for addr in psutil.net_if_addrs()[interface]:
|
||||||
# get the first available IPv4 address only
|
# get the first available IPv4 address only
|
||||||
if addr.family == socket.AF_INET:
|
if addr.family == socket.AF_INET:
|
||||||
ip_address = addr.address
|
ip_address = addr.address
|
||||||
break
|
if addr.family == psutil.AF_LINK:
|
||||||
|
mac_address = addr.address
|
||||||
results.append({"id": interface,
|
results.append({"id": interface,
|
||||||
"name": interface,
|
"name": interface,
|
||||||
"ip_address": ip_address})
|
"ip_address": ip_address,
|
||||||
|
"mac_address": mac_address})
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
results = get_windows_interfaces()
|
results = get_windows_interfaces()
|
||||||
|
Loading…
Reference in New Issue
Block a user