summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrant Thomsen <brant.thomsen@harman.com>2017-07-06 10:05:03 -0600
committerBrant Thomsen <brant.thomsen@harman.com>2017-07-06 10:05:03 -0600
commitdde71783cbe195b8c77a082c14a144e4eb961516 (patch)
treebfdbc014f7b5abbd9fbf422470ed3411a0ec52e0
parent95942defd6735e74e679d9b4f6b1733efb641313 (diff)
downloadOpen-AVB-dde71783cbe195b8c77a082c14a144e4eb961516.tar.gz
Initial Fast Connect Support
Saves additional information (flags and talker_unique_id) needed to support fast connect. SAVED_STATE flag set during the initial connection. Fast Connect is attempted if there is saved state for the Listener when it connects to the AVDECC app. Second timeout to Talker on Fast Connect (as defined in IEEE 1722.1-2013 Clause 8.2.2.1.1) still needs to be implemented.
-rw-r--r--lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.c66
-rw-r--r--lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.h8
-rw-r--r--lib/avtp_pipeline/avdecc/openavb_avdecc_read_ini_pub.h19
-rw-r--r--lib/avtp_pipeline/avdecc_msg/openavb_avdecc_msg_server.c20
-rw-r--r--lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.c110
-rw-r--r--lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.h4
6 files changed, 208 insertions, 19 deletions
diff --git a/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.c b/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.c
index 94a8cda0..8253c9c5 100644
--- a/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.c
+++ b/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.c
@@ -495,6 +495,25 @@ void openavbAcmpSMListenerStateMachine()
status = pRcvdCmdResp->status;
}
+ // Save the state for this connection, so it can potentially be fast connected later.
+ // TODO: Add fast connect support for STREAMING_WAIT connections by handling START_STREAMING and STOP_STREAMING commands.
+ if (gAvdeccCfg.bFastConnectSupported &&
+ status == OPENAVB_ACMP_STATUS_SUCCESS &&
+ (pRcvdCmdResp->flags & OPENAVB_ACMP_FLAG_STREAMING_WAIT) == 0) {
+ openavb_aem_descriptor_stream_io_t *pDescriptorStreamInput = openavbAemGetDescriptor(openavbAemGetConfigIdx(), OPENAVB_AEM_DESCRIPTOR_STREAM_INPUT, pRcvdCmdResp->listener_unique_id);
+ if (pDescriptorStreamInput != NULL && pDescriptorStreamInput->stream != NULL) {
+ if (openavbAvdeccSaveState(
+ pDescriptorStreamInput->stream,
+ (pRcvdCmdResp->flags & (OPENAVB_ACMP_FLAG_CLASS_B | OPENAVB_ACMP_FLAG_SUPPORTS_ENCRYPTED | OPENAVB_ACMP_FLAG_ENCRYPTED_PDU)),
+ pRcvdCmdResp->talker_unique_id,
+ pRcvdCmdResp->talker_entity_id,
+ pRcvdCmdResp->controller_entity_id)) {
+ // Let the Controller know that the state is saved.
+ response.flags |= OPENAVB_ACMP_FLAG_SAVED_STATE;
+ }
+ }
+ }
+
openavb_list_node_t node = openavbAcmpSMListener_findInflightNodeFromCommand(pRcvdCmdResp);
if (node) {
openavb_acmp_InflightCommand_t *pInFlightCommand = openavbListData(node);
@@ -505,15 +524,6 @@ void openavbAcmpSMListenerStateMachine()
openavbAcmpSMListener_cancelTimeout(pRcvdCmdResp);
openavbAcmpSMListener_removeInflight(pRcvdCmdResp);
openavbAcmpSMListener_txResponse(OPENAVB_ACMP_MESSAGE_TYPE_CONNECT_RX_RESPONSE, &response, status);
-
- // Save the state for this connection, so it can potentially be fast connected later.
- if (gAvdeccCfg.bFastConnectSupported && status == OPENAVB_ACMP_STATUS_SUCCESS) {
- U16 configIdx = openavbAemGetConfigIdx();
- openavb_aem_descriptor_stream_io_t *pDescriptorStreamInput = openavbAemGetDescriptor(configIdx, OPENAVB_AEM_DESCRIPTOR_STREAM_INPUT, pRcvdCmdResp->listener_unique_id);
- if (pDescriptorStreamInput != NULL && pDescriptorStreamInput->stream != NULL) {
- openavbAvdeccSaveState(pDescriptorStreamInput->stream, pRcvdCmdResp->talker_entity_id, pRcvdCmdResp->controller_entity_id);
- }
- }
}
state = OPENAVB_ACMP_SM_LISTENER_STATE_WAITING;
}
@@ -810,5 +820,41 @@ void openavbAcmpSMListenerSet_doTerminate(bool value)
}
+void openavbAcmpSMListenerSet_doFastConnect(const openavb_tl_data_cfg_t *pListener, U16 flags, U16 talker_unique_id, const U8 talker_entity_id[8], const U8 controller_entity_id[8])
+{
+ openavb_acmp_ACMPCommandResponse_t command;
+
+ // Create a fake CONNECT_RX_COMMAND to kick off the fast connect process.
+ // The FAST_CONNECT flag is used to indicate internally that the controller didn't initiate this.
+ //
+ // TODO: IEEE 1722.1-2013 Clause 8.2.1.18 implies that stream_vlan_id should always be 0. Is that really the case?
+ //
+ memset(&command, 0, sizeof(command));
+ command.message_type = OPENAVB_ACMP_MESSAGE_TYPE_CONNECT_RX_COMMAND;
+ memset(command.stream_id, 0xFF, 8);
+ memcpy(command.controller_entity_id, controller_entity_id, 8);
+ memcpy(command.talker_entity_id, talker_entity_id, 8);
+ memcpy(command.listener_entity_id, openavbAcmpSMGlobalVars.my_id, 8);
+ command.talker_unique_id = talker_unique_id;
+ memset(command.stream_dest_mac, 0xFF, 6);
+ command.flags = flags | OPENAVB_ACMP_FLAG_FAST_CONNECT | OPENAVB_ACMP_FLAG_SAVED_STATE;
+
+ // Determine the listener_unique_id for the supplied listener.
+ U16 listenerUniqueId;
+ for (listenerUniqueId = 0; listenerUniqueId < 0xFFFF; ++listenerUniqueId) {
+ openavb_aem_descriptor_stream_io_t *pDescriptor =openavbAemGetDescriptor(openavbAemGetConfigIdx(), OPENAVB_AEM_DESCRIPTOR_STREAM_INPUT, listenerUniqueId);
+ if (!pDescriptor) {
+ // Out of listeners to try. Assume something went wrong.
+ AVB_LOG_ERROR("Unable to find listener_unique_id for fast connect");
+ return;
+ }
+ if (pDescriptor->stream && strcmp(pDescriptor->stream->friendly_name, pListener->friendly_name) == 0) {
+ // We found a match.
+ command.listener_unique_id = listenerUniqueId;
+ break;
+ }
+ }
-
+ // Start processing the faked command.
+ openavbAcmpSMListenerSet_rcvdConnectRXCmd(&command);
+}
diff --git a/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.h b/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.h
index 18eded4a..1d2ec5fb 100644
--- a/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.h
+++ b/lib/avtp_pipeline/acmp/openavb_acmp_sm_listener.h
@@ -79,4 +79,12 @@ void openavbAcmpSMListenerSet_rcvdDisconnectTXResp(openavb_acmp_ACMPCommandRespo
void openavbAcmpSMListenerSet_rcvdGetRXState(openavb_acmp_ACMPCommandResponse_t *command);
void openavbAcmpSMListenerSet_doTerminate(bool value);
+// Special command to initiate the fast connect support.
+void openavbAcmpSMListenerSet_doFastConnect(
+ const openavb_tl_data_cfg_t *pListener,
+ U16 flags,
+ U16 talker_unique_id,
+ const U8 talker_entity_id[8],
+ const U8 controller_entity_id[8]);
+
#endif // OPENAVB_ACMP_SM_LISTENER_H
diff --git a/lib/avtp_pipeline/avdecc/openavb_avdecc_read_ini_pub.h b/lib/avtp_pipeline/avdecc/openavb_avdecc_read_ini_pub.h
index ca082ac1..50f8330d 100644
--- a/lib/avtp_pipeline/avdecc/openavb_avdecc_read_ini_pub.h
+++ b/lib/avtp_pipeline/avdecc/openavb_avdecc_read_ini_pub.h
@@ -157,12 +157,14 @@ bool openavbReadTlDataIniFile(const char *fileName, openavb_tl_data_cfg_t *pCfg)
* #openavbAvdeccClearSavedState() should be called when the connection is closed.
*
* \param pListener Pointer to configuration for the Listener
+ * \param flags The flags used for the connection (CLASS_B, SUPPORTS_ENCRYPTED, ENCRYPTED_PDU)
+ * \param talker_unique_id The unique id for the Talker
* \param talker_entity_id The binary entity id for the Talker
* \param controller_entity_id The binary entity id for the Controller that initiated the connection
*
* \return TRUE on success or FALSE on failure
*/
-bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, const U8 talker_entity_id[8], const U8 controller_entity_id[8]);
+bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, U16 flags, U16 talker_unique_id, const U8 talker_entity_id[8], const U8 controller_entity_id[8]);
/** Delete a connection with saved state
*
@@ -176,4 +178,19 @@ bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, const U8 tal
*/
bool openavbAvdeccClearSavedState(const openavb_tl_data_cfg_t *pListener);
+/** Determine if the connection as a saved state
+ *
+ * If fast connect support is enabled, this function is used to get the last
+ * saved state (from a call to #openavbAvdeccSaveState) for a Listener, if any.
+ *
+ * \param pListener Pointer to configuration for the Listener
+ * \param p_flags Optional pointer to the flags used for the connection (CLASS_B, SUPPORTS_ENCRYPTED, ENCRYPTED_PDU)
+ * \param p_talker_unique_id Optional pointer to the unique id for the Talker
+ * \param p_talker_entity_id Optional pointer to the buffer to fill in the binary entity id for the Talker
+ * \param p_controller_entity_id Optional pointer to the buffer to fill in the binary entity id for the Controller that initiated the connection
+ *
+ * \return TRUE if there is a saved state, or FALSE otherwise
+ */
+bool openavbAvdeccSaveStateInfo(const openavb_tl_data_cfg_t *pListener, U16 *p_flags, U16 *p_talker_unique_id, U8 (*p_talker_entity_id)[8], U8 (*p_controller_entity_id)[8]);
+
#endif // OPENAVB_AVDECC_READ_INI_PUB_H
diff --git a/lib/avtp_pipeline/avdecc_msg/openavb_avdecc_msg_server.c b/lib/avtp_pipeline/avdecc_msg/openavb_avdecc_msg_server.c
index 8d93c388..16c4b3bc 100644
--- a/lib/avtp_pipeline/avdecc_msg/openavb_avdecc_msg_server.c
+++ b/lib/avtp_pipeline/avdecc_msg/openavb_avdecc_msg_server.c
@@ -55,6 +55,7 @@ https://github.com/benhoyt/inih/commit/74d2ca064fb293bc60a77b0bd068075b293cf175.
#include "openavb_avdecc_pub.h"
#include "openavb_adp.h"
#include "openavb_acmp_sm_talker.h"
+#include "openavb_acmp_sm_listener.h"
#include "openavb_avdecc_msg_server.h"
#include "openavb_trace.h"
@@ -322,6 +323,25 @@ bool openavbAvdeccMsgSrvrHndlChangeNotificationFromClient(int avdeccMsgHandle, o
} else if (pState->stream->initial_state != TL_INIT_STATE_RUNNING && pState->lastReportedState == OPENAVB_AVDECC_MSG_RUNNING) {
// Have the client not be running if the user didn't explicitly request it to be running.
openavbAvdeccMsgSrvrChangeRequest(avdeccMsgHandle, OPENAVB_AVDECC_MSG_STOPPED);
+ } else if (gAvdeccCfg.bFastConnectSupported &&
+ !(pState->bTalker) &&
+ pState->lastReportedState == OPENAVB_AVDECC_MSG_STOPPED) {
+ // Listener started as not running, and is not configured to start in the running state.
+ // See if we should do a fast connect using the saved state.
+ openavb_tl_data_cfg_t *pCfg = pState->stream;
+ if (pCfg) {
+ U16 flags, talker_unique_id;
+ U8 talker_entity_id[8], controller_entity_id[8];
+ bool bAvailable = openavbAvdeccSaveStateInfo(pCfg, &flags, &talker_unique_id, &talker_entity_id, &controller_entity_id);
+ if (bAvailable) {
+ AVB_LOGF_INFO("Attempting fast connect to flags=0x%04x, talker_unique_id=0x%04x, talker_entity_id=" ENTITYID_FORMAT ", controller_entity_id=" ENTITYID_FORMAT,
+ flags,
+ talker_unique_id,
+ ENTITYID_ARGS(talker_entity_id),
+ ENTITYID_ARGS(controller_entity_id));
+ openavbAcmpSMListenerSet_doFastConnect(pCfg, flags, talker_unique_id, talker_entity_id, controller_entity_id);
+ }
+ }
}
}
}
diff --git a/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.c b/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.c
index 9e09ec49..e39097fe 100644
--- a/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.c
+++ b/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.c
@@ -89,6 +89,8 @@ static bool get_saved_state_info(const char *ini_file)
FILE* file;
char temp_buffer[FRIENDLY_NAME_SIZE + 10];
+ long temp_int;
+ char *pEnd;
s_nNumSavedStates = -1;
@@ -147,6 +149,44 @@ static bool get_saved_state_info(const char *ini_file)
break;
}
+ // Extract the flags.
+ if (fgets(temp_buffer, sizeof(temp_buffer), file) == NULL) {
+ AVB_LOGF_ERROR("Error reading from INI file: %s", ini_file);
+ fclose(file);
+ free(pvtFilename);
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+ }
+ errno = 0;
+ temp_int = strtol(temp_buffer, &pEnd, 10);
+ if (*pEnd != '\n' || errno != 0 || temp_int < 0 || temp_int > 0xFFFF) {
+ AVB_LOGF_ERROR("Error getting Flags from INI file: %s", ini_file);
+ fclose(file);
+ free(pvtFilename);
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+ }
+ s_sSavedStateInfo[s_nNumSavedStates].flags = (U16) temp_int;
+
+ // Extract the talker_unique_id.
+ if (fgets(temp_buffer, sizeof(temp_buffer), file) == NULL) {
+ AVB_LOGF_ERROR("Error reading from INI file: %s", ini_file);
+ fclose(file);
+ free(pvtFilename);
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+ }
+ errno = 0;
+ temp_int = strtol(temp_buffer, &pEnd, 10);
+ if (*pEnd != '\n' || errno != 0 || temp_int < 0 || temp_int > 0xFFFF) {
+ AVB_LOGF_ERROR("Error getting Talker Unique ID from INI file: %s", ini_file);
+ fclose(file);
+ free(pvtFilename);
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+ }
+ s_sSavedStateInfo[s_nNumSavedStates].talker_unique_id = (U16) temp_int;
+
// Extract the Talker Entity ID.
if (fgets(temp_buffer, sizeof(temp_buffer), file) == NULL) {
AVB_LOGF_ERROR("Error reading from INI file: %s", ini_file);
@@ -189,7 +229,7 @@ static bool get_saved_state_info(const char *ini_file)
fclose(file);
free(pvtFilename);
- AVB_LOGF_DEBUG("Extraced %d saved states from INI file: %s", s_nNumSavedStates, ini_file);
+ AVB_LOGF_DEBUG("Extracted %d saved states from INI file: %s", s_nNumSavedStates, ini_file);
AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
return true;
@@ -221,8 +261,10 @@ static bool write_saved_state_info(const char *ini_file)
}
for (i = 0; i < s_nNumSavedStates; ++i) {
- if (fprintf(file, "%s\n" ENTITYID_FORMAT "\n" ENTITYID_FORMAT "\n\n",
+ if (fprintf(file, "%s\n%u\n%u\n" ENTITYID_FORMAT "\n" ENTITYID_FORMAT "\n\n",
s_sSavedStateInfo[i].listener_friendly_name,
+ s_sSavedStateInfo[i].flags,
+ s_sSavedStateInfo[i].talker_unique_id,
ENTITYID_ARGS(s_sSavedStateInfo[i].talker_entity_id),
ENTITYID_ARGS(s_sSavedStateInfo[i].controller_entity_id)) < 0) {
AVB_LOGF_ERROR("Error writing to INI file: %s", ini_file);
@@ -263,7 +305,7 @@ const openavb_saved_state_t * openavbAvdeccGetSavedState(int index)
// Add a saved state to the list of saved states.
// Returns the index for the new saved state, or -1 if an error occurred.
-int openavbAvdeccAddSavedState(const char listener_friendly_name[FRIENDLY_NAME_SIZE], const U8 talker_entity_id[8], const U8 controller_entity_id[8])
+int openavbAvdeccAddSavedState(const char listener_friendly_name[FRIENDLY_NAME_SIZE], U16 flags, U16 talker_unique_id, const U8 talker_entity_id[8], const U8 controller_entity_id[8])
{
// Load the file data, if needed.
if (s_nNumSavedStates < 0 && !get_saved_state_info(DEFAULT_AVDECC_SAVE_INI_FILE)) {
@@ -278,6 +320,8 @@ int openavbAvdeccAddSavedState(const char listener_friendly_name[FRIENDLY_NAME_S
// Append the supplied state to the list of states.
strncpy(s_sSavedStateInfo[s_nNumSavedStates].listener_friendly_name, listener_friendly_name, FRIENDLY_NAME_SIZE);
s_sSavedStateInfo[s_nNumSavedStates].listener_friendly_name[FRIENDLY_NAME_SIZE - 1] = '\0';
+ s_sSavedStateInfo[s_nNumSavedStates].flags = flags;
+ s_sSavedStateInfo[s_nNumSavedStates].talker_unique_id = talker_unique_id;
memcpy(s_sSavedStateInfo[s_nNumSavedStates].talker_entity_id, talker_entity_id, 8);
memcpy(s_sSavedStateInfo[s_nNumSavedStates].controller_entity_id, controller_entity_id, 8);
s_nNumSavedStates++;
@@ -323,7 +367,7 @@ bool openavbAvdeccDeleteSavedState(int index)
// Save the connection to the saved state
//
-bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, const U8 talker_entity_id[8], const U8 controller_entity_id[8])
+bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, U16 flags, U16 talker_unique_id, const U8 talker_entity_id[8], const U8 controller_entity_id[8])
{
AVB_TRACE_ENTRY(AVB_TRACE_AVDECC);
@@ -344,7 +388,9 @@ bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, const U8 tal
}
if (strcmp(pTest->listener_friendly_name, pListener->friendly_name) == 0) {
- if (memcmp(pTest->talker_entity_id, talker_entity_id, 8) == 0 &&
+ if (pTest->flags == flags &&
+ pTest->talker_unique_id == talker_unique_id &&
+ memcmp(pTest->talker_entity_id, talker_entity_id, 8) == 0 &&
memcmp(pTest->controller_entity_id, controller_entity_id, 8) == 0) {
// The supplied data is a match for the existing item. Do nothing.
AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
@@ -358,10 +404,12 @@ bool openavbAvdeccSaveState(const openavb_tl_data_cfg_t *pListener, const U8 tal
}
// Add the supplied state to the list of states.
- openavbAvdeccAddSavedState(pListener->friendly_name, talker_entity_id, controller_entity_id);
+ openavbAvdeccAddSavedState(pListener->friendly_name, flags, talker_unique_id, talker_entity_id, controller_entity_id);
- AVB_LOGF_DEBUG("New saved state: listener_id=%s, talker_entity_id=" ENTITYID_FORMAT ", controller_entity_id=" ENTITYID_FORMAT,
+ AVB_LOGF_DEBUG("New saved state: listener_id=%s, flags=0x%04x, talker_unique_id=0x%04x, talker_entity_id=" ENTITYID_FORMAT ", controller_entity_id=" ENTITYID_FORMAT,
pListener->friendly_name,
+ flags,
+ talker_unique_id,
ENTITYID_ARGS(talker_entity_id),
ENTITYID_ARGS(controller_entity_id));
@@ -400,3 +448,51 @@ bool openavbAvdeccClearSavedState(const openavb_tl_data_cfg_t *pListener)
AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
return false;
}
+
+// Determine if the connection as a saved state
+bool openavbAvdeccSaveStateInfo(const openavb_tl_data_cfg_t *pListener, U16 *p_flags, U16 *p_talker_unique_id, U8 (*p_talker_entity_id)[8], U8 (*p_controller_entity_id)[8])
+{
+ AVB_TRACE_ENTRY(AVB_TRACE_AVDECC);
+
+ int i;
+
+ // Don't return anything from the saved state list if fast connect support is not enabled.
+ if (!gAvdeccCfg.bFastConnectSupported) {
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+ }
+
+ // If the loaded saved state information matches the Listener supplied, return the information for it.
+ for (i = 0; i < MAX_SAVED_STATES; ++i) {
+ const openavb_saved_state_t * pTest = openavbAvdeccGetSavedState(i);
+ if (!pTest) {
+ break;
+ }
+
+ if (strcmp(pTest->listener_friendly_name, pListener->friendly_name) == 0) {
+ AVB_LOGF_DEBUG("Saved state available for listener_id=%s, flags=0x%04x, talker_unique_id=0x%04x, talker_entity_id=" ENTITYID_FORMAT ", controller_entity_id=" ENTITYID_FORMAT,
+ pListener->friendly_name,
+ pTest->flags,
+ pTest->talker_unique_id,
+ ENTITYID_ARGS(pTest->talker_entity_id),
+ ENTITYID_ARGS(pTest->controller_entity_id));
+ if (p_flags) {
+ *p_flags = pTest->flags;
+ }
+ if (p_talker_unique_id) {
+ *p_talker_unique_id = pTest->talker_unique_id;
+ }
+ if (p_talker_entity_id) {
+ memcpy(*p_talker_entity_id, pTest->talker_entity_id, 8);
+ }
+ if (p_controller_entity_id) {
+ memcpy(*p_controller_entity_id, pTest->controller_entity_id, 8);
+ }
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return true;
+ }
+ }
+
+ AVB_TRACE_EXIT(AVB_TRACE_AVDECC);
+ return false;
+}
diff --git a/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.h b/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.h
index 5f5dcbf1..da715761 100644
--- a/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.h
+++ b/lib/avtp_pipeline/platform/Linux/avdecc/openavb_avdecc_save_state.h
@@ -47,6 +47,8 @@ https://github.com/benhoyt/inih/commit/74d2ca064fb293bc60a77b0bd068075b293cf175.
struct openavb_saved_state {
char listener_friendly_name[FRIENDLY_NAME_SIZE];
+ U16 flags;
+ U16 talker_unique_id;
U8 talker_entity_id[8];
U8 controller_entity_id[8];
};
@@ -59,7 +61,7 @@ const openavb_saved_state_t * openavbAvdeccGetSavedState(int index);
// Add a saved state to the list of saved states.
// Returns the index for the new saved state, or -1 if an error occurred.
-int openavbAvdeccAddSavedState(const char listener_friendly_name[FRIENDLY_NAME_SIZE], const U8 talker_entity_id[8], const U8 controller_entity_id[8]);
+int openavbAvdeccAddSavedState(const char listener_friendly_name[FRIENDLY_NAME_SIZE], U16 flags, U16 talker_unique_id, const U8 talker_entity_id[8], const U8 controller_entity_id[8]);
// Delete the saved state information at the specified index.
// Returns TRUE if successfully deleted, FALSE otherwise.