grpc: implemened initial support for streaming emane pathloss events
This commit is contained in:
parent
7048aa7867
commit
3b0ca1638c
6 changed files with 85 additions and 3 deletions
|
@ -31,6 +31,8 @@ from core.api.grpc.emane_pb2 import (
|
|||
EmaneLinkRequest,
|
||||
EmaneLinkResponse,
|
||||
EmaneModelConfig,
|
||||
EmanePathlossesRequest,
|
||||
EmanePathlossesResponse,
|
||||
GetEmaneConfigRequest,
|
||||
GetEmaneConfigResponse,
|
||||
GetEmaneEventChannelRequest,
|
||||
|
@ -1229,6 +1231,17 @@ class CoreGrpcClient:
|
|||
)
|
||||
return self.stub.WlanLink(request)
|
||||
|
||||
def emane_pathlosses(
|
||||
self, pathloss_iter: Iterable[EmanePathlossesRequest]
|
||||
) -> EmanePathlossesResponse:
|
||||
"""
|
||||
Stream EMANE pathloss events.
|
||||
|
||||
:param pathloss_iter: iterator for sending EMANE pathloss events
|
||||
:return: EMANE pathloss response
|
||||
"""
|
||||
return self.stub.EmanePathlosses(pathloss_iter)
|
||||
|
||||
def connect(self) -> None:
|
||||
"""
|
||||
Open connection to server, must be closed manually.
|
||||
|
|
|
@ -2,7 +2,9 @@ import logging
|
|||
import time
|
||||
from typing import Any, Dict, List, Tuple, Type
|
||||
|
||||
import grpc
|
||||
import netaddr
|
||||
from grpc import ServicerContext
|
||||
|
||||
from core import utils
|
||||
from core.api.grpc import common_pb2, core_pb2
|
||||
|
@ -13,7 +15,7 @@ from core.emulator.data import LinkData
|
|||
from core.emulator.emudata import InterfaceData, LinkOptions, NodeOptions
|
||||
from core.emulator.enumerations import LinkTypes, NodeTypes
|
||||
from core.emulator.session import Session
|
||||
from core.nodes.base import NodeBase
|
||||
from core.nodes.base import CoreNode, NodeBase
|
||||
from core.nodes.interface import CoreInterface
|
||||
from core.services.coreservices import CoreService
|
||||
|
||||
|
@ -478,3 +480,23 @@ def interface_to_proto(interface: CoreInterface) -> core_pb2.Interface:
|
|||
ip6=ip6,
|
||||
ip6mask=ip6mask,
|
||||
)
|
||||
|
||||
|
||||
def get_nem_id(node: CoreNode, netif_id: int, context: ServicerContext) -> int:
|
||||
"""
|
||||
Get nem id for a given node and interface id.
|
||||
|
||||
:param node: node to get nem id for
|
||||
:param netif_id: id of interface on node to get nem id for
|
||||
:param context: request context
|
||||
:return: nem id
|
||||
"""
|
||||
netif = node.netif(netif_id)
|
||||
if not netif:
|
||||
message = f"{node.name} missing interface {netif_id}"
|
||||
context.abort(grpc.StatusCode.NOT_FOUND, message)
|
||||
net = netif.net
|
||||
if not isinstance(net, EmaneNet):
|
||||
message = f"{node.name} interface {netif_id} is not an EMANE network"
|
||||
context.abort(grpc.StatusCode.INVALID_ARGUMENT, message)
|
||||
return net.getnemid(netif)
|
||||
|
|
|
@ -6,7 +6,7 @@ import tempfile
|
|||
import threading
|
||||
import time
|
||||
from concurrent import futures
|
||||
from typing import Type
|
||||
from typing import Iterable, Type
|
||||
|
||||
import grpc
|
||||
from grpc import ServicerContext
|
||||
|
@ -39,6 +39,8 @@ from core.api.grpc.core_pb2 import ExecuteScriptResponse
|
|||
from core.api.grpc.emane_pb2 import (
|
||||
EmaneLinkRequest,
|
||||
EmaneLinkResponse,
|
||||
EmanePathlossesRequest,
|
||||
EmanePathlossesResponse,
|
||||
GetEmaneConfigRequest,
|
||||
GetEmaneConfigResponse,
|
||||
GetEmaneEventChannelRequest,
|
||||
|
@ -1751,3 +1753,17 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
|||
wlan.model.sendlinkmsg(n1_netif, n2_netif, unlink=not request.linked)
|
||||
result = True
|
||||
return WlanLinkResponse(result=result)
|
||||
|
||||
def EmanePathlosses(
|
||||
self,
|
||||
request_iterator: Iterable[EmanePathlossesRequest],
|
||||
context: ServicerContext,
|
||||
) -> EmanePathlossesResponse:
|
||||
for request in request_iterator:
|
||||
session = self.get_session(request.session_id, context)
|
||||
n1 = self.get_node(session, request.node_one, context, CoreNode)
|
||||
nem1 = grpcutils.get_nem_id(n1, request.interface_one_id, context)
|
||||
n2 = self.get_node(session, request.node_two, context, CoreNode)
|
||||
nem2 = grpcutils.get_nem_id(n2, request.interface_two_id, context)
|
||||
session.emane.publish_pathloss(nem1, nem2, request.rx_one, request.rx_two)
|
||||
return EmanePathlossesResponse()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue