Skip to content

Commit e74481d

Browse files
authored
Merge pull request #463 from coreemu/enhancement/grpc-emane-pathloss
grpc: implemened initial support for streaming emane pathloss events
2 parents 7048aa7 + 3b0ca16 commit e74481d

File tree

6 files changed

+85
-3
lines changed

6 files changed

+85
-3
lines changed

daemon/core/api/grpc/client.py

+13
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
EmaneLinkRequest,
3232
EmaneLinkResponse,
3333
EmaneModelConfig,
34+
EmanePathlossesRequest,
35+
EmanePathlossesResponse,
3436
GetEmaneConfigRequest,
3537
GetEmaneConfigResponse,
3638
GetEmaneEventChannelRequest,
@@ -1229,6 +1231,17 @@ def wlan_link(
12291231
)
12301232
return self.stub.WlanLink(request)
12311233

1234+
def emane_pathlosses(
1235+
self, pathloss_iter: Iterable[EmanePathlossesRequest]
1236+
) -> EmanePathlossesResponse:
1237+
"""
1238+
Stream EMANE pathloss events.
1239+
1240+
:param pathloss_iter: iterator for sending EMANE pathloss events
1241+
:return: EMANE pathloss response
1242+
"""
1243+
return self.stub.EmanePathlosses(pathloss_iter)
1244+
12321245
def connect(self) -> None:
12331246
"""
12341247
Open connection to server, must be closed manually.

daemon/core/api/grpc/grpcutils.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
import time
33
from typing import Any, Dict, List, Tuple, Type
44

5+
import grpc
56
import netaddr
7+
from grpc import ServicerContext
68

79
from core import utils
810
from core.api.grpc import common_pb2, core_pb2
@@ -13,7 +15,7 @@
1315
from core.emulator.emudata import InterfaceData, LinkOptions, NodeOptions
1416
from core.emulator.enumerations import LinkTypes, NodeTypes
1517
from core.emulator.session import Session
16-
from core.nodes.base import NodeBase
18+
from core.nodes.base import CoreNode, NodeBase
1719
from core.nodes.interface import CoreInterface
1820
from core.services.coreservices import CoreService
1921

@@ -478,3 +480,23 @@ def interface_to_proto(interface: CoreInterface) -> core_pb2.Interface:
478480
ip6=ip6,
479481
ip6mask=ip6mask,
480482
)
483+
484+
485+
def get_nem_id(node: CoreNode, netif_id: int, context: ServicerContext) -> int:
486+
"""
487+
Get nem id for a given node and interface id.
488+
489+
:param node: node to get nem id for
490+
:param netif_id: id of interface on node to get nem id for
491+
:param context: request context
492+
:return: nem id
493+
"""
494+
netif = node.netif(netif_id)
495+
if not netif:
496+
message = f"{node.name} missing interface {netif_id}"
497+
context.abort(grpc.StatusCode.NOT_FOUND, message)
498+
net = netif.net
499+
if not isinstance(net, EmaneNet):
500+
message = f"{node.name} interface {netif_id} is not an EMANE network"
501+
context.abort(grpc.StatusCode.INVALID_ARGUMENT, message)
502+
return net.getnemid(netif)

daemon/core/api/grpc/server.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import threading
77
import time
88
from concurrent import futures
9-
from typing import Type
9+
from typing import Iterable, Type
1010

1111
import grpc
1212
from grpc import ServicerContext
@@ -39,6 +39,8 @@
3939
from core.api.grpc.emane_pb2 import (
4040
EmaneLinkRequest,
4141
EmaneLinkResponse,
42+
EmanePathlossesRequest,
43+
EmanePathlossesResponse,
4244
GetEmaneConfigRequest,
4345
GetEmaneConfigResponse,
4446
GetEmaneEventChannelRequest,
@@ -1751,3 +1753,17 @@ def WlanLink(
17511753
wlan.model.sendlinkmsg(n1_netif, n2_netif, unlink=not request.linked)
17521754
result = True
17531755
return WlanLinkResponse(result=result)
1756+
1757+
def EmanePathlosses(
1758+
self,
1759+
request_iterator: Iterable[EmanePathlossesRequest],
1760+
context: ServicerContext,
1761+
) -> EmanePathlossesResponse:
1762+
for request in request_iterator:
1763+
session = self.get_session(request.session_id, context)
1764+
n1 = self.get_node(session, request.node_one, context, CoreNode)
1765+
nem1 = grpcutils.get_nem_id(n1, request.interface_one_id, context)
1766+
n2 = self.get_node(session, request.node_two, context, CoreNode)
1767+
nem2 = grpcutils.get_nem_id(n2, request.interface_two_id, context)
1768+
session.emane.publish_pathloss(nem1, nem2, request.rx_one, request.rx_two)
1769+
return EmanePathlossesResponse()

daemon/core/emane/emanemanager.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from core.emulator.session import Session
3838

3939
try:
40-
from emane.events import EventService
40+
from emane.events import EventService, PathlossEvent
4141
from emane.events import LocationEvent
4242
from emane.events.eventserviceexception import EventServiceException
4343
except ImportError:
@@ -48,6 +48,7 @@
4848
except ImportError:
4949
EventService = None
5050
LocationEvent = None
51+
PathlossEvent = None
5152
EventServiceException = None
5253
logging.debug("compatible emane python bindings not installed")
5354

@@ -868,6 +869,21 @@ def emanerunning(self, node: CoreNode) -> bool:
868869
result = False
869870
return result
870871

872+
def publish_pathloss(self, nem1: int, nem2: int, rx1: float, rx2: float) -> None:
873+
"""
874+
Publish pathloss events between provided nems, using provided rx power.
875+
:param nem1: interface one for pathloss
876+
:param nem2: interface two for pathloss
877+
:param rx1: received power from nem2 to nem1
878+
:param rx2: received power from nem1 to nem2
879+
:return: nothing
880+
"""
881+
event = PathlossEvent()
882+
event.append(nem1, forward=rx1)
883+
event.append(nem2, forward=rx2)
884+
self.service.publish(nem1, event)
885+
self.service.publish(nem2, event)
886+
871887

872888
class EmaneGlobalModel:
873889
"""

daemon/proto/core/api/grpc/core.proto

+2
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ service CoreApi {
149149
}
150150
rpc GetEmaneEventChannel (emane.GetEmaneEventChannelRequest) returns (emane.GetEmaneEventChannelResponse) {
151151
}
152+
rpc EmanePathlosses (stream emane.EmanePathlossesRequest) returns (emane.EmanePathlossesResponse) {
153+
}
152154

153155
// xml rpc
154156
rpc SaveXml (SaveXmlRequest) returns (SaveXmlResponse) {

daemon/proto/core/api/grpc/emane.proto

+13
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,16 @@ message EmaneModelConfig {
9090
string model = 3;
9191
map<string, string> config = 4;
9292
}
93+
94+
message EmanePathlossesRequest {
95+
int32 session_id = 1;
96+
int32 node_one = 2;
97+
float rx_one = 3;
98+
int32 interface_one_id = 4;
99+
int32 node_two = 5;
100+
float rx_two = 6;
101+
int32 interface_two_id = 7;
102+
}
103+
104+
message EmanePathlossesResponse {
105+
}

0 commit comments

Comments
 (0)