20 #include <sys/ioctl.h>
21 #include <sys/sysinfo.h>
26 #include "rdk_moca_hal.h"
29 #define RDK_FILE_PATH_VERSION "/version.txt"
30 #define RDK_FILE_PATH_DEBUG_ENABLE "/opt/rmh_start_enable_debug"
31 #define RDK_FILE_PATH_DEBUG_FOREVER_ENABLE "/opt/rmh_start_enable_debug_forever"
32 #define RDK_RFC_FILE "/etc/rfc.properties"
34 #define LOCAL_MODULATION_PRINT_LINE_SIZE 256
37 RMH_Result pRMH_IOCTL_Get(
const RMH_Handle handle,
const char* name,
struct ifreq *ifrq) {
39 RMH_Result ret=RMH_SUCCESS;
41 BRMH_RETURN_IF(!name, RMH_INVALID_PARAM)
42 BRMH_RETURN_IF((fd = socket(PF_INET6, SOCK_DGRAM, 0)) < 0, RMH_FAILURE);
44 strncpy(ifrq->ifr_name, name,
sizeof(ifrq->ifr_name));
45 ifrq->ifr_name[
sizeof(ifrq->ifr_name)-1 ] = 0;
46 rc = ioctl(fd, SIOCGIFFLAGS, ifrq);
48 RMH_PrintErr(
"ioctl SIOCGIFFLAGS returned %d!", rc);
57 RMH_Result pRMH_IOCTL_Set(
const RMH_Handle handle,
struct ifreq *ifrq) {
59 RMH_Result ret=RMH_SUCCESS;
61 BRMH_RETURN_IF((fd = socket(PF_INET6, SOCK_DGRAM, 0)) < 0, RMH_FAILURE);
62 rc = ioctl(fd, SIOCSIFFLAGS, ifrq);
64 RMH_PrintErr(
"ioctl SIOCSIFFLAGS returned %d!", rc);
77 while( tag[0] !=
'\0' && tag[0] ==
' ' ) tag++;
79 if (strlen(tag) > 0) {
80 for(i=0; i != hRMHGeneric_APITags.tagListSize; i++) {
81 if (strcasecmp(tag, hRMHGeneric_APITags.tagList[i].apiListName) == 0) {
82 *apiList=&hRMHGeneric_APITags.tagList[i];
86 if (hRMHGeneric_APITags.tagListSize < RMH_MAX_NUM_TAGS) {
87 *apiList=&hRMHGeneric_APITags.tagList[hRMHGeneric_APITags.tagListSize++];
88 (*apiList)->apiListSize=0;
89 strncpy((*apiList)->apiListName, tag,
sizeof((*apiList)->apiListName));
90 (*apiList)->apiListName[0]=toupper((*apiList)->apiListName[0]);
91 RMH_PrintDbg(
"New tag '%s' add. Total tags:%d\n", (*apiList)->apiListName, hRMHGeneric_APITags.tagListSize);
94 RMH_PrintWrn(
"Unable to find an existing tag '%s' and no more new tags are available. This will be dropped.\n", tag);
100 int pRMH_TagCompare(
const void* a,
const void* b) {
103 return strcasecmp(_a.apiListName, _b.apiListName);
106 RMH_Result pRMH_RFC_GetBool(
const RMH_Handle handle,
const char*name,
bool *value) {
107 RFC_ParamData_t rfcParam;
108 WDMP_STATUS wdmpStatus;
110 wdmpStatus = getRFCParameter(
"RMH", name, &rfcParam);
111 if (wdmpStatus != WDMP_SUCCESS) {
112 if (wdmpStatus != WDMP_ERR_VALUE_IS_EMPTY) {
113 RMH_PrintErr(
"Failed reading from RFC -- %s -- Returned error '%s' (%u)\n", rfcParam.name, getRFCErrorString(wdmpStatus), wdmpStatus);
119 if (0 == strcasecmp(rfcParam.value,
"TRUE")) {
122 else if (0 == strcasecmp(rfcParam.value,
"FALSE")) {
126 RMH_PrintErr(
"Unexpected value reading from RFC -- %s -- Returned '%s' which is type %u. Expecting type WDMP_BOOLEAN(%u)\n", rfcParam.name, rfcParam.value, getRFCErrorString(wdmpStatus), rfcParam.type, WDMP_BOOLEAN);
133 RMH_Result GENERIC_IMPL__RMH_Self_RestoreRDKDefaultSettings(
const RMH_Handle handle) {
140 RMH_PrintErr(
"MoCA must be stopped before setting RDK defaults\n");
141 return RMH_INVALID_INTERNAL_STATE;
149 RMH_PrintWrn(
"Unable to set default log level!\n");
152 if (access(RDK_FILE_PATH_DEBUG_FOREVER_ENABLE, F_OK ) != -1) {
153 char logFileName[1024];
155 RMH_PrintWrn(
"Unable to create dedicated log file!\n");
158 RMH_PrintWrn(
"Unable to start logging in %s!\n", logFileName);
161 RMH_PrintWrn(
"Failed to enable RMH_LOG_DEBUG!\n");
164 RMH_PrintMsg(
"Setting debug logging enabled to file %s\n", logFileName);
167 else if (access(RDK_FILE_PATH_DEBUG_ENABLE, F_OK ) != -1) {
169 RMH_PrintWrn(
"Unable to enable debug!\n");
172 RMH_PrintMsg(
"Setting debug logging enabled\n");
177 #ifdef RMH_START_DEFAULT_SINGLE_CHANEL
178 RMH_PrintMsg(
"Setting RMH_Self_SetLOF: %d\n", RMH_START_DEFAULT_SINGLE_CHANEL);
180 BRMH_RETURN_IF_FAILED(
RMH_Self_SetLOF(handle, RMH_START_DEFAULT_SINGLE_CHANEL));
183 #ifdef RMH_START_DEFAULT_POWER_REDUCTION
184 RMH_PrintMsg(
"Setting RMH_Power_SetTxBeaconPowerReduction: %d\n", RMH_START_DEFAULT_POWER_REDUCTION);
189 #if defined RMH_START_DEFAULT_TABOO_START_CHANNEL && defined RMH_START_DEFAULT_TABOO_MASK
190 RMH_PrintMsg(
"Setting RMH_Self_SetTabooChannels: Start:%d Channel Mask:0x%08x\n", RMH_START_DEFAULT_TABOO_START_CHANNEL, RMH_START_DEFAULT_TABOO_MASK);
191 BRMH_RETURN_IF_FAILED(
RMH_Self_SetTabooChannels(handle, RMH_START_DEFAULT_TABOO_START_CHANNEL, RMH_START_DEFAULT_TABOO_MASK));
194 if (RMH_SUCCESS == pRMH_RFC_GetBool(handle,
"Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.PNC.Enable", &rfcBool)) {
196 RMH_PrintMsg(
"[**RFC OVERRIDE**] Setting RMH_Self_SetPreferredNCEnabled: %s\n", rfcBool ?
"TRUE" :
"FALSE");
201 #ifdef RMH_START_DEFAULT_PREFERRED_NC
202 RMH_PrintMsg(
"Setting RMH_Self_SetPreferredNCEnabled: %s\n", RMH_START_DEFAULT_PREFERRED_NC ?
"TRUE" :
"FALSE");
207 #if RMH_START_SET_MAC_FROM_PROC
208 if (RMH_START_SET_MAC_FROM_PROC) {
210 unsigned char mac[6];
213 uint32_t macValsRead;
216 sprintf(ifacePath,
"/sys/class/net/%s/address", ethName);
217 file = fopen( ifacePath,
"r");
218 BRMH_RETURN_IF(file == NULL, RMH_FAILURE);
219 macValsRead=fscanf(file,
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
220 BRMH_RETURN_IF(macValsRead != 6, RMH_FAILURE);
222 RMH_PrintMsg(
"Setting RMH_Interface_SetMac[%s]: %s\n", ethName,
RMH_MacToString(mac, macString,
sizeof(macString)));
230 RMH_Power_SetStandbyMode(handle, RMH_POWER_MODE_M0_ACTIVE);
234 for(nodeId=0; nodeId != RMH_MAX_MOCA_NODES; nodeId++) {
235 RMH_RemoteNode_SetMaxConstellation_GCD100(handle, nodeId, 6);
241 RMH_Result GENERIC_IMPL__RMH_Log_CreateDriverFile(
const RMH_Handle handle,
char* responseBuf,
const size_t responseBufSize) {
251 gettimeofday(&tv, NULL);
252 tm_info = localtime(&tv.tv_sec);
255 memset(mac, 0,
sizeof(mac));
258 filenameLength=snprintf(responseBuf, responseBufSize,
"/opt/rmh_moca_log_%s_MAC_%02X-%02X-%02X-%02X-%02X-%02X_TIME_%02d.%02d.%02d_%02d-%02d-%02d.log",
264 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
265 tm_info->tm_year + 1900, tm_info->tm_mon + 1, tm_info->tm_mday, tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec);
267 BRMH_RETURN_IF(filenameLength<0, RMH_FAILURE);
268 BRMH_RETURN_IF(filenameLength>=responseBufSize, RMH_INSUFFICIENT_SPACE);
270 logFile=fopen(responseBuf,
"w");
271 if (logFile == NULL) {
272 RMH_PrintErr(
"Unable to open %s for writing!\n", responseBuf);
275 verFile=fopen(RDK_FILE_PATH_VERSION,
"r");
276 if (verFile == NULL) {
277 RMH_PrintWrn(
"Unable to open %s for reading!. Cannot add version information\n", RDK_FILE_PATH_VERSION);
280 fprintf(logFile,
"= Device Version information =================================================================================\n");
281 for(i=0; i<10; i++) {
282 if (fgets(line,
sizeof(line), verFile) == NULL)
284 fputs(line, logFile);
286 fprintf(logFile,
"\n\n");
292 RMH_PrintWrn(
"Failed to dump the status summary in file -- %s\n", responseBuf);
299 RMH_Result GENERIC_IMPL__RMH_PQoS_GetMaxEgressBandwidth(
const RMH_Handle handle, uint32_t* response) {
301 uint32_t nodeResponse;
303 RMH_Result ret = RMH_FAILURE;
307 for (nodeId = 0; nodeId < RMH_MAX_MOCA_NODES; nodeId++) {
308 if (remoteNodes.nodePresent[nodeId]) {
310 if (nodeResponse > *response) {
311 *response = nodeResponse;
316 RMH_PrintWrn(
"Failed to get info for node Id %u!", nodeId);
325 RMH_Result GENERIC_IMPL__RMH_PQoS_GetMinEgressBandwidth(
const RMH_Handle handle, uint32_t* response) {
327 uint32_t nodeResponse;
329 RMH_Result ret = RMH_FAILURE;
331 *response=0xFFFFFFFF;
333 for (nodeId = 0; nodeId < RMH_MAX_MOCA_NODES; nodeId++) {
334 if (remoteNodes.nodePresent[nodeId]) {
336 if (nodeResponse < *response) {
337 *response = nodeResponse;
342 RMH_PrintWrn(
"Failed to get info for node Id %u!\n", nodeId);
350 RMH_Result GENERIC_IMPL__RMH_Interface_GetEnabled(
const RMH_Handle handle,
bool *response) {
354 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
355 BRMH_RETURN_IF(response==NULL, RMH_INVALID_PARAM);
357 BRMH_RETURN_IF(pRMH_IOCTL_Get(handle, ethName, &ifrq) != RMH_SUCCESS, RMH_FAILURE);
358 if ((ifrq.ifr_flags & IFF_UP) &&
359 (ifrq.ifr_flags & IFF_RUNNING)) {
368 RMH_Result GENERIC_IMPL__RMH_Interface_SetEnabled(
const RMH_Handle handle,
const bool value) {
373 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
375 BRMH_RETURN_IF(pRMH_IOCTL_Get(handle, ethName, &ifrq) != RMH_SUCCESS, RMH_FAILURE);
377 ifrq.ifr_flags |= IFF_UP|IFF_RUNNING;
379 ifrq.ifr_flags &= ~(IFF_UP|IFF_RUNNING);
381 BRMH_RETURN_IF(pRMH_IOCTL_Set(handle, &ifrq) != RMH_SUCCESS, RMH_FAILURE);
384 return (selectedValue==value) ? RMH_SUCCESS : RMH_FAILURE;
387 RMH_Result GENERIC_IMPL__RMH_Self_GetLinkStatus(
const RMH_Handle handle, RMH_LinkStatus* response) {
392 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
393 BRMH_RETURN_IF(response==NULL, RMH_INVALID_PARAM);
397 *response=RMH_LINK_STATUS_DISABLED;
403 *response=RMH_LINK_STATUS_NO_LINK;
409 *response=RMH_LINK_STATUS_INTERFACE_DOWN;
413 *response=RMH_LINK_STATUS_UP;
418 uint32_t PrintModulationToString(
char *outBuf, uint32_t outBufSize,
const bool firstPrint,
const RMH_SubcarrierProfile* array,
const size_t arraySize,
const uint32_t end, int32_t *start,
bool *done) {
421 int32_t offset = pos < end ? 1 : -1;
422 int32_t outBufRemaining=outBufSize;
423 bool disablePrint=
false;
424 int charsToBeWritten;
427 charsToBeWritten = snprintf(outBuf, outBufRemaining,
" | [%3u-%3u] | ", pos, pos+(31*offset));
429 if (charsToBeWritten < 0 || charsToBeWritten >= outBufRemaining) charsToBeWritten=outBufRemaining;
430 outBuf += charsToBeWritten;
431 outBufRemaining -= charsToBeWritten;
434 for (j=0; j<32; j++) {
436 if (*done || pos >= arraySize || pos < 0) disablePrint=
true;
439 charsToBeWritten = disablePrint ? snprintf(outBuf, outBufRemaining,
" ") :
440 snprintf(outBuf, outBufRemaining,
"%X", array[pos]);
443 if (charsToBeWritten < 0 || charsToBeWritten >= outBufRemaining) charsToBeWritten=outBufRemaining;
444 outBuf += charsToBeWritten;
445 outBufRemaining -= charsToBeWritten;
448 if (pos == end) *done=
true;
449 if (!*done) pos+=offset;
452 charsToBeWritten = snprintf(outBuf, outBufRemaining,
" | ");
454 if (charsToBeWritten < 0 || charsToBeWritten >= outBufRemaining) charsToBeWritten=outBufRemaining;
455 outBuf += charsToBeWritten;
456 outBufRemaining -= charsToBeWritten;
459 return outBufSize - outBufRemaining;
463 RMH_Result RMH_Print_MODULATION(
const RMH_Handle handle,
const uint32_t start,
const uint32_t end,
464 const char*h0,
const RMH_SubcarrierProfile* p0,
const size_t p0Size,
465 const char*h1,
const RMH_SubcarrierProfile* p1,
const size_t p1Size,
466 const char*h2,
const RMH_SubcarrierProfile* p2,
const size_t p2Size,
467 const char*h3,
const RMH_SubcarrierProfile* p3,
const size_t p3Size) {
468 char line[LOCAL_MODULATION_PRINT_LINE_SIZE];
469 const char *lineEnd=line + LOCAL_MODULATION_PRINT_LINE_SIZE;
474 bool valid[MAX_COLS];
475 const char* printHeader[MAX_COLS];
476 uint32_t printHeaderLen[MAX_COLS];
478 uint32_t headerLength = 0;
481 valid[0] = (p0 != NULL && p0Size >0);
482 valid[1] = (p1 != NULL && p1Size >0);
483 valid[2] = (p2 != NULL && p2Size >0);
484 valid[3] = (p3 != NULL && p3Size >0);
485 printHeader[0] = (h0 != NULL && valid[0]) ? h0 :
"";
486 printHeader[1] = (h1 != NULL && valid[1]) ? h1 :
"";
487 printHeader[2] = (h2 != NULL && valid[2]) ? h2 :
"";
488 printHeader[3] = (h3 != NULL && valid[3]) ? h3 :
"";
489 printHeaderLen[0] = strlen(printHeader[0]);
490 printHeaderLen[1] = strlen(printHeader[1]);
491 printHeaderLen[2] = strlen(printHeader[2]);
492 printHeaderLen[3] = strlen(printHeader[3]);
494 for(j=0; j != MAX_COLS; j++) {
497 headerLength += printHeaderLen[j];
500 if (headerLength > 0) {
501 RMH_PrintMsg(
" | Subcarrier | ");
502 for(j=0; j != MAX_COLS; j++) {
503 if (printHeaderLen[j] > 0) {
504 RMH_PrintMsg(
"%-34s | ", printHeader[j]);
508 RMH_PrintMsg(
"\n -------------|%s%s%s%s\n",
509 (printHeaderLen[0] > 0) ?
"------------------------------------|" :
"",
510 (printHeaderLen[1] > 0) ?
"------------------------------------|" :
"",
511 (printHeaderLen[2] > 0) ?
"------------------------------------|" :
"",
512 (printHeaderLen[3] > 0) ?
"------------------------------------|" :
"");
517 uint32_t lineRemaining=LOCAL_MODULATION_PRINT_LINE_SIZE-1;
521 linePos+=PrintModulationToString(linePos, lineRemaining,
true, p0, p0Size, end, &i[0], &done[0]);
522 lineRemaining=linePos>lineEnd ? 0 : lineEnd-linePos;
527 linePos+=PrintModulationToString(linePos, lineRemaining,
false, p1, p1Size, end, &i[1], &done[1]);
528 lineRemaining=linePos>lineEnd ? 0 : lineEnd-linePos;
533 linePos+=PrintModulationToString(linePos, lineRemaining,
false, p2, p2Size, end, &i[2], &done[2]);
534 lineRemaining=linePos>lineEnd ? 0 : lineEnd-linePos;
539 linePos+=PrintModulationToString(linePos, lineRemaining,
false, p3, p3Size, end, &i[3], &done[3]);
540 lineRemaining=linePos>lineEnd ? 0 : lineEnd-linePos;
544 RMH_PrintMsg(
"%s\n", line);
553 RMH_Result ret = api(handle, &response);
554 if (ret == RMH_SUCCESS) {
556 for (i = 0; i < RMH_MAX_MOCA_NODES; i++) {
557 if (response.nodePresent[i]) {
558 RMH_PrintMsg(
" Node %02u: %u\n", i, response.nodeValue[i]);
570 RMH_Result ret = api(handle, &response);
571 if (ret == RMH_SUCCESS) {
573 char *strEnd=strBegin+
sizeof(strBegin);
576 str+=snprintf(str, strEnd-str,
" ");
577 for (i = 0; i < RMH_MAX_MOCA_NODES; i++) {
578 if (response.nodePresent[i]) {
579 str+=snprintf(str, strEnd-str,
" %02u ", i);
582 RMH_PrintMsg(
"%s\n", strBegin);
584 for (i = 0; i < RMH_MAX_MOCA_NODES; i++) {
585 if (response.nodePresent[i]) {
588 str+=snprintf(str, strEnd-str,
"%02u: ", i);
589 for (j = 0; j < RMH_MAX_MOCA_NODES; j++) {
591 str+=snprintf(str, strEnd-str,
" -- ");
592 }
else if (response.nodePresent[j]) {
593 str+=snprintf(str, strEnd-str,
"%04u ", nl->nodeValue[j]);
596 RMH_PrintMsg(
"%s\n", strBegin);
607 #define PRINT_STATUS_MACRO(api, type, apiFunc, fmt, ...) { \
610 if (ret == RMH_SUCCESS) { RMH_PrintMsg("%-50s: " fmt "\n", #api, ##__VA_ARGS__); } \
611 else { RMH_PrintMsg("%-50s: %s\n", #api, RMH_ResultToString(ret)); } \
613 #define PRINT_STATUS_BOOL(api) PRINT_STATUS_MACRO(api, bool response, api(handle, &response), "%s", response ? "TRUE" : "FALSE");
614 #define PRINT_STATUS_BOOL_RN(api, i) PRINT_STATUS_MACRO(api, bool response, api(handle, i, &response), "%s", response ? "TRUE" : "FALSE");
615 #define PRINT_STATUS_UINT32(api) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, &response), "%u", response);
616 #define PRINT_STATUS_UINT32_RN(api, i) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, i, &response), "%u", response);
617 #define PRINT_STATUS_UINT32_HEX(api) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, &response), "0x%08x", response);
618 #define PRINT_STATUS_TABOO(api) PRINT_STATUS_MACRO(api, uint32_t start;uint32_t mask, api(handle, &start, &mask), "Start:%u Channel Mask:0x%08x", start, mask);
619 #define PRINT_STATUS_UINT32_HEX_RN(api, i) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, i, &response), "0x%08x", response);
620 #define PRINT_STATUS_UPTIME(api) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, &response), "%02uh:%02um:%02us", response/3600, (response%3600)/60, response%60);
621 #define PRINT_STATUS_STRING(api) PRINT_STATUS_MACRO(api, char response[256], api(handle, response, sizeof(response)), "%s", response);
622 #define PRINT_STATUS_STRING_RN(api, i) PRINT_STATUS_MACRO(api, char response[256], api(handle, i, response, sizeof(response)), "%s", response);
623 #define PRINT_STATUS_MAC(api) PRINT_STATUS_MACRO(api, RMH_MacAddress_t response;char macStr[24], api(handle, &response), "%s", RMH_MacToString(response, macStr, sizeof(macStr)));
624 #define PRINT_STATUS_MAC_RN(api, i) PRINT_STATUS_MACRO(api, RMH_MacAddress_t response;char macStr[24], api(handle, i, &response), "%s", RMH_MacToString(response, macStr, sizeof(macStr)));
625 #define PRINT_STATUS_MoCAVersion(api) PRINT_STATUS_MACRO(api, RMH_MoCAVersion response, api(handle, &response), "%s", RMH_MoCAVersionToString(response));
626 #define PRINT_STATUS_MoCAVersion_RN(api, i) PRINT_STATUS_MACRO(api, RMH_MoCAVersion response, api(handle, i, &response), "%s", RMH_MoCAVersionToString(response));
627 #define PRINT_STATUS_PowerMode(api) PRINT_STATUS_MACRO(api, RMH_PowerMode response;char outStr[128], api(handle, &response), "%s", RMH_PowerModeToString(response, outStr, sizeof(outStr)));
628 #define PRINT_STATUS_PowerMode_RN(api, i) PRINT_STATUS_MACRO(api, RMH_PowerMode response;char outStr[128], api(handle, i, &response), "%s", RMH_PowerModeToString(response, outStr, sizeof(outStr)));
629 #define PRINT_STATUS_LinkStatus(api) PRINT_STATUS_MACRO(api, RMH_LinkStatus response, api(handle, &response), "%s", RMH_LinkStatusToString(response));
630 #define PRINT_STATUS_FLOAT(api) PRINT_STATUS_MACRO(api, float response, api(handle, &response), "%.02f", response);
631 #define PRINT_STATUS_FLOAT_RN(api, i) PRINT_STATUS_MACRO(api, float response, api(handle,i, &response), "%.02f", response);
632 #define PRINT_STATUS_LOG_LEVEL(api) PRINT_STATUS_MACRO(api, uint32_t response;char outStr[128], api(handle, &response), "%s", RMH_LogLevelToString(response, outStr, sizeof(outStr)));
633 #define PRINT_STATUS_MAC_FLOW(api, mac) PRINT_STATUS_MACRO(api, RMH_MacAddress_t response;char macStr[24], api(handle, mac, &response), "%s", RMH_MacToString(response, macStr, sizeof(macStr)));
634 #define PRINT_STATUS_UINT32_FLOW(api, mac) PRINT_STATUS_MACRO(api, uint32_t response, api(handle, mac, &response), "%u", response);
636 RMH_Result GENERIC_IMPL__RMH_Log_PrintStatus(
const RMH_Handle handle,
const char* filename) {
642 handle->localLogToFile=fopen(filename,
"a");
643 if (handle->localLogToFile == NULL) {
644 RMH_PrintErr(
"Failed to open '%s' for writing!\n", filename);
650 if (ret != RMH_SUCCESS) {
651 RMH_PrintErr(
"Failed calling RMH_Self_GetEnabled! Ensure the MoCA driver is properly loaded\n");
655 RMH_PrintMsg(
"= RMH Local Device Status ======\n");
679 RMH_LinkStatus linkStatus;
683 if (ret == RMH_SUCCESS && linkStatus == RMH_LINK_STATUS_UP) {
684 RMH_PrintMsg(
"\n= Network Status ======\n");
702 if (ret == RMH_SUCCESS) {
703 for (i = 0; i < RMH_MAX_MOCA_NODES; i++) {
704 if (nodes.nodePresent[i]) {
705 RMH_PrintMsg(
"\n= Remote Node ID %02u =======\n", i);
721 RMH_PrintMsg(
"\n= PHY Rates =========\n");
725 RMH_PrintMsg(
"*** MoCA link is down! ***\n");
729 RMH_PrintMsg(
"*** MoCA not enabled! You may need to run 'rmh start' ***\n");
732 if (handle->localLogToFile) {
733 fclose(handle->localLogToFile);
734 handle->localLogToFile=NULL;
740 RMH_Result GENERIC_IMPL__RMH_Log_PrintStats(
const RMH_Handle handle,
const char* filename) {
742 RMH_LinkStatus linkStatus;
745 handle->localLogToFile=fopen(filename,
"a");
746 if (handle->localLogToFile == NULL) {
747 RMH_PrintErr(
"Failed to open '%s' for writing!\n", filename);
753 if (ret == RMH_SUCCESS && linkStatus == RMH_LINK_STATUS_UP) {
754 RMH_PrintMsg(
"= Tx Stats ======\n");
768 RMH_PrintMsg(
"\n= Rx ======\n");
784 RMH_PrintMsg(
"RMH_Stats_GetRxCorrectedErrors:\n");
786 RMH_PrintMsg(
"RMH_Stats_GetRxUncorrectedErrors:\n");
789 RMH_PrintMsg(
"\n= Admission ======\n");
794 PRINT_STATUS_UINT32(RMH_Stats_GetAdmissionsFailedNoResponse);
795 PRINT_STATUS_UINT32(RMH_Stats_GetAdmissionsFailedChannelUnusable);
796 PRINT_STATUS_UINT32(RMH_Stats_GetAdmissionsFailedT2Timeout);
797 PRINT_STATUS_UINT32(RMH_Stats_GetAdmissionsFailedResyncLoss);
798 PRINT_STATUS_UINT32(RMH_Stats_GetAdmissionsFailedPrivacyFullBlacklist);
801 RMH_PrintMsg(
"*** Stats not available while MoCA link is down ***\n");
809 if (handle->localLogToFile) {
810 fclose(handle->localLogToFile);
811 handle->localLogToFile=NULL;
817 RMH_Result GENERIC_IMPL__RMH_Log_PrintFlows(
const RMH_Handle handle,
const char* filename) {
819 RMH_MacAddress_t flowIds[64];
821 uint32_t numIngressFlows;
824 RMH_LinkStatus linkStatus;
828 handle->localLogToFile=fopen(filename,
"a");
829 if (handle->localLogToFile == NULL) {
830 RMH_PrintErr(
"Failed to open '%s' for writing!\n", filename);
836 if (ret == RMH_SUCCESS && linkStatus == RMH_LINK_STATUS_UP) {
837 RMH_PrintMsg(
"= Local Flows ======\n");
840 if (ret == RMH_SUCCESS) {
841 RMH_PrintMsg(
"%-50s: %u\n",
"RMH_PQoS_GetNumIngressFlows", numIngressFlows);
847 if (numIngressFlows) {
849 if ((ret == RMH_SUCCESS) && (numFlowIds != 0)) {
850 for (i=0; i < numFlowIds; i++) {
851 RMH_PrintMsg(
"= Flow %u =======\n", i);
852 RMH_PrintMsg(
"%-50s: %s\n",
"Flow Id",
RMH_MacToString(flowIds[i], macStr,
sizeof(macStr)/
sizeof(macStr[0])));
857 if (ret != RMH_SUCCESS) {
862 RMH_PrintMsg(
"%-50s: %u\n",
"RMH_PQoSFlow_GetLeaseTime", leaseTime);
866 RMH_PrintMsg(
"%-50s: %s\n",
"RMH_PQoSFlow_GetLeaseTime",
"INFINITE");
888 RMH_PrintMsg(
"*** Flow information not available while MoCA link is down ***\n");
891 if (handle->localLogToFile) {
892 fclose(handle->localLogToFile);
893 handle->localLogToFile=NULL;
898 RMH_Result GENERIC_IMPL__RMH_Log_PrintModulation(
const RMH_Handle handle,
const char* filename) {
901 RMH_MoCAVersion selfMoCAVersion;
902 RMH_MoCAVersion remoteMoCAVersion;
905 RMH_SubcarrierProfile p[4][512];
907 RMH_LinkStatus linkStatus;
910 if (ret != RMH_SUCCESS || linkStatus != RMH_LINK_STATUS_UP) {
911 RMH_PrintMsg(
"*** Modulation information not available while MoCA link is down ***\n");
916 if (ret != RMH_SUCCESS) {
921 if (ret != RMH_SUCCESS) {
926 if (ret != RMH_SUCCESS) {
930 RMH_PrintMsg(
"Subcarrier Modulation To/From The Self Node %d [MoCA %s]\n", selfNodeId,
RMH_MoCAVersionToString(selfMoCAVersion));
931 for (nodeId = 0; nodeId < RMH_MAX_MOCA_NODES; nodeId++) {
932 if (nodes.nodePresent[nodeId]) {
934 if (ret != RMH_SUCCESS) {
939 if (selfMoCAVersion == RMH_MOCA_VERSION_20 && remoteMoCAVersion == RMH_MOCA_VERSION_20) {
940 memset(pUsed, 0,
sizeof(pUsed));
942 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
943 RMH_PrintWrn(
"RMH_RemoteNode_GetRxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
947 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
948 RMH_PrintWrn(
"RMH_RemoteNode_GetTxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
952 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
953 RMH_PrintWrn(
"RMH_RemoteNode_GetRxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
957 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
958 RMH_PrintWrn(
"RMH_RemoteNode_GetTxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
961 RMH_PrintMsg(
" Nominal Packet Error Rate [RMH_PER_MODE_NOMINAL]:\n");
962 RMH_Print_MODULATION(handle, 256, 511,
963 "Primary Unicast Rx (NPER)", p[0], pUsed[0],
964 "Primary Unicast Tx (NPER)", p[1], pUsed[1],
965 "Broadcast Rx (NPER)", p[2], pUsed[2],
966 "Broadcast Tx (NPER)", p[3], pUsed[3]);
968 RMH_Print_MODULATION(handle, 0, 255,
969 NULL, p[0], pUsed[0],
970 NULL, p[1], pUsed[1],
971 NULL, p[2], pUsed[2],
972 NULL, p[3], pUsed[3]);
974 memset(pUsed, 0,
sizeof(pUsed));
976 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
977 RMH_PrintWrn(
"RMH_RemoteNode_GetRxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
981 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
982 RMH_PrintWrn(
"RMH_RemoteNode_GetTxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
986 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
987 RMH_PrintWrn(
"RMH_RemoteNode_GetRxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
991 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
992 RMH_PrintWrn(
"RMH_RemoteNode_GetTxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
995 RMH_PrintMsg(
"\n Nominal Packet Error Rate [RMH_PER_MODE_VERY_LOW]:\n");
996 RMH_Print_MODULATION(handle, 256, 511,
997 "Primary Unicast Rx (VLPER)", p[0], pUsed[0],
998 "Primary Unicast Tx (VLPER)", p[1], pUsed[1],
999 "Broadcast Rx (VLPER)", p[2], pUsed[2],
1000 "Broadcast Tx (VLPER)", p[3], pUsed[3]);
1002 RMH_Print_MODULATION(handle, 0, 255,
1003 NULL, p[0], pUsed[0],
1004 NULL, p[1], pUsed[1],
1005 NULL, p[2], pUsed[2],
1006 NULL, p[3], pUsed[3]);
1010 memset(pUsed, 0,
sizeof(pUsed));
1012 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1013 RMH_PrintWrn(
"RMH_RemoteNode_GetSecondaryRxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1017 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1018 RMH_PrintWrn(
"RMH_RemoteNode_GetSecondaryRxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1022 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1023 RMH_PrintWrn(
"RMH_RemoteNode_GetSecondaryTxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1027 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1028 RMH_PrintWrn(
"RMH_RemoteNode_GetSecondaryTxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1031 RMH_PrintMsg(
"\n Secondary Packet Error Rate:\n");
1032 RMH_Print_MODULATION(handle, 256, 511,
1033 "Secondary Unicast Rx (NPER)", p[0], pUsed[0],
1034 "Secondary Unicast Rx (VLPER)", p[1], pUsed[1],
1035 "Secondary Unicast Tx (NPER)", p[2], pUsed[2],
1036 "Secondary Unicast Tx (VLPER)", p[3], pUsed[3]);
1039 RMH_Print_MODULATION(handle, 0, 255,
1040 NULL, p[0], pUsed[0],
1041 NULL, p[1], pUsed[1],
1042 NULL, p[2], pUsed[2],
1043 NULL, p[3], pUsed[3]);
1047 memset(pUsed, 0,
sizeof(pUsed));
1049 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1050 RMH_PrintWrn(
"RMH_RemoteNode_GetRxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1054 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1055 RMH_PrintWrn(
"RMH_RemoteNode_GetTxUnicastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1059 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1060 RMH_PrintWrn(
"RMH_RemoteNode_GetRxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1064 if (ret != RMH_SUCCESS && ret != RMH_UNIMPLEMENTED && ret != RMH_UNIMPLEMENTED) {
1065 RMH_PrintWrn(
"RMH_RemoteNode_GetTxBroadcastSubcarrierModulation: %s\n",
RMH_ResultToString(ret));
1068 RMH_PrintMsg(
" Packet Error Rate [RMH_PER_MODE_LEGACY]:\n");
1069 RMH_Print_MODULATION(handle, 127, 0,
1070 "Unicast Rx", p[0], pUsed[0],
1071 "Unicast Tx", p[1], pUsed[1],
1072 "Broadcast Rx", p[2], pUsed[2],
1073 "Broadcast Tx", p[3], pUsed[3]);
1075 RMH_Print_MODULATION(handle, 255, 128,
1076 NULL, p[0], pUsed[0],
1077 NULL, p[1], pUsed[1],
1078 NULL, p[2], pUsed[2],
1079 NULL, p[3], pUsed[3]);
1082 RMH_PrintMsg(
"\n\n");
1089 *apiList=&hRMHGeneric_APIList;
1094 if (hRMHGeneric_SoCUnimplementedAPIList.apiListSize == 0) {
1096 void* soclib = dlopen(
"librdkmocahalsoc.so.0", RTLD_LAZY);
1097 for(i=0; i != hRMHGeneric_APIList.apiListSize; i++) {
1098 RMH_API* api=hRMHGeneric_APIList.apiList[i];
1099 if (api->socApiExpected) {
1100 if (!soclib || !dlsym(soclib, api->socApiName)) {
1101 hRMHGeneric_SoCUnimplementedAPIList.apiList[hRMHGeneric_SoCUnimplementedAPIList.apiListSize++]=api;
1109 *apiList=&hRMHGeneric_SoCUnimplementedAPIList;
1115 if (hRMHGeneric_APITags.tagListSize == 0) {
1120 for(i=0; i != hRMHGeneric_APIList.apiListSize; i++) {
1121 RMH_API* api=hRMHGeneric_APIList.apiList[i];
1122 char* tags=strdup(api->tags);
1124 RMH_PrintWrn(
"Unable to copy tag string for '%s'. Skipping\n", api->apiName);
1127 token = strtok(tags,
",");
1129 if ((pRMH_FindTagList(handle, token, &tagList) == RMH_SUCCESS) && tagList) {
1130 tagList->apiList[tagList->apiListSize++] = api;
1131 RMH_PrintDbg(
"Added API '%s' to tag '%s'. Total APIs in this tags:%d\n", api->apiName, tagList->apiListName, tagList->apiListSize);
1133 token = strtok(NULL,
",");
1137 qsort(hRMHGeneric_APITags.tagList, hRMHGeneric_APITags.tagListSize,
sizeof(
RMH_APIList), pRMH_TagCompare);
1139 *apiTagList=&hRMHGeneric_APITags;
1144 RMH_Result GENERIC_IMPL__RMH_RemoteNode_GetNodeIdFromAssociatedId(
RMH_Handle handle,
const uint32_t associatedId, uint32_t* nodeId) {
1145 uint32_t associatedCounter=0;
1146 uint32_t nodeCounter;
1149 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
1150 BRMH_RETURN_IF(nodeId==NULL, RMH_INVALID_PARAM);
1151 BRMH_RETURN_IF(associatedId>RMH_MAX_MOCA_NODES, RMH_INVALID_PARAM);
1154 for (nodeCounter = 0; nodeCounter < RMH_MAX_MOCA_NODES; nodeCounter++) {
1155 if (remoteNodes.nodePresent[nodeCounter]) {
1156 associatedCounter++;
1157 if (associatedCounter==associatedId) {
1158 *nodeId=nodeCounter;
1163 return RMH_INVALID_ID;
1166 RMH_Result GENERIC_IMPL__RMH_RemoteNode_GetAssociatedIdFromNodeId(
RMH_Handle handle,
const uint32_t nodeId, uint32_t* associatedId) {
1167 uint32_t associatedCounter=0;
1168 uint32_t nodeCounter;
1171 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
1172 BRMH_RETURN_IF(associatedId==NULL, RMH_INVALID_PARAM);
1173 BRMH_RETURN_IF(nodeId>RMH_MAX_MOCA_NODES, RMH_INVALID_PARAM);
1176 for (nodeCounter = 0; nodeCounter < RMH_MAX_MOCA_NODES; nodeCounter++) {
1177 if (remoteNodes.nodePresent[nodeCounter]) {
1178 associatedCounter++;
1179 if (nodeCounter==nodeId) {
1180 *associatedId=associatedCounter;
1185 return RMH_INVALID_ID;
1189 uint32_t associatedCounter=0;
1193 BRMH_RETURN_IF(handle==NULL, RMH_INVALID_PARAM);
1194 BRMH_RETURN_IF(response==NULL, RMH_INVALID_PARAM);
1197 memset(response, 0,
sizeof(*response));
1198 for (nodeId = 0; nodeId < RMH_MAX_MOCA_NODES; nodeId++) {
1199 if (remoteNodes.nodePresent[nodeId]) {
1200 response->nodeValue[nodeId]=++associatedCounter;
1201 response->nodePresent[nodeId]=
true;