added grpc call to allow direct control of nodes connected through wlan to be linked or not

This commit is contained in:
Blake Harnden 2020-05-19 16:46:44 -07:00
parent 8bae0611a4
commit d14056393b
5 changed files with 65 additions and 6 deletions

View file

@ -88,6 +88,8 @@ from core.api.grpc.wlan_pb2 import (
GetWlanConfigsResponse, GetWlanConfigsResponse,
SetWlanConfigRequest, SetWlanConfigRequest,
SetWlanConfigResponse, SetWlanConfigResponse,
SetWlanLinkRequest,
SetWlanLinkResponse,
WlanConfig, WlanConfig,
) )
@ -1204,6 +1206,18 @@ class CoreGrpcClient:
request = ExecuteScriptRequest(script=script) request = ExecuteScriptRequest(script=script)
return self.stub.ExecuteScript(request) return self.stub.ExecuteScript(request)
def set_wlan_link(
self, session_id: int, wlan: int, node_one: int, node_two: int, linked: bool
) -> SetWlanLinkResponse:
request = SetWlanLinkRequest(
session_id=session_id,
wlan=wlan,
node_one=node_one,
node_two=node_two,
linked=linked,
)
return self.stub.SetWlanLink(request)
def connect(self) -> None: def connect(self) -> None:
""" """
Open connection to server, must be closed manually. Open connection to server, must be closed manually.

View file

@ -102,6 +102,8 @@ from core.api.grpc.wlan_pb2 import (
GetWlanConfigsResponse, GetWlanConfigsResponse,
SetWlanConfigRequest, SetWlanConfigRequest,
SetWlanConfigResponse, SetWlanConfigResponse,
SetWlanLinkRequest,
SetWlanLinkResponse,
) )
from core.emulator.coreemu import CoreEmu from core.emulator.coreemu import CoreEmu
from core.emulator.data import LinkData from core.emulator.data import LinkData
@ -111,6 +113,7 @@ from core.emulator.session import Session
from core.errors import CoreCommandError, CoreError from core.errors import CoreCommandError, CoreError
from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility
from core.nodes.base import CoreNodeBase, NodeBase from core.nodes.base import CoreNodeBase, NodeBase
from core.nodes.network import WlanNode
from core.services.coreservices import ServiceManager from core.services.coreservices import ServiceManager
_ONE_DAY_IN_SECONDS = 60 * 60 * 24 _ONE_DAY_IN_SECONDS = 60 * 60 * 24
@ -177,7 +180,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param session: session that has the node :param session: session that has the node
:param node_id: node id :param node_id: node id
:param context: :param context: request
:return: node object that satisfies. If node not found then raise an exception. :return: node object that satisfies. If node not found then raise an exception.
:raises Exception: raises grpc exception when node does not exist :raises Exception: raises grpc exception when node does not exist
""" """
@ -1684,3 +1687,35 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
if new_sessions: if new_sessions:
new_session = new_sessions[0] new_session = new_sessions[0]
return ExecuteScriptResponse(session_id=new_session) return ExecuteScriptResponse(session_id=new_session)
def SetWlanLink(
self, request: SetWlanLinkRequest, context: ServicerContext
) -> SetWlanLinkResponse:
session = self.get_session(request.session_id, context)
wlan = self.get_node(session, request.wlan, context)
if not isinstance(wlan, WlanNode):
context.abort(
grpc.StatusCode.NOT_FOUND, f"wlan id {request.wlan} is not a wlan node"
)
if not isinstance(wlan.model, BasicRangeModel):
context.abort(
grpc.StatusCode.NOT_FOUND,
f"wlan node {request.wlan} does not using BasicRangeModel",
)
n1 = self.get_node(session, request.node_one, context)
n2 = self.get_node(session, request.node_two, context)
n1_netif, n2_netif = None, None
for net, netif1, netif2 in n1.commonnets(n2):
if net == wlan:
n1_netif = netif1
n2_netif = netif2
break
if n1_netif and n2_netif:
if request.linked:
wlan.link(n1_netif, n2_netif)
else:
wlan.unlink(n1_netif, n2_netif)
wlan.model.sendlinkmsg(n1_netif, n2_netif, unlink=not request.linked)
return SetWlanLinkResponse(result=True)
else:
return SetWlanLinkResponse(result=False)

View file

@ -509,11 +509,7 @@ class BasicRangeModel(WirelessModel):
:param unlink: unlink or not :param unlink: unlink or not
:return: nothing :return: nothing
""" """
if unlink: message_type = MessageFlags.DELETE if unlink else MessageFlags.ADD
message_type = MessageFlags.DELETE
else:
message_type = MessageFlags.ADD
link_data = self.create_link_data(netif, netif2, message_type) link_data = self.create_link_data(netif, netif2, message_type)
self.session.broadcast_link(link_data) self.session.broadcast_link(link_data)

View file

@ -129,6 +129,8 @@ service CoreApi {
} }
rpc SetWlanConfig (wlan.SetWlanConfigRequest) returns (wlan.SetWlanConfigResponse) { rpc SetWlanConfig (wlan.SetWlanConfigRequest) returns (wlan.SetWlanConfigResponse) {
} }
rpc SetWlanLink (wlan.SetWlanLinkRequest) returns (wlan.SetWlanLinkResponse) {
}
// emane rpc // emane rpc
rpc GetEmaneConfig (emane.GetEmaneConfigRequest) returns (emane.GetEmaneConfigResponse) { rpc GetEmaneConfig (emane.GetEmaneConfigRequest) returns (emane.GetEmaneConfigResponse) {

View file

@ -34,3 +34,15 @@ message SetWlanConfigRequest {
message SetWlanConfigResponse { message SetWlanConfigResponse {
bool result = 1; bool result = 1;
} }
message SetWlanLinkRequest {
int32 session_id = 1;
int32 wlan = 2;
int32 node_one = 3;
int32 node_two = 4;
bool linked = 5;
}
message SetWlanLinkResponse {
bool result = 1;
}