1
0
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:
grossmj 2016-03-14 18:27:51 -06:00
parent 93e2d4096d
commit a018c5b0f5
2 changed files with 27 additions and 5 deletions

View File

@ -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):
""" """

View File

@ -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()