From 0bbb686bdae99576135631d228b1d4c01b63bb0d Mon Sep 17 00:00:00 2001 From: Jeff Ahrenholz Date: Tue, 8 Oct 2019 13:05:37 -0700 Subject: [PATCH 1/5] fix exception when trying to run Python script from GUI --- daemon/core/api/tlv/corehandlers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon/core/api/tlv/corehandlers.py b/daemon/core/api/tlv/corehandlers.py index e520ce95..7096c099 100644 --- a/daemon/core/api/tlv/corehandlers.py +++ b/daemon/core/api/tlv/corehandlers.py @@ -2042,6 +2042,7 @@ class CoreUdpHandler(CoreHandler): } self.master = False self.session = None + self.coreemu = server.mainserver.coreemu socketserver.BaseRequestHandler.__init__(self, request, client_address, server) def setup(self): From fee56302a1477269f95fb8384e992549cf3799a0 Mon Sep 17 00:00:00 2001 From: bharnden <32446120+bharnden@users.noreply.github.com> Date: Sat, 12 Oct 2019 08:03:20 -0700 Subject: [PATCH 2/5] fix for wlan configuration issues --- daemon/core/api/tlv/corehandlers.py | 2 +- daemon/core/location/mobility.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/daemon/core/api/tlv/corehandlers.py b/daemon/core/api/tlv/corehandlers.py index 7096c099..1264af84 100644 --- a/daemon/core/api/tlv/corehandlers.py +++ b/daemon/core/api/tlv/corehandlers.py @@ -1416,7 +1416,7 @@ class CoreHandler(socketserver.BaseRequestHandler): parsed_config = ConfigShim.str_to_dict(values_str) self.session.mobility.set_model_config(node_id, object_name, parsed_config) - if self.session.state == EventTypes.RUNTIME_STATE.value: + if self.session.state == EventTypes.RUNTIME_STATE.value and parsed_config: try: node = self.session.get_node(node_id) if object_name == BasicRangeModel.name: diff --git a/daemon/core/location/mobility.py b/daemon/core/location/mobility.py index f6ce60ca..aaaf45d2 100644 --- a/daemon/core/location/mobility.py +++ b/daemon/core/location/mobility.py @@ -426,7 +426,7 @@ class BasicRangeModel(WirelessModel): self.delay = int(config["delay"]) if self.delay == 0: self.delay = None - self.loss = int(config["error"]) + self.loss = int(float(config["error"])) if self.loss == 0: self.loss = None self.jitter = int(config["jitter"]) From eb248291a59337740c3fabbd8ecd81888bcef5e9 Mon Sep 17 00:00:00 2001 From: bharnden <32446120+bharnden@users.noreply.github.com> Date: Sat, 12 Oct 2019 08:10:30 -0700 Subject: [PATCH 3/5] fix for gretap interfaces giving bad values to netclient --- daemon/core/nodes/interface.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/daemon/core/nodes/interface.py b/daemon/core/nodes/interface.py index 51859e3a..a33c0be2 100644 --- a/daemon/core/nodes/interface.py +++ b/daemon/core/nodes/interface.py @@ -460,9 +460,13 @@ class GreTap(CoreInterface): if remoteip is None: raise ValueError("missing remote IP required for GRE TAP device") - self.net_client.create_gretap( - self.localname, str(remoteip), str(localip), str(ttl), str(key) - ) + if localip is not None: + localip = str(localip) + if ttl is not None: + ttl = str(ttl) + if key is not None: + key = str(key) + self.net_client.create_gretap(self.localname, str(remoteip), localip, ttl, key) self.net_client.device_up(self.localname) self.up = True From 4e4fcddd00322d9d0e23cd9c8d027edb0935ff6f Mon Sep 17 00:00:00 2001 From: bharnden <32446120+bharnden@users.noreply.github.com> Date: Sat, 12 Oct 2019 08:56:39 -0700 Subject: [PATCH 4/5] added grpc api for creating emane link/unlink messages, which will be sent to the gui for being added/removed --- daemon/core/api/grpc/client.py | 15 +++++++++ daemon/core/api/grpc/server.py | 46 ++++++++++++++++++++++++++- daemon/proto/core/api/grpc/core.proto | 13 ++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/daemon/core/api/grpc/client.py b/daemon/core/api/grpc/client.py index dfb96d21..2d767993 100644 --- a/daemon/core/api/grpc/client.py +++ b/daemon/core/api/grpc/client.py @@ -864,6 +864,21 @@ class CoreGrpcClient(object): request = core_pb2.OpenXmlRequest(data=data) return self.stub.OpenXml(request) + def emane_link(self, session_id, nem_one, nem_two, linked): + """ + Helps broadcast wireless link/unlink between EMANE nodes. + + :param int session_id: session id + :param int nem_one: + :param int nem_two: + :param bool linked: True to link, False to unlink + :return: core_pb2.EmaneLinkResponse + """ + request = core_pb2.EmaneLinkRequest( + session_id=session_id, nem_one=nem_one, nem_two=nem_two, linked=linked + ) + return self.stub.EmaneLink(request) + def connect(self): """ Open connection to server, must be closed manually. diff --git a/daemon/core/api/grpc/server.py b/daemon/core/api/grpc/server.py index 7fb6ed31..c438a414 100644 --- a/daemon/core/api/grpc/server.py +++ b/daemon/core/api/grpc/server.py @@ -21,7 +21,7 @@ from core.emulator.data import ( NodeData, ) from core.emulator.emudata import InterfaceData, LinkOptions, NodeOptions -from core.emulator.enumerations import EventTypes, LinkTypes, NodeTypes +from core.emulator.enumerations import EventTypes, LinkTypes, MessageFlags, NodeTypes from core.errors import CoreError from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility from core.nodes.base import CoreNetworkBase @@ -1557,3 +1557,47 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer): continue interfaces.append(interface) return core_pb2.GetInterfacesResponse(interfaces=interfaces) + + def EmaneLink(self, request, context): + """ + Helps broadcast wireless link/unlink between EMANE nodes. + + :param core.api.grpc.core_pb2.EmaneLinkRequest request: get-interfaces request + :param grpc.ServicerContext context: context object + :return: emane link response with success status + :rtype: core.api.grpc.core_pb2.EmaneLinkResponse + """ + logging.debug("emane link: %s", request) + session = self.get_session(request.session_id, context) + nem_one = request.nem_one + emane_one, netif = session.emane.nemlookup(nem_one) + if not emane_one or not netif: + context.abort( + grpc.StatusCode.NOT_FOUND, "nem one {} not found".format(nem_one) + ) + node_one = netif.node + + nem_two = request.nem_two + emane_two, netif = session.emane.nemlookup(nem_two) + if not emane_two or not netif: + context.abort( + grpc.StatusCode.NOT_FOUND, "nem two {} not found".format(nem_two) + ) + node_two = netif.node + + if emane_one.id == emane_two.id: + if request.linked: + flag = MessageFlags.ADD.value + else: + flag = MessageFlags.DELETE.value + link = LinkData( + message_type=flag, + link_type=LinkTypes.WIRELESS.value, + node1_id=node_one.id, + node2_id=node_two.id, + network_id=emane_one.id, + ) + session.broadcast_link(link) + return core_pb2.EmaneLinkResponse(result=True) + else: + return core_pb2.EmaneLinkResponse(result=False) diff --git a/daemon/proto/core/api/grpc/core.proto b/daemon/proto/core/api/grpc/core.proto index 91049f40..68c83ad2 100644 --- a/daemon/proto/core/api/grpc/core.proto +++ b/daemon/proto/core/api/grpc/core.proto @@ -119,6 +119,8 @@ service CoreApi { // utilities rpc GetInterfaces (GetInterfacesRequest) returns (GetInterfacesResponse) { } + rpc EmaneLink (EmaneLinkRequest) returns (EmaneLinkResponse) { + } } // rpc request/response messages @@ -633,6 +635,17 @@ message GetInterfacesResponse { repeated string interfaces = 1; } +message EmaneLinkRequest { + int32 session_id = 1; + int32 nem_one = 2; + int32 nem_two = 3; + bool linked = 4; +} + +message EmaneLinkResponse { + bool result = 1; +} + // data structures for messages below message MessageType { enum Enum { From a93763f4a7593a5435ee2e157e6863a3095a36d5 Mon Sep 17 00:00:00 2001 From: bharnden <32446120+bharnden@users.noreply.github.com> Date: Sat, 12 Oct 2019 08:57:14 -0700 Subject: [PATCH 5/5] bump version for release --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 045425c8..fec902a3 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. # this defines the CORE version number, must be static for AC_INIT -AC_INIT(core, 5.5.1) +AC_INIT(core, 5.5.2) # autoconf and automake initialization AC_CONFIG_SRCDIR([netns/version.h.in])