summaryrefslogtreecommitdiff
path: root/lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c')
-rw-r--r--lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c472
1 files changed, 9 insertions, 463 deletions
diff --git a/lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c b/lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c
index db35a632..dfed5863 100644
--- a/lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c
+++ b/lib/avtp_pipeline/platform/Linux/endpoint/openavb_endpoint_osal.c
@@ -1,5 +1,6 @@
/*************************************************************************************************************
Copyright (c) 2012-2015, Symphony Teleca Corporation, a Harman International Industries, Incorporated company
+Copyright (c) 2016-2017, Harman International Industries, Incorporated
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -30,14 +31,11 @@ https://github.com/benhoyt/inih/commit/74d2ca064fb293bc60a77b0bd068075b293cf175.
#include <stdlib.h>
#include <string.h>
+
#include "openavb_platform.h"
#include "openavb_trace.h"
#include "openavb_endpoint.h"
#include "openavb_endpoint_cfg.h"
-#include "openavb_srp.h"
-#include "openavb_maap.h"
-#include "mrp_client.h"
-#include "openavb_list.h"
#include "openavb_rawsock.h"
#define AVB_LOG_COMPONENT "Endpoint"
@@ -51,37 +49,6 @@ extern bool endpointRunning;
static pthread_t endpointServerHandle;
static void* endpointServerThread(void *arg);
-inline int startPTP(void)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);
-
- // make sure ptp, a seperate process, starts and is using the same interface as endpoint
- int retVal = 0;
-// char ptpCmd[80];
-// memset(ptpCmd, 0, 80);
-// snprintf(ptpCmd, 80, "./openavb_gptp %s -i %s &", x_cfg.ptp_start_opts, x_cfg.ifname);
-// AVB_LOGF_INFO("PTP start command: %s", ptpCmd);
-// if (system(ptpCmd) != 0) {
-// AVB_LOG_ERROR("PTP failed to start - Exiting");
-// retVal = -1;
-// }
-
- AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
- return retVal;
-}
-
-inline int stopPTP(void)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);
-
- int retVal = 0;
-// if (system("killall -s SIGINT openavb_gptp") != 0) {
-// retVal = -1;
-// }
-
- AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
- return retVal;
-}
bool startEndpoint(int mode, int ifindex, const char* ifname, unsigned mtu, unsigned link_kbit, unsigned nsr_kbit)
{
@@ -101,19 +68,20 @@ bool startEndpoint(int mode, int ifindex, const char* ifname, unsigned mtu, unsi
x_cfg.fqtss_mode = mode;
x_cfg.ifindex = ifindex;
x_cfg.mtu = mtu;
- if (ifname)
- strncpy(x_cfg.ifname, ifname, sizeof(x_cfg.ifname));
+
+ x_cfg.link_kbit = link_kbit;
+ x_cfg.nsr_kbit = nsr_kbit;
+
+ openavbReadConfig(DEFAULT_INI_FILE, DEFAULT_SAVE_INI_FILE, &x_cfg);
if_info_t ifinfo;
- if (openavbCheckInterface(x_cfg.ifname, &ifinfo)) {
+ if (ifname && openavbCheckInterface(ifname, &ifinfo)) {
+ strncpy(x_cfg.ifname, ifname, sizeof(x_cfg.ifname));
memcpy(x_cfg.ifmac, &ifinfo.mac, ETH_ALEN);
x_cfg.ifindex = ifinfo.index;
x_cfg.mtu = ifinfo.mtu;
}
- x_cfg.link_kbit = link_kbit;
- x_cfg.nsr_kbit = nsr_kbit;
-
endpointRunning = TRUE;
int err = pthread_create(&endpointServerHandle, NULL, endpointServerThread, NULL);
if (err) {
@@ -158,425 +126,3 @@ static void* endpointServerThread(void *arg)
AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
return NULL;
}
-
-
-/*******************************************************************************
- * SRP proxies
- ******************************************************************************/
-
-static strmAttachCb_t _attachCb = NULL;
-static strmRegCb_t _registerCb = NULL;
-
-typedef struct {
- void* avtpHandle;
- bool talker;
- U8 streamId[8];
- U8 destAddr[6];
- U16 vlanId;
- int maxFrameSize;
- int maxIntervalFrames;
- int priority;
- int latency;
- int subtype;
-} strElem_t;
-
-openavb_list_t strElemList;
-
-#define SID_FORMAT "%02x:%02x:%02x:%02x:%02x:%02x/%d"
-#define SID_OCTETS(a) (a)[0],(a)[1],(a)[2],(a)[3],(a)[4],(a)[5],(a)[6]<<8|(a)[7]
-
-void mrp_attach_cb(unsigned char streamid[8], int subtype)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
-
- AVB_LOGF_DEBUG("mrp_attach_cb "SID_FORMAT" subtype %d", SID_OCTETS(streamid), subtype);
-
- if (_attachCb) {
- openavb_list_node_t node = openavbListIterFirst(strElemList);
- while (node) {
- strElem_t *elem = openavbListData(node);
- if (elem && elem->talker && memcmp(streamid, elem->streamId, sizeof(elem->streamId)) == 0) {
- if (elem->subtype != subtype) {
- _attachCb(elem->avtpHandle, subtype);
- elem->subtype = subtype;
- }
- break;
- }
- node = openavbListIterNext(strElemList);
- }
- if (!node)
- AVB_LOG_DEBUG("attach_cb stream not ours");
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
-}
-
-void mrp_register_cb(unsigned char streamid[8], int join, unsigned char destaddr[6], unsigned int max_frame_size, unsigned int max_interval_frames, uint16_t vid, unsigned int latency)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
-
- AVB_LOGF_DEBUG("mrp_register_cb "SID_FORMAT" "ETH_FORMAT" join %d max_frame_size %d max_interval_frames %d vid %d latency %d",
- SID_OCTETS(streamid), ETH_OCTETS(destaddr), join, max_frame_size, max_interval_frames, vid, latency);
-
- if (_registerCb) {
- openavb_list_node_t node = openavbListIterFirst(strElemList);
- while (node) {
- strElem_t *elem = openavbListData(node);
- if (elem && !elem->talker && memcmp(streamid, elem->streamId, sizeof(elem->streamId)) == 0) {
- if (elem->subtype != join) {
- AVBTSpec_t tSpec;
- tSpec.maxFrameSize = max_frame_size;
- tSpec.maxIntervalFrames = max_interval_frames;
- _registerCb(elem->avtpHandle,
- join ? openavbSrp_AtTyp_TalkerAdvertise : openavbSrp_AtTyp_None,
- destaddr,
- &tSpec,
- 0, // SR_CLASS is ignored anyway
- latency,
- NULL
- );
- elem->subtype = join;
- }
- break;
- }
- node = openavbListIterNext(strElemList);
- }
- if (!node)
- AVB_LOG_DEBUG("register_cb stream not ours");
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
-}
-
-openavbRC openavbSrpInitialize(strmAttachCb_t attachCb, strmRegCb_t registerCb,
- char* ifname, U32 TxRateKbps, bool bypassAsCapableCheck)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
- int err;
-
- strElemList = openavbListNewList();
-
- _attachCb = attachCb;
- _registerCb = registerCb;
-
-
- err = mrp_connect();
- if (err) {
- AVB_LOGF_ERROR("mrp_connect failed: %s", strerror(errno));
- goto error;
- }
- err = mrp_monitor();
- if (err) {
- AVB_LOGF_ERROR("failed creating MRP monitor thread: %s", strerror(errno));
- goto error;
- }
-
- int class_a_id, a_priority;
- u_int16_t a_vid;
- int class_b_id, b_priority;
- u_int16_t b_vid;
-
- err = mrp_get_domain(&class_a_id,&a_priority, &a_vid, &class_b_id, &b_priority, &b_vid);
- if (err) {
- AVB_LOG_DEBUG("mrp_get_domain failed");
- goto error;
- }
-
- AVB_LOGF_INFO("detected domain Class A PRIO=%d VID=%04x...", a_priority, (int)a_vid);
- AVB_LOGF_INFO("detected domain Class B PRIO=%d VID=%04x...", b_priority, (int)b_vid);
-
- err = mrp_register_domain(&domain_class_a_id, &domain_class_a_priority, &domain_class_a_vid);
- if (err) {
- AVB_LOG_DEBUG("mrp_register_domain failed");
- goto error;
- }
-
- err = mrp_register_domain(&domain_class_b_id, &domain_class_b_priority, &domain_class_b_vid);
- if (err) {
- AVB_LOG_DEBUG("mrp_register_domain failed");
- goto error;
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-
-error:
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_FAILURE;
-}
-
-void openavbSrpShutdown(void)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
- int err = mrp_disconnect();
- if (err) {
- AVB_LOGF_ERROR("mrp_disconnect failed: %s", strerror(errno));
- }
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
-}
-
-openavbRC openavbSrpRegisterStream(void* avtpHandle,
- AVBStreamID_t* _streamId,
- U8 DA[],
- AVBTSpec_t* tSpec,
- SRClassIdx_t SRClassIdx,
- bool Rank,
- U32 Latency)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
- int err;
-
- // convert streamId to 8 byte format
- uint8_t streamId[8];
- memcpy(streamId, _streamId->addr, sizeof(_streamId->addr));
- streamId[6] = _streamId->uniqueID >> 8;
- streamId[7] = _streamId->uniqueID & 0xFF;
-
- openavb_list_node_t node = openavbListNew(strElemList, sizeof(strElem_t));
- strElem_t* elem = openavbListData(node);
-
- elem->avtpHandle = avtpHandle;
- elem->talker = true;
- memcpy(elem->streamId, streamId, sizeof(elem->streamId));
- memcpy(elem->destAddr, DA, sizeof(elem->destAddr));
- elem->maxFrameSize = tSpec->maxFrameSize;
- elem->maxIntervalFrames = tSpec->maxIntervalFrames;
- elem->latency = Latency;
- elem->subtype = openavbSrp_LDSt_None;
-
- switch (SRClassIdx) {
- case SR_CLASS_A:
- elem->vlanId = domain_class_a_vid;
- elem->priority = domain_class_a_priority;
-
- err = mrp_advertise_stream(streamId,
- DA,
- domain_class_a_vid,
- tSpec->maxFrameSize,
- tSpec->maxIntervalFrames,
- domain_class_a_priority,
- Latency);
- break;
- case SR_CLASS_B:
- elem->vlanId = domain_class_b_vid;
- elem->priority = domain_class_b_priority;
-
- err = mrp_advertise_stream(streamId,
- DA,
- domain_class_b_vid,
- tSpec->maxFrameSize,
- tSpec->maxIntervalFrames,
- domain_class_b_priority,
- Latency);
- break;
- default:
- AVB_LOGF_ERROR("unknown SRClassIdx %d", (int)SRClassIdx);
- goto error;
- }
-
- if (err) {
- AVB_LOG_ERROR("mrp_advertise_stream failed");
- goto error;
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-
-error:
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_FAILURE;
-}
-
-openavbRC openavbSrpDeregisterStream(AVBStreamID_t* _streamId)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
-
- // convert streamId to 8 byte format
- uint8_t streamId[8];
- memcpy(streamId, _streamId->addr, sizeof(_streamId->addr));
- streamId[6] = _streamId->uniqueID >> 8;
- streamId[7] = _streamId->uniqueID & 0xFF;
-
- openavb_list_node_t node = openavbListIterFirst(strElemList);
- while (node) {
- strElem_t *elem = openavbListData(node);
- if (elem && memcmp(streamId, elem->streamId, sizeof(elem->streamId)) == 0) {
- int err = mrp_unadvertise_stream(elem->streamId, elem->destAddr, elem->vlanId, elem->maxFrameSize, elem->maxIntervalFrames, elem->priority, elem->latency);
- if (err) {
- AVB_LOG_ERROR("mrp_unadvertise_stream failed");
- }
- openavbListDelete(strElemList, node);
- break;
- }
- node = openavbListIterNext(strElemList);
- }
- if (!node)
- AVB_LOGF_ERROR("%s: unknown stream "SID_FORMAT, __func__, SID_OCTETS(streamId));
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-}
-
-openavbRC openavbSrpAttachStream(void* avtpHandle,
- AVBStreamID_t* _streamId,
- openavbSrpLsnrDeclSubtype_t type)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
-
- // convert streamId to 8 byte format
- uint8_t streamId[8];
- memcpy(streamId, _streamId->addr, sizeof(_streamId->addr));
- streamId[6] = _streamId->uniqueID >> 8;
- streamId[7] = _streamId->uniqueID & 0xFF;
-
- AVB_LOGF_DEBUG("openavbSrpAttachStream "SID_FORMAT, SID_OCTETS(streamId));
-
- openavb_list_node_t node = openavbListIterFirst(strElemList);
- // lets check if this streamId is on our list
- while (node) {
- strElem_t *elem = openavbListData(node);
- if (elem && memcmp(streamId, elem->streamId, sizeof(elem->streamId)) == 0) {
- break;
- }
- node = openavbListIterNext(strElemList);
- }
- if (!node) {
- // not found so add it
- node = openavbListNew(strElemList, sizeof(strElem_t));
- strElem_t* elem = openavbListData(node);
-
- elem->avtpHandle = avtpHandle;
- elem->talker = false;
- memcpy(elem->streamId, streamId, sizeof(elem->streamId));
- elem->subtype = type;
- }
-
- int err = mrp_send_ready(streamId);
- if (err) {
- AVB_LOG_ERROR("mrp_send_ready failed");
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-}
-
-openavbRC openavbSrpDetachStream(AVBStreamID_t* _streamId)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
-
- // convert streamId to 8 byte format
- uint8_t streamId[8];
- memcpy(streamId, _streamId->addr, sizeof(_streamId->addr));
- streamId[6] = _streamId->uniqueID >> 8;
- streamId[7] = _streamId->uniqueID & 0xFF;
-
- AVB_LOGF_DEBUG("openavbSrpDetachStream "SID_FORMAT, SID_OCTETS(streamId));
-
- openavb_list_node_t node = openavbListIterFirst(strElemList);
- while (node) {
- strElem_t *elem = openavbListData(node);
- if (elem && memcmp(streamId, elem->streamId, sizeof(elem->streamId)) == 0) {
- int err = mrp_send_leave(streamId);
- if (err) {
- AVB_LOG_ERROR("mrp_send_leave failed");
- }
- openavbListDelete(strElemList, node);
- break;
- }
- node = openavbListIterNext(strElemList);
- }
- if (!node)
- AVB_LOGF_ERROR("%s: unknown stream "SID_FORMAT, __func__, SID_OCTETS(streamId));
-
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-}
-
-openavbRC openavbSrpGetClassParams(SRClassIdx_t SRClassIdx, U8* priority, U16* vid, U32* inverseIntervalSec)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_SRP_PUBLIC);
- switch (SRClassIdx) {
- case SR_CLASS_A:
- *priority = domain_class_a_priority;
- *vid = domain_class_a_vid;
- *inverseIntervalSec = 8000;
- break;
- case SR_CLASS_B:
- *priority = domain_class_b_priority;
- *vid = domain_class_b_vid;
- *inverseIntervalSec = 4000;
- break;
- default:
- AVB_LOGF_ERROR("unknown SRClassIdx %d", (int)SRClassIdx);
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_FAILURE;
- }
- AVB_TRACE_EXIT(AVB_TRACE_SRP_PUBLIC);
- return OPENAVB_SRP_SUCCESS;
-}
-
-
-/*******************************************************************************
- * MAAP proxies
- ******************************************************************************/
-
-// OPENAVB_TODO: Real implementation should be added once OpenAVB's MAAP daemon is finished
-
-typedef struct {
- U8 destAddr[ETH_ALEN];
- bool taken;
-} maapAlloc_t;
-
-maapAlloc_t maapAllocList[MAX_AVB_STREAMS];
-
-bool openavbMaapInitialize(const char *ifname, openavbMaapRestartCb_t* cbfn)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_MAAP);
- int i = 0;
- U8 destAddr[ETH_ALEN] = {0x91, 0xe0, 0xf0, 0x00, 0x0e, 0x80};
- for (i = 0; i < MAX_AVB_STREAMS; i++) {
- memcpy(maapAllocList[i].destAddr, destAddr, ETH_ALEN);
- maapAllocList[i].taken = false;
- destAddr[5] += 1;
- }
- AVB_TRACE_EXIT(AVB_TRACE_MAAP);
- return true;
-}
-
-void openavbMaapFinalize()
-{
- AVB_TRACE_ENTRY(AVB_TRACE_MAAP);
- AVB_TRACE_EXIT(AVB_TRACE_MAAP);
-
-}
-
-void* openavbMaapAllocate(int count, /* out */ struct ether_addr *addr)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_MAAP);
- assert(count == 1);
-
- int i = 0;
- while (i < MAX_AVB_STREAMS && maapAllocList[i].taken) {
- i++;
- }
-
- if (i < MAX_AVB_STREAMS) {
- maapAllocList[i].taken = true;
- memcpy(addr, maapAllocList[i].destAddr, ETH_ALEN);
-
- AVB_TRACE_EXIT(AVB_TRACE_MAAP);
- return &maapAllocList[i];
- }
-
- AVB_TRACE_EXIT(AVB_TRACE_MAAP);
- return NULL;
-}
-
-void openavbMaapRelease(void* handle)
-{
- AVB_TRACE_ENTRY(AVB_TRACE_MAAP);
-
- maapAlloc_t *elem = handle;
- elem->taken = false;
-
- AVB_TRACE_EXIT(AVB_TRACE_MAAP);
-}