Hi Canh
Your suggestion will work:
0 or 1 minor version 1 shall be sent to server
2 minor version 3 shall be sent to server
3 minor version 3 shall be sent to server
But the following (when a future version 4 is added) will not:
0 or 1 minor version 1 shall be sent to server
2 minor version 3 shall be sent to server
3 minor version 4 shall be sent to server?
4 minor version 4 shall be sent to server
---------------------------------------------------------------------------------
So I suggest the following:
Now version 3 is added:
0 or 1 minor version 1 shall be sent to server
2 minor version 2 shall be sent to server
3 minor version 3 shall be sent to server
Later when a future version 4 is added:
0 or 1 minor version 1 shall be sent to server
2 minor version 2 shall be sent to server
3 minor version 3 shall be sent to server
4 minor version 4 shall be sent to server
The server shall adapt to the given version i.e. handle things as the server of
the given version.
If minor version given is > supported version, SA_AIS_ERR_VERSION shall be
returned
Regards
Lennart
> -----Original Message-----
> From: Canh Truong [mailto:[email protected]]
> Sent: den 6 januari 2017 07:44
> To: Lennart Lund <[email protected]>; Vu Minh Nguyen
> <[email protected]>; [email protected]
> Cc: [email protected]
> Subject: RE: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146]
>
> Hi Lennart,
>
> Thanks for your comments.
>
> As I understand you mean that the agent shall send to the server with the
> minor version that is initialized with client [in minor version] , except if
> minor = 0, it will be set to 1. But as section of 3.5.1 AIS document "
> minorVersion = highest value of the minor versions that this implementation
> can support for the returned values of releaseCode and majorVersion", so
> the
> minor version has to update to highest value that supported in agent before
> sent to server. In this patch. The minor version is increased to 3. So if
> client initialized with minor is:
> 0 or 1 minor version 1 shall be sent to server
> 2 minor version 3 shall be sent to server
> 3 minor version 3 shall be sent to server
> Correct me if there is problem.
>
> In the log server, I will fix to check to return a SA_AIS_ERR_VERSION if
> minor version > than highest supported version.
>
> The new ticket will created for PR document and README.
>
> Thanks
> Canh
>
> -----Original Message-----
> From: Lennart Lund [mailto:[email protected]]
> Sent: Thursday, January 05, 2017 10:03 PM
> To: Canh Van Truong; Vu Minh Nguyen; [email protected]
> Cc: [email protected]
> Subject: RE: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146]
>
> Hi Canh
>
> Some more comments:
> - The server shall not send any filter changed message (for callback) if
> not initialized with minor version 3 or higher
> - Validation of minor version is incorrect in the agent saLogInitialize():
> If minor version:
> 0 or 1 minor version 1 shall be sent to server
> 2 minor version 2 shall be sent to server
> 3 minor version 3 shall be sent to server
> > 3 saLogInitialize() shall return SA_AIS_ERR_VERSION and minor
> version 3 shall be set in version [out]
> If the server return SA_AIS_ERR_VERSION the agent shall return that
> to the client and minor version 3 has to be set in version [out]
> - The server shall check minor version, preferable already in decoding
> function. If minor version > than highest supported version a
> SA_AIS_ERR_VERSION shall be returned to the agent
>
> Regards
> Lennart
>
> > -----Original Message-----
> > From: Canh Van Truong [mailto:[email protected]]
> > Sent: den 1 januari 2017 13:27
> > To: Lennart Lund <[email protected]>; Vu Minh Nguyen
> > <[email protected]>; [email protected]
> > Cc: [email protected]
> > Subject: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146]
> >
> > src/log/agent/lga.h | 3 +
> > src/log/agent/lga_api.c | 2 +-
> > src/log/agent/lga_mds.c | 70 +++++
> > src/log/agent/lga_util.c | 60 ++++-
> > src/log/apitest/logtest.c | 2 +-
> > src/log/apitest/logtestfr.c | 2 +-
> > src/log/apitest/saflogtest.c | 2 +-
> > src/log/apitest/tet_LogOiOps.c | 71 +++++
> > src/log/apitest/tet_log_longDN.c | 2 +-
> > src/log/apitest/tet_saLogFilterSetCallbackT.c | 364
> > +++++++++++++++++++++++++-
> > src/log/apitest/tet_saLogStreamOpen_2.c | 2 -
> > src/log/common/lgsv_defs.h | 2 +-
> > src/log/common/lgsv_msg.h | 7 +
> > src/log/logd/lgs_imm.cc | 7 +
> > src/log/logd/lgs_mds.cc | 57 ++-
> > src/log/logd/lgs_util.cc | 80 +++++
> > src/log/logd/lgs_util.h | 2 +
> > src/log/tools/saf_logger.c | 2 +-
> > src/osaf/saflog/saflog.c | 4 +-
> > 19 files changed, 707 insertions(+), 34 deletions(-)
> >
> >
> > Implement SaLogFilterSetCallbackT which is mentioned at section 3.6.5
> > SaLogFilterSetCallbackT @ AIS LOG document.
> >
> > LGS:
> > - Whenever severity filter is changed for app and systerm streams,
> lgs will
> > find which clients that associate with the stream. Then lgs sends
> message
> > callback to clients.
> > - Encoding callback message for severity filter callback
> >
> > LGA:
> > - Decoding callback message for severity callback from lgs and
> > send the message
> > to the client which setting filter callback.
> > - Dispatching severity filter callback
> >
> > - Encrease version of log service to A.02.03
> >
> > diff --git a/src/log/agent/lga.h b/src/log/agent/lga.h
> > --- a/src/log/agent/lga.h
> > +++ b/src/log/agent/lga.h
> > @@ -155,5 +155,8 @@ extern bool lga_validate_lga_client_hdl( extern
> > lga_client_hdl_rec_t *lga_find_hdl_rec_by_regid(lga_cb_t *lga_cb,
> > uint32_t client_id); extern void lga_msg_destroy(lgsv_msg_t *msg);
> > extern bool lga_is_extended_name_valid(const SaNameT* name);
> > +extern lga_log_stream_hdl_rec_t
> > *lga_find_stream_hdl_rec_by_regid(lga_cb_t *lga_cb,
> > + uint32_t
> > client_id,
> > + uint32_t
> > stream_id);
> >
> > #endif // LOG_AGENT_LGA_H_
> > diff --git a/src/log/agent/lga_api.c b/src/log/agent/lga_api.c
> > --- a/src/log/agent/lga_api.c
> > +++ b/src/log/agent/lga_api.c
> > @@ -406,11 +406,11 @@ SaAisErrorT saLogDispatch(SaLogHandleT l
> > rc = SA_AIS_ERR_UNAVAILABLE;
> > goto done;
> > }
> > - osaf_mutex_unlock_ordie(&lga_cb.cb_lock);
> >
> > if ((rc = lga_hdl_cbk_dispatch(&lga_cb, hdl_rec, dispatchFlags)) !=
> > SA_AIS_OK)
> > TRACE("LGA_DISPATCH_FAILURE");
> >
> > + osaf_mutex_unlock_ordie(&lga_cb.cb_lock);
> > ncshm_give_hdl(logHandle);
> >
> > done:
> > diff --git a/src/log/agent/lga_mds.c b/src/log/agent/lga_mds.c
> > --- a/src/log/agent/lga_mds.c
> > +++ b/src/log/agent/lga_mds.c
> > @@ -559,6 +559,39 @@ static uint32_t lga_lgs_msg_proc(lga_cb_
> > }
> > break;
> >
> > + case LGSV_SEVERITY_FILTER_CALLBACK:
> > + {
> > + lga_client_hdl_rec_t *lga_hdl_rec;
> > + /** Lookup the hdl rec by client_id **/
> > + lga_hdl_rec = lga_find_hdl_rec_by_regid(cb,
> > lgsv_msg->info.cbk_info.lgs_client_id);
> > + if (lga_hdl_rec == NULL) {
> > + TRACE("regid not found");
> > + lga_msg_destroy(lgsv_msg);
> > + TRACE_LEAVE();
> > + return NCSCC_RC_FAILURE;
> > + }
> > +
> > + /* Check if client did not set filter
> callback */
> > + if(lga_hdl_rec-
> > >reg_cbk.saLogFilterSetCallback == NULL) {
> > + lga_msg_destroy(lgsv_msg);
> > + break;
> > + }
> > +
> > +
> > TRACE_2("LGSV_SEVERITY_FILTER_CALLBACK: client_id = %d,
> stream_id
> %d,
> > severity=%d",
> > + (int)lgsv_msg-
> > >info.cbk_info.lgs_client_id,
> > + (int)lgsv_msg-
> > >info.cbk_info.lgs_stream_id,
> > + (int)lgsv_msg-
> > >info.cbk_info.serverity_filter_cbk.log_severity);
> > +
> > + /** enqueue this message **/
> > + if (NCSCC_RC_SUCCESS !=
> > m_NCS_IPC_SEND(&lga_hdl_rec->mbx, lgsv_msg, prio)) {
> > + TRACE("IPC SEND FAILED");
> > + lga_msg_destroy(lgsv_msg);
> > + TRACE_LEAVE();
> > + return NCSCC_RC_FAILURE;
> > + }
> > + }
> > + break;
> > +
> > default:
> > TRACE("unknown type %d", lgsv_msg-
> > >info.cbk_info.type);
> > lga_msg_destroy(lgsv_msg);
> > @@ -932,6 +965,36 @@ static uint32_t lga_dec_clm_node_status_ }
> >
> >
> >
> /**********************************************************
> > ******************
> > +Name : lga_dec_serverity_cbk_msg
> > +
> > +Description : This routine decodes message
> > +
> > +Arguments : NCS_UBAID *uba,
> > + LGSV_MSG *msg
> > +
> > +Return Values : uint32_t
> > +
> > +Notes : None.
> >
> +*********************************************************
> > *********************/
> > +static uint32_t lga_dec_serverity_cbk_msg(NCS_UBAID *uba, lgsv_msg_t
> > *msg)
> > +{
> > + uint8_t *p8;
> > + uint32_t total_bytes = 0;
> > + lgsv_cbk_info_t *cbk_infos = &msg->info.cbk_info;
> > + uint8_t local_data[100];
> > +
> > + osafassert(uba != NULL);
> > +
> > + p8 = ncs_dec_flatten_space(uba, local_data, 6);
> > + cbk_infos->lgs_stream_id = ncs_decode_32bit(&p8);
> > + cbk_infos->serverity_filter_cbk.log_severity =
> > ncs_decode_16bit(&p8);
> > + ncs_dec_skip_space(uba, 6);
> > + total_bytes += 6;
> > +
> > + return total_bytes;
> > +}
> > +
> >
> +/*********************************************************
> > *******************
> > Name : lga_dec_lstr_open_sync_rsp_msg
> >
> > Description : This routine decodes a log stream open sync response
> > message
> > @@ -1053,6 +1116,13 @@ static uint32_t lga_mds_dec(struct ncsmd
> > msg-
> > >info.cbk_info.lgs_client_id);
> > total_bytes +=
> > lga_dec_clm_node_status_cbk_msg(uba, msg);
> > break;
> > + case LGSV_SEVERITY_FILTER_CALLBACK:
> > + total_bytes +=
> > lga_dec_serverity_cbk_msg(uba, msg);
> > + TRACE_2("decode severity filter message,
> > lgs_client_id=%d"
> > + " lgs_stream_id=%d",
> > + msg-
> > >info.cbk_info.lgs_client_id,
> > + msg-
> > >info.cbk_info.lgs_stream_id);
> > + break;
> > default:
> > TRACE_2("Unknown callback type = %d!",
> > msg->info.cbk_info.type);
> > break;
> > diff --git a/src/log/agent/lga_util.c b/src/log/agent/lga_util.c
> > --- a/src/log/agent/lga_util.c
> > +++ b/src/log/agent/lga_util.c
> > @@ -171,6 +171,19 @@ static void lga_hdl_cbk_rec_prc(lga_cb_t
> > reg_cbk->saLogWriteLogCallback(cbk_info-
> > >inv, cbk_info->write_cbk.error);
> > }
> > break;
> > +
> > + case LGSV_SEVERITY_FILTER_CALLBACK:
> > + {
> > + if (reg_cbk->saLogFilterSetCallback) {
> > + lga_log_stream_hdl_rec_t *lga_str_hdl_rec =
> > +
> > lga_find_stream_hdl_rec_by_regid(cb, cbk_info->lgs_client_id,
> > +
> > cbk_info->lgs_stream_id);
> > + reg_cbk-
> > >saLogFilterSetCallback(lga_str_hdl_rec->log_stream_hdl,
> > + cbk_info-
> > >serverity_filter_cbk.log_severity);
> > + }
> > + }
> > + break;
> > +
> > default:
> > TRACE("unknown callback type: %d", cbk_info->type);
> > break;
> > @@ -197,7 +210,8 @@ static SaAisErrorT lga_hdl_cbk_dispatch_
> > /* Nonblk receive to obtain the message from priority queue */
> > while (NULL != (cbk_msg = (lgsv_msg_t *)
> > m_NCS_IPC_NON_BLK_RECEIVE(&hdl_rec->mbx,
> > cbk_msg))) {
> > - if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND) {
> > + if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND ||
> > + cbk_msg->info.cbk_info.type ==
> > LGSV_SEVERITY_FILTER_CALLBACK) {
> > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec-
> > >reg_cbk);
> > lga_msg_destroy(cbk_msg);
> > break;
> > @@ -232,7 +246,8 @@ static uint32_t lga_hdl_cbk_dispatch_all
> > do {
> > if (NULL == (cbk_msg = (lgsv_msg_t
> > *)m_NCS_IPC_NON_BLK_RECEIVE(&hdl_rec->mbx, cbk_msg)))
> > break;
> > - if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND) {
> > + if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND ||
> > + cbk_msg->info.cbk_info.type ==
> > LGSV_SEVERITY_FILTER_CALLBACK) {
> > TRACE_2("LGSV_LGS_DELIVER_EVENT");
> > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec-
> > >reg_cbk);
> > } else {
> > @@ -268,7 +283,8 @@ static uint32_t lga_hdl_cbk_dispatch_blo
> > if (NULL != (cbk_msg = (lgsv_msg_t *)
> > m_NCS_IPC_RECEIVE(&hdl_rec->mbx, cbk_msg)))
> {
> >
> > - if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND) {
> > + if (cbk_msg->info.cbk_info.type ==
> > LGSV_WRITE_LOG_CALLBACK_IND ||
> > + cbk_msg->info.cbk_info.type ==
> > LGSV_SEVERITY_FILTER_CALLBACK) {
> > TRACE_2("LGSV_LGS_DELIVER_EVENT");
> > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec-
> > >reg_cbk);
> > } else {
> > @@ -461,6 +477,44 @@ lga_client_hdl_rec_t *lga_find_hdl_rec_b }
> >
> >
> >
> /**********************************************************
> > ******************
> > + Name : lga_find_stream_hdl_rec_by_regid
> > +
> > + Description : This routine looks up a lga_log_stream_hdl_rec by
> client_id
> > + and stream_id
> > +
> > + Arguments : cb
> > + client_id
> > + stream_id
> > +
> > + Return Values : LGA_LOG_STREAM_HDL_REC * or NULL
> > +
> > + Notes : The lga_cb in-parameter is most likely pointing to the
> global
> > + lga_cb structure and that is not thread safe. If that
> is the
> > + case the lga_cb data must be protected by a mutex
> before
> > + calling this function.
> > +
> >
> +*********************************************************
> > *********************/
> > +lga_log_stream_hdl_rec_t *lga_find_stream_hdl_rec_by_regid(lga_cb_t
> > *lga_cb,
> > + uint32_t client_id, uint32_t
> > stream_id)
> > +{
> > + TRACE_ENTER();
> > + lga_client_hdl_rec_t *lga_hdl_rec =
> > lga_find_hdl_rec_by_regid(lga_cb, client_id);
> > +
> > + if (lga_hdl_rec != NULL) {
> > + lga_log_stream_hdl_rec_t *lga_str_hdl_rec = lga_hdl_rec-
> > >stream_list;
> > +
> > + while (lga_str_hdl_rec != NULL) {
> > + if (lga_str_hdl_rec->lgs_log_stream_id == stream_id)
> > + return lga_str_hdl_rec;
> > + lga_str_hdl_rec = lga_str_hdl_rec->next;
> > + }
> > + }
> > +
> > + TRACE_LEAVE();
> > + return NULL;
> > +}
> > +
> >
> +/*********************************************************
> > *******************
> > Name : lga_hdl_list_del
> >
> > Description : This routine deletes all handles for this library.
> > diff --git a/src/log/apitest/logtest.c b/src/log/apitest/logtest.c
> > --- a/src/log/apitest/logtest.c
> > +++ b/src/log/apitest/logtest.c
> > @@ -93,7 +93,7 @@ SaLogRecordT genLogRecord =
> > .logBuffer = &genLogBuffer
> > };
> >
> > -SaVersionT logVersion = {'A', 0x02, 0x02};
> > +SaVersionT logVersion = {'A', 0x02, 0x03};
> > SaVersionT immVersion = {'A', 2, 11}; SaAisErrorT rc; SaLogHandleT
> > logHandle; diff --git a/src/log/apitest/logtestfr.c
> > b/src/log/apitest/logtestfr.c
> > --- a/src/log/apitest/logtestfr.c
> > +++ b/src/log/apitest/logtestfr.c
> > @@ -40,7 +40,7 @@
> >
> >
> /**********************************************************
> > *********************
> > * Global variables and defines
> > */
> > -static SaVersionT logVersion = {'A', 0x02, 0x02};
> > +static SaVersionT logVersion = {'A', 0x02, 0x03};
> > static SaVersionT immVersion = {'A', 2, 11};
> >
> > static SaLogHandleT logHandle;
> > diff --git a/src/log/apitest/saflogtest.c
> > b/src/log/apitest/saflogtest.c
> > --- a/src/log/apitest/saflogtest.c
> > +++ b/src/log/apitest/saflogtest.c
> > @@ -86,7 +86,7 @@ static inline void time_meas_log(time_me static
> > void logWriteLogCallbackT(SaInvocationT invocation, SaAisErrorT
> > error);
> >
> > static SaLogCallbacksT logCallbacks = { 0, 0, logWriteLogCallbackT };
> > -static SaVersionT logVersion = { 'A', 0x02, 0x02 };
> > +static SaVersionT logVersion = { 'A', 0x02, 0x03 };
> >
> > static char *progname = "saflogtest"; static SaInvocationT
> > cb_invocation; diff --git a/src/log/apitest/tet_LogOiOps.c
> > b/src/log/apitest/tet_LogOiOps.c
> > --- a/src/log/apitest/tet_LogOiOps.c
> > +++ b/src/log/apitest/tet_LogOiOps.c
> > @@ -1383,6 +1383,76 @@ done:
> > logFinalize();
> > }
> >
> > +void verFilterOut(void)
> > +{
> > + int ret;
> > + SaAisErrorT rc;
> > + char command[MAX_DATA];
> > + const unsigned int serverity_filter = 31;
> > + FILE *fp = NULL;
> > + char fileSize_c[10];
> > + int fileSize = 0;
> > +
> > + rc = logInitialize();
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + return;
> > + }
> > +
> > + rc = logAppStreamOpen(&app1StreamName,
> > &appStreamLogFileCreateAttributes);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + /* Set severity filter to enable log records have sev: emerg, alert,
>
> > +crit,
> > error, warn */
> > + sprintf(command, "immadm -o 1 -p
> > saLogStreamSeverityFilter:SA_UINT32_T:%d %s",
> > + serverity_filter, SA_LOG_STREAM_APPLICATION1);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > +
> > + /* saflogtest sends messages */
> > + sprintf(command, "saflogtest -a saLogApplication1 --count=2 --
> > interval=20 --severity=notice"
> > + " \"Test filter out, log records are not writen to log
> file\"");
> > + rc = system(command);
> > + if (rc == -1) {
> > + test_validate(rc, 0);
> > + goto done;
> > + }
> > +
> > + /* Check if log file is empty or not*/
> > + sprintf(command, "find %s/saflogtest -type f -mmin -1 "
> > + "| egrep \"%s_([0-9]{8}_[0-9]{6}\\.log$)\" "
> > + "| xargs wc -c | awk '{printf $1}'",
> > + log_root_path, DEFAULT_APP_FILE_NAME);
> > +
> > + fp = popen(command, "r");
> > +
> > + if (fp == NULL) {
> > + /* Fail to read size of log file. Report test failed. */
> > + fprintf(stderr, "Failed to run command = %s\n", command);
> > + test_validate(1, 0);
> > + goto done;
> > + }
> > + /* Get file size in chars */
> > + while (fgets(fileSize_c, sizeof(fileSize_c) - 1, fp) != NULL) {};
> > + pclose(fp);
> > +
> > + /* Convert chars to number */
> > + fileSize = atoi(fileSize_c);
> > +
> > + if (fileSize != 0) {
> > + fprintf(stderr, "Log file has log records\n");
> > + }
> > + rc_validate(fileSize, 0);
> > +
> > +done:
> > + logFinalize();
> > +}
> > +
> > /*
> >
> ==========================================================
> > ===================
> > * Test log service configuration object, suite 5
> > *
> >
> ==========================================================
> > ===================
> > @@ -4298,6 +4368,7 @@ done:
> > test_case_add(4, verNetworkName_01, "CCB Object Modify,
> > saLogStreamLogFileFormat, network name token (@Cp)");
> > test_case_add(4, verDefaultLogFileFmt, "Application stream with
> > default log file format");
> > test_case_add(4, verLogFileName, "CCB Object Modify,
> > saLogStreamFileName with special character. ER");
> > + test_case_add(4, verFilterOut, "CCB Object Modify,
> > saLogStreamSeverityFilter, filtering out log record that aren't
> > written to log file");
> >
> > /* Configuration object */
> > test_suite_add(5, "LOG OI tests, Service configuration object");
> > diff --git a/src/log/apitest/tet_log_longDN.c
> > b/src/log/apitest/tet_log_longDN.c
> > --- a/src/log/apitest/tet_log_longDN.c
> > +++ b/src/log/apitest/tet_log_longDN.c
> > @@ -87,7 +87,7 @@ static SaNameT notifyingObjLd; static SaNameT
> > logStreamNameLd; static SaLogBufferT logBufferLd; static
> > SaNtfClassIdT notificationClassIdLd = { 1, 2, 3 }; -static SaVersionT
> > logVersionLd = { 'A', 2, 2 };
> > +static SaVersionT logVersionLd = { 'A', 2, 3 };
> > static SaInvocationT invocationLd;
> > static SaAisErrorT errorLd;
> >
> > diff --git a/src/log/apitest/tet_saLogFilterSetCallbackT.c
> > b/src/log/apitest/tet_saLogFilterSetCallbackT.c
> > --- a/src/log/apitest/tet_saLogFilterSetCallbackT.c
> > +++ b/src/log/apitest/tet_saLogFilterSetCallbackT.c
> > @@ -15,10 +15,372 @@
> > *
> > */
> >
> > +#include <poll.h>
> > #include "logtest.h"
> >
> > +#define MAX_DATA 256
> > +#define MAX_CLIENTS 2
> > +static SaLogSeverityFlagsT log_severity[8]; static SaLogStreamHandleT
> > +log_streamHandle[8]; static int cb_index;
> > +
> > +static void logFilterSetCallbackT(SaLogStreamHandleT logStreamHandle,
> > SaLogSeverityFlagsT logSeverity)
> > +{
> > + log_streamHandle[cb_index] = logStreamHandle;
> > + log_severity[cb_index] = logSeverity;
> > + cb_index++;
> > +}
> > +
> > +static SaLogFileCreateAttributesT_2 appStreamLogFileCreateAttributes
> > += {
> > + .logFilePathName = DEFAULT_APP_FILE_PATH_NAME,
> > + .logFileName = DEFAULT_APP_FILE_NAME,
> > + .maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE,
> > + .maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE,
> > + .haProperty = SA_TRUE,
> > + .logFileFullAction = SA_LOG_FILE_FULL_ACTION_ROTATE,
> > + .maxFilesRotated = DEFAULT_MAX_FILE_ROTATED,
> > + .logFileFmt = DEFAULT_FORMAT_EXPRESSION };
> > +
> > void saLogFilterSetCallbackT_01(void) {
> > - test_validate(SA_AIS_ERR_NOT_SUPPORTED,
> > SA_AIS_ERR_NOT_SUPPORTED);
> > + int ret;
> > + SaAisErrorT rc;
> > + struct pollfd fds[1];
> > + char command[MAX_DATA];
> > + const unsigned int serverity_filter = 7;
> > + SaUint32T v_saLogStreamSeverityFilter = 127;
> > +
> > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT;
> > + rc = logInitialize();
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + return;
> > + }
> > + rc = saLogSelectionObjectGet(logHandle, &selectionObject);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > + rc = logStreamOpen(&systemStreamName);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + cb_index = 0;
> > + /* Backup saLogStreamSeverityFilter value */
> > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter",
> > + &v_saLogStreamSeverityFilter);
> > +
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, serverity_filter);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > +
> > + fds[0].fd = (int) selectionObject;
> > + fds[0].events = POLLIN;
> > + ret = poll(fds, 1, 1000);
> > + if (ret != 1) {
> > + fprintf(stderr, " poll log callback failed: %d \n", ret);
> > + test_validate(ret, 1);
> > + goto done;
> > + }
> > +
> > + rc = saLogDispatch(logHandle, SA_DISPATCH_ONE);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + if (log_streamHandle[0] == logStreamHandle && log_severity[0] ==
> > serverity_filter) {
> > + test_validate(SA_AIS_OK, SA_AIS_OK);
> > + } else {
> > + test_validate(0, SA_AIS_OK);
> > + }
> > +
> > +done:
> > + logCallbacks.saLogFilterSetCallback = NULL;
> > + logFinalize();
> > + /* Restore saLogStreamSeverityFilter attribute */
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter);
> > + systemCall(command);
> > }
> >
> > +void saLogFilterSetCallbackT_02(void) {
> > + int ret;
> > + SaAisErrorT rc;
> > + struct pollfd fds[1];
> > + char command[MAX_DATA];
> > + const unsigned int serverity_filter = 7;
> > +
> > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT;
> > + rc = logInitialize();
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + return;
> > + }
> > + rc = saLogSelectionObjectGet(logHandle, &selectionObject);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + rc = logAppStreamOpen(&app1StreamName,
> > &appStreamLogFileCreateAttributes);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + cb_index = 0;
> > + sprintf(command, "immadm -o 1 -p
> > saLogStreamSeverityFilter:SA_UINT32_T:%d %s 2> /dev/null",
> > + serverity_filter, SA_LOG_STREAM_APPLICATION1);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > +
> > + fds[0].fd = (int) selectionObject;
> > + fds[0].events = POLLIN;
> > + ret = poll(fds, 1, 1000);
> > + if (ret != 1) {
> > + fprintf(stderr, " poll log callback failed: %d \n", ret);
> > + test_validate(ret, 1);
> > + goto done;
> > + }
> > +
> > + rc = saLogDispatch(logHandle, SA_DISPATCH_ONE);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + if (log_streamHandle[0] == logStreamHandle && log_severity[0] ==
> > serverity_filter) {
> > + test_validate(SA_AIS_OK, SA_AIS_OK);
> > + } else {
> > + test_validate(0, SA_AIS_OK);
> > + }
> > +
> > +done:
> > + logCallbacks.saLogFilterSetCallback = NULL;
> > + logFinalize();
> > +}
> > +
> > +void saLogFilterSetCallbackT_03(void) {
> > + int ret;
> > + SaAisErrorT rc;
> > + struct pollfd fds[1];
> > + char command[MAX_DATA];
> > + const unsigned int serverity_filter[2] = {7, 15};
> > + SaUint32T v_saLogStreamSeverityFilter = 127;
> > + SaLogStreamHandleT logStreamHandle[2];
> > +
> > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT;
> > + rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + return;
> > + }
> > + rc = saLogSelectionObjectGet(logHandle, &selectionObject);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + rc = saLogStreamOpen_2(logHandle, &systemStreamName, NULL, 0,
> > + SA_TIME_ONE_SECOND, &logStreamHandle[0]);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogStreamOpen_2 for system stream
> > failed: %d \n", (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + rc = saLogStreamOpen_2(logHandle, &app1StreamName,
> > &appStreamLogFileCreateAttributes,
> > + SA_LOG_STREAM_CREATE,
> > SA_TIME_ONE_SECOND, &logStreamHandle[1]);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogStreamOpen_2 app stream failed: %d
> > \n", (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + cb_index = 0;
> > + /* Backup saLogStreamSeverityFilter value */
> > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter",
> > + &v_saLogStreamSeverityFilter);
> > + /* Changing severity filter for system and app1 stream */
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, serverity_filter[0]);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > + sleep(1);
> > + sprintf(command, "immadm -o 1 -p
> > saLogStreamSeverityFilter:SA_UINT32_T:%d %s 2> /dev/null",
> > + serverity_filter[1], SA_LOG_STREAM_APPLICATION1);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > +
> > + fds[0].fd = (int) selectionObject;
> > + fds[0].events = POLLIN;
> > + ret = poll(fds, 1, 1000);
> > + if (ret != 1) {
> > + fprintf(stderr, " poll log callback failed: %d \n", ret);
> > + test_validate(ret, 1);
> > + goto done;
> > + }
> > +
> > + rc = saLogDispatch(logHandle, SA_DISPATCH_ALL);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + if (cb_index != 2) {
> > + printf("cb_index = %u\n", cb_index);
> > + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + for (int i = 0; i < 2; i++) {
> > + if ((log_streamHandle[i] != logStreamHandle[i]) ||
> > (log_severity[i] != serverity_filter[i])) {
> > + printf("log streamHandle: %llu, expected %llu \n",
> > log_streamHandle[i], logStreamHandle[i]);
> > + printf("log severity filter: %d, expected %d \n",
> > +log_severity[i],
> > serverity_filter[i]);
> > + test_validate(0, SA_AIS_OK);
> > + goto done;
> > + }
> > + }
> > +
> > + test_validate(SA_AIS_OK, SA_AIS_OK);
> > +
> > +done:
> > + logCallbacks.saLogFilterSetCallback = NULL;
> > + logFinalize();
> > + /* Restore saLogStreamSeverityFilter attribute */
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter);
> > + systemCall(command);
> > +}
> > +
> > +
> > +void saLogFilterSetCallbackT_04(void) {
> > + int ret;
> > + SaAisErrorT rc;
> > + struct pollfd fds[MAX_CLIENTS];
> > + char command[MAX_DATA];
> > + const unsigned int serverity_filter[MAX_CLIENTS] = {7, 15};
> > + SaUint32T v_saLogStreamSeverityFilter = 127;
> > + SaLogStreamHandleT logStreamHandle[MAX_CLIENTS];
> > + SaLogHandleT logHandle[MAX_CLIENTS];
> > + SaSelectionObjectT selectionObject[MAX_CLIENTS];
> > +
> > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT;
> > + for (int i = 0; i < MAX_CLIENTS; i++) {
> > + rc = saLogInitialize(&logHandle[i], &logCallbacks,
> > &logVersion);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + return;
> > + }
> > +
> > + rc = saLogSelectionObjectGet(logHandle[i],
> > &selectionObject[i]);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + fds[i].fd = (int) selectionObject[i];
> > + fds[i].events = POLLIN;
> > +
> > + rc = saLogStreamOpen_2(logHandle[i],
> > &systemStreamName, NULL, 0,
> > + SA_TIME_ONE_SECOND,
> > &logStreamHandle[i]);
> > + if (rc != SA_AIS_OK) {
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > + }
> > +
> > + /* Close stream handle 1 */
> > + saLogStreamClose(logStreamHandle[1]);
> > +
> > + cb_index = 0;
> > + /* Backup saLogStreamSeverityFilter value */
> > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter",
> > + &v_saLogStreamSeverityFilter);
> > + /* Changing severity filter for system and app1 stream */
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, serverity_filter[0]);
> > + ret = systemCall(command);
> > + if (ret != 0) {
> > + test_validate(ret, 0);
> > + goto done;
> > + }
> > +
> > + ret = poll(fds, 2, 1000);
> > + if (ret <= 0) {
> > + fprintf(stderr, " poll log callback failed: %d \n", ret);
> > + test_validate(ret, 1);
> > + goto done;
> > + }
> > +
> > + if (fds[1].revents & POLLIN) {
> > + fprintf(stderr, " ERROR, get callback while handle closed
> > stream\n");
> > + test_validate(0, SA_AIS_OK);
> > + }
> > +
> > + if (fds[0].revents & POLLIN) {
> > + rc = saLogDispatch(logHandle[0], SA_DISPATCH_ALL);
> > + if (rc != SA_AIS_OK) {
> > + fprintf(stderr, " saLogDispatch failed: %d \n",
> (int)rc);
> > + test_validate(rc, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + if (cb_index != 1) {
> > + fprintf(stderr, "cb_index = %u\n", cb_index);
> > + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK);
> > + goto done;
> > + }
> > +
> > + if (log_streamHandle[0] == logStreamHandle[0] &&
> > log_severity[0] == serverity_filter[0]) {
> > + test_validate(SA_AIS_OK, SA_AIS_OK);
> > + } else {
> > + test_validate(0, SA_AIS_OK);
> > + }
> > + } else {
> > + fprintf(stderr, " ERROR, Can not receive any callback\n");
> > + test_validate(0, SA_AIS_OK);
> > + }
> > +
> > +done:
> > + logCallbacks.saLogFilterSetCallback = NULL;
> > + logFinalize();
> > + /* Restore saLogStreamSeverityFilter attribute */
> > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2>
> > /dev/null",
> > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter);
> > + systemCall(command);
> > +}
> > +
> > +
> > +__attribute__ ((constructor)) static void
> > saLibraryLifeCycle_constructor(void)
> > +{
> > + test_suite_add(17, "Log Severity filter Callback");
> > + test_case_add(17, saLogFilterSetCallbackT_01,
> > +"saLogFilterSetCallbackT,
> > severity filter is changed for cfg stream");
> > + test_case_add(17, saLogFilterSetCallbackT_02,
> > + "saLogFilterSetCallbackT,
> > severity filter is changed for runtime stream");
> > + test_case_add(17, saLogFilterSetCallbackT_03,
> > + "saLogFilterSetCallbackT,
> > severity filter is changed for runtime & cfg streams");
> > + test_case_add(17, saLogFilterSetCallbackT_04,
> > + "saLogFilterSetCallbackT,
> > after closing stream");
> > +}
> > diff --git a/src/log/apitest/tet_saLogStreamOpen_2.c
> > b/src/log/apitest/tet_saLogStreamOpen_2.c
> > --- a/src/log/apitest/tet_saLogStreamOpen_2.c
> > +++ b/src/log/apitest/tet_saLogStreamOpen_2.c
> > @@ -1052,7 +1052,6 @@ extern void saLogWriteLogAsync_19(void);
> extern
> > void saLogWriteLogCallbackT_01(void); extern void
> > saLogWriteLogCallbackT_02(void); extern void
> > saLogWriteLogCallbackT_03(void); -extern void
> > saLogFilterSetCallbackT_01(void); extern void
> > saLogStreamClose_01(void);
> >
> > __attribute__ ((constructor)) static void
> > saLibraryLifeCycle_constructor(void)
> > @@ -1105,7 +1104,6 @@ extern void saLogStreamClose_01(void);
> > test_case_add(2, saLogWriteLogAsync_19, "saLogWriteLogAsync()
> > logBufSize > SA_LOG_MAX_RECORD_SIZE");
> > test_case_add(2, saLogWriteLogCallbackT_01,
> > "saLogWriteLogCallbackT() SA_DISPATCH_ONE");
> > test_case_add(2, saLogWriteLogCallbackT_02,
> > "saLogWriteLogCallbackT() SA_DISPATCH_ALL");
> > - test_case_add(2, saLogFilterSetCallbackT_01, "saLogFilterSetCallbackT
> > OK");
> > test_case_add(2, saLogStreamClose_01, "saLogStreamClose OK");
> > test_case_add(2, saLogStreamOpen_2_46, "saLogStreamOpen_2 with
> > maxFilesRotated = 0, ERR");
> > test_case_add(2, saLogStreamOpen_2_47, "saLogStreamOpen_2 with
> > maxFilesRotated = 128, ERR"); diff --git a/src/log/common/lgsv_defs.h
> > b/src/log/common/lgsv_defs.h
> > --- a/src/log/common/lgsv_defs.h
> > +++ b/src/log/common/lgsv_defs.h
> > @@ -20,7 +20,7 @@
> >
> > #define LOG_RELEASE_CODE 'A'
> > #define LOG_MAJOR_VERSION 2
> > -#define LOG_MINOR_VERSION 2
> > +#define LOG_MINOR_VERSION 3
> >
> > #define LOG_RELEASE_CODE_0 'A'
> > #define LOG_MAJOR_VERSION_0 2
> > diff --git a/src/log/common/lgsv_msg.h b/src/log/common/lgsv_msg.h
> > --- a/src/log/common/lgsv_msg.h
> > +++ b/src/log/common/lgsv_msg.h
> > @@ -46,6 +46,7 @@ typedef enum {
> > typedef enum {
> > LGSV_WRITE_LOG_CALLBACK_IND = 0,
> > LGSV_CLM_NODE_STATUS_CALLBACK = 1,
> > + LGSV_SEVERITY_FILTER_CALLBACK = 2,
> > LGSV_LGS_CBK_MAX
> > } lgsv_cbk_msg_type_t;
> >
> > @@ -127,12 +128,18 @@ typedef struct logsv_loga_clm_status_par
> > uint32_t clm_node_status;
> > } logsv_lga_clm_status_cbk_t;
> >
> > +typedef struct {
> > +SaLogSeverityFlagsT log_severity;
> > +} lgsv_severity_filter_callback_t;
> > +
> > /* wrapper structure for all the callbacks */ typedef struct {
> > lgsv_cbk_msg_type_t type; /* callback type */
> > uint32_t lgs_client_id; /* lgs client_id */
> > + uint32_t lgs_stream_id;
> > SaInvocationT inv; /* invocation value */
> > /* union {*/
> > + lgsv_severity_filter_callback_t serverity_filter_cbk;
> > lgsv_write_log_callback_ind_t write_cbk;
> > logsv_lga_clm_status_cbk_t clm_node_status_cbk;
> > /* } param; */
> > diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc
> > --- a/src/log/logd/lgs_imm.cc
> > +++ b/src/log/logd/lgs_imm.cc
> > @@ -472,6 +472,8 @@ static void adminOperationCallback(SaImm
> > osaf_abort(0);
> > }
> >
> > + /* Send changed severity filter to clients */
> > + lgs_send_severity_filter_to_clients(stream->streamId,
> > + severityFilter);
> >
> > /* Checkpoint to standby LOG server */
> > ckpt_stream_config(stream);
> > @@ -2307,6 +2309,11 @@ static void stream_ccb_apply_modify(cons
> > } else if (!strcmp(attribute->attrName, "saLogStreamSeverityFilter"))
> {
> > SaUint32T severityFilter = *((SaUint32T *)value);
> > stream->severityFilter = severityFilter;
> > +
> > + /* Send changed severity filter to clients */
> > + if (stream->streamType != STREAM_TYPE_ALARM &&
> > + stream->streamType != STREAM_TYPE_NOTIFICATION)
> > + lgs_send_severity_filter_to_clients(stream->streamId,
> > + severityFilter);
> > } else {
> > LOG_ER("Error: Unknown attribute name");
> > osafassert(0);
> > diff --git a/src/log/logd/lgs_mds.cc b/src/log/logd/lgs_mds.cc
> > --- a/src/log/logd/lgs_mds.cc
> > +++ b/src/log/logd/lgs_mds.cc
> > @@ -807,6 +807,7 @@ static uint32_t mds_enc(struct ncsmds_ca
> > rc = enc_lstr_close_rsp_msg(uba, msg);
> > break;
> > default:
> > + rc = NCSCC_RC_FAILURE;
> > TRACE("Unknown API RSP type = %d", msg->info.api_resp_info.type);
> > break;
> > }
> > @@ -824,26 +825,44 @@ static uint32_t mds_enc(struct ncsmds_ca
> > ncs_encode_32bit(&p8, msg->info.cbk_info.lgs_client_id);
> > ncs_encode_64bit(&p8, msg->info.cbk_info.inv);
> > ncs_enc_claim_space(uba, 16);
> > - if (msg->info.cbk_info.type == LGSV_WRITE_LOG_CALLBACK_IND) {
> > - p8 = ncs_enc_reserve_space(uba, 4);
> > - if (!p8) {
> > - TRACE("ncs_enc_reserve_space failed");
> > - goto err;
> > - }
> > - ncs_encode_32bit(&p8, msg->info.cbk_info.write_cbk.error);
> > - TRACE_8("LGSV_WRITE_LOG_CALLBACK_IND");
> > - } else if (msg->info.cbk_info.type ==
> > LGSV_CLM_NODE_STATUS_CALLBACK) {
> > - p8 = ncs_enc_reserve_space(uba, 4);
> > - if (!p8) {
> > - TRACE("ncs_enc_reserve_space failed");
> > - goto err;
> > - }
> > - ncs_encode_32bit(&p8, msg-
> > >info.cbk_info.clm_node_status_cbk.clm_node_status);
> > - TRACE_8("LGSV_CLM_NODE_STATUS_CALLBACK");
> > - } else {
> > - TRACE("unknown callback type %d", msg->info.cbk_info.type);
> > +
> > + switch (msg->info.cbk_info.type) {
> > + case LGSV_WRITE_LOG_CALLBACK_IND:
> > + p8 = ncs_enc_reserve_space(uba, 4);
> > + if (!p8) {
> > + TRACE("ncs_enc_reserve_space failed");
> > + goto err;
> > + }
> > + ncs_encode_32bit(&p8, msg->info.cbk_info.write_cbk.error);
> > + TRACE_8("LGSV_WRITE_LOG_CALLBACK_IND");
> > + break;
> > + case LGSV_CLM_NODE_STATUS_CALLBACK:
> > + p8 = ncs_enc_reserve_space(uba, 4);
> > + if (!p8) {
> > + TRACE("ncs_enc_reserve_space failed");
> > + goto err;
> > + }
> > + ncs_encode_32bit(&p8, msg-
> > >info.cbk_info.clm_node_status_cbk.clm_node_status);
> > + TRACE_8("LGSV_CLM_NODE_STATUS_CALLBACK");
> > + break;
> > + case LGSV_SEVERITY_FILTER_CALLBACK:
> > + p8 = ncs_enc_reserve_space(uba, 6);
> > + if (!p8) {
> > + TRACE("ncs_enc_reserve_space failed");
> > + goto err;
> > + }
> > + ncs_encode_32bit(&p8, msg->info.cbk_info.lgs_stream_id);
> > + ncs_encode_16bit(&p8, msg-
> > >info.cbk_info.serverity_filter_cbk.log_severity);
> > + TRACE_8("LGSV_SEVERITY_FILTER_CALLBACK");
> > + break;
> > + default:
> > + rc = NCSCC_RC_FAILURE;
> > + TRACE("unknown callback type %d", msg->info.cbk_info.type);
> > + break;
> > + }
> > + if (rc == NCSCC_RC_FAILURE)
> > goto err;
> > - }
> > +
> > } else {
> > TRACE("unknown msg type %d", msg->type);
> > goto err;
> > diff --git a/src/log/logd/lgs_util.cc b/src/log/logd/lgs_util.cc
> > --- a/src/log/logd/lgs_util.cc
> > +++ b/src/log/logd/lgs_util.cc
> > @@ -834,3 +834,83 @@ bool lgs_is_extended_name_valid(const Sa
> >
> > return true;
> > }
> > +
> > +
> > +/**
> > + * Send a severity callback callback message to a client
> > + *
> > + * @param client_id
> > + * @param stream_id
> > + * @param severityFilter
> > + * @param mds_dest
> > + */
> > +static void lgs_send_filter_msg(uint32_t client_id, uint32_t stream_id,
> > + SaLogSeverityFlagsT severity_filter,
> > +MDS_DEST mds_dest) {
> > + uint32_t rc;
> > + NCSMDS_INFO mds_info = {0};
> > + lgsv_msg_t msg;
> > +
> > + TRACE_ENTER();
> > + TRACE_3("client_id: %u, stream_id: %u, modified severity filter: %u",
> > + client_id, stream_id, severity_filter);
> > +
> > + msg.type = LGSV_LGS_CBK_MSG;
> > + msg.info.cbk_info.type = LGSV_SEVERITY_FILTER_CALLBACK;
> > + msg.info.cbk_info.lgs_client_id = client_id;
> > + msg.info.cbk_info.lgs_stream_id = stream_id; msg.info.cbk_info.inv
> > + = 0; msg.info.cbk_info.serverity_filter_cbk.log_severity =
> > + severity_filter;
> > +
> > + mds_info.i_mds_hdl = lgs_cb->mds_hdl; mds_info.i_svc_id =
> > + NCSMDS_SVC_ID_LGS; mds_info.i_op = MDS_SEND;
> > + mds_info.info.svc_send.i_msg = &msg;
> > + mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_LGA;
> > + mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH;
> > + mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND;
> > + mds_info.info.svc_send.info.snd.i_to_dest = mds_dest;
> > +
> > + rc = ncsmds_api(&mds_info);
> > + if (rc != NCSCC_RC_SUCCESS)
> > + LOG_NO("Failed (%u) to send of severity filter callback to: %"
> > + PRIx64, rc,
> > mds_dest);
> > +
> > + TRACE_LEAVE();
> > +}
> > +
> > +/**
> > + * Send a changed severity filter to a client
> > + *
> > + * @param stream_id
> > + * @param severityFilter
> > + */
> > +void lgs_send_severity_filter_to_clients(uint32_t stream_id,
> > + SaLogSeverityFlagsT
> > +severity_filter) {
> > + log_client_t *rp = NULL;
> > + uint32_t client_id_net;
> > + lgs_stream_list_t *stream;
> > +
> > + TRACE_ENTER();
> > + TRACE_3("stream_id: %u, severity filter:%u", stream_id,
> > + severity_filter);
> > +
> > + rp = reinterpret_cast<log_client_t *>
> > + (ncs_patricia_tree_getnext(&lgs_cb->client_tree, NULL));
> > +
> > + while (rp != NULL) {
> > + /* Store the client_id_net for getting next */
> > + client_id_net = rp->client_id_net;
> > + /* Do not send to all client. Send to clients that need filter
> > + callback and associate with this stream */
> > + stream = rp->stream_list_root;
> > + while (stream != NULL) {
> > + if (stream->stream_id == stream_id) {
> > + lgs_send_filter_msg(rp->client_id, stream_id,
> > + severity_filter, rp-
> > >mds_dest);
> > + break;
> > + }
> > + stream = stream->next;
> > + }
> > + rp = reinterpret_cast<log_client_t *>(ncs_patricia_tree_getnext(
> > + &lgs_cb->client_tree, reinterpret_cast<uint8_t
> > + *>(&client_id_net))); }
> > +
> > + TRACE_LEAVE();
> > +}
> > diff --git a/src/log/logd/lgs_util.h b/src/log/logd/lgs_util.h
> > --- a/src/log/logd/lgs_util.h
> > +++ b/src/log/logd/lgs_util.h
> > @@ -82,5 +82,7 @@ int lgs_init_timer(time_t timeout_s); void
> > lgs_close_timer(int ufd);
> >
> > bool lgs_is_extended_name_valid(const SaNameT* name);
> > +void lgs_send_severity_filter_to_clients(uint32_t stream_id,
> > + SaLogSeverityFlagsT
> > +serverity);
> >
> > #endif // LOG_LOGD_LGS_UTIL_H_
> > diff --git a/src/log/tools/saf_logger.c b/src/log/tools/saf_logger.c
> > --- a/src/log/tools/saf_logger.c
> > +++ b/src/log/tools/saf_logger.c
> > @@ -58,7 +58,7 @@
> > static void logWriteLogCallbackT(SaInvocationT invocation,
> > SaAisErrorT error);
> >
> > static SaLogCallbacksT logCallbacks = { 0, 0, logWriteLogCallbackT };
> > -static SaVersionT logVersion = { 'A', 2, 1 };
> > +static SaVersionT logVersion = { 'A', 2, 3 };
> >
> > static char *progname = "saflogger";
> > static SaInvocationT cb_invocation;
> > diff --git a/src/osaf/saflog/saflog.c b/src/osaf/saflog/saflog.c
> > --- a/src/osaf/saflog/saflog.c
> > +++ b/src/osaf/saflog/saflog.c
> > @@ -31,7 +31,7 @@ void saflog_init(void)
> > SaAisErrorT error;
> >
> > if (!initialized) {
> > - SaVersionT logVersion = { 'A', 2, 1 };
> > + SaVersionT logVersion = { 'A', 2, 3 };
> > SaNameT stream_name;
> > saAisNameLend(SA_LOG_STREAM_SYSTEM,
> > &stream_name);
> >
> > @@ -65,7 +65,7 @@ void saflog(int priority, const SaNameT
> > va_end(ap);
> >
> > if (!initialized) {
> > - SaVersionT logVersion = { 'A', 2, 1 };
> > + SaVersionT logVersion = { 'A', 2, 3 };
> > SaNameT stream_name;
> > saAisNameLend(SA_LOG_STREAM_SYSTEM,
> > &stream_name);
> >
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel