Hi,
Is there a way to see print outs from the confD itself?
I am not sure what to suspect… the socket is used for the init registration in addition for the receive callbacks so I guess it is OK, but it worth to double check.
Please see below the init an registration code, and the send notification code, to complete the picture. maybe you can see something that we miss here.
thanks again
Inbal
Init code:
/* Initialize confd daemon context */
confd_init("ConfdAdaptor", stderr , CONFD_PROTO_TRACE);
m_DeamonContext = confd_init_daemon("ConfdAdaptor");
if (m_DeamonContext == NULL)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init confd_init_daemon(confdAdaptor) returned NULL " );
printf("ConfDAdaptorManager::Init (confd_init_daemon) F A I L E D ! ! !\n");
return;
}
confd_set_daemon_flags(m_DeamonContext, CONFD_DAEMON_FLAG_STRINGSONLY); //to send and recieve string only
/* Initialize sockets to be used by confd */
struct sockaddr_in socketAddress;
socketAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
socketAddress.sin_family = AF_INET;
socketAddress.sin_port = htons(CONFD_PORT);
m_ControlSocket = socket(PF_INET, SOCK_STREAM, 0);
if (m_ControlSocket < 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init m_ControlSocket < 0 " );
}
m_WorkerSocket = socket(PF_INET, SOCK_STREAM, 0);
if (m_WorkerSocket < 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init m_WorkerSocket < 0 " );
}
confd_load_schemas((struct sockaddr*)&socketAddress, sizeof (struct sockaddr_in)); //for debug
if (confd_connect(m_DeamonContext, m_ControlSocket, CONTROL_SOCKET, (struct sockaddr*)&socketAddress, sizeof (struct sockaddr_in)) < 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init confd_connect(m_ControlSocket) < 0 " );
}
if (confd_connect(m_DeamonContext, m_WorkerSocket, WORKER_SOCKET,(struct sockaddr*)&socketAddress,sizeof (struct sockaddr_in))< 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init confd_connect(m_WorkerSocket) < 0 " );
}
//registration to Confd, inside:
//confd_register_trans_cb(m_DeamonP, &TransactionCallbacks);
//confd_register_data_cb(a_pDeamon, &data);
m_pConfDAdaptorCallBackClient->RegisterYourself(m_DeamonContext);
m_pConfDAdaptorObjFactory->RegisterList(m_DeamonContext);
//register the stream for notifications to confd
struct confd_notification_stream_cbs NotificationCallBack;
memset(&NotificationCallBack, 0, sizeof(NotificationCallBack));
NotificationCallBack.fd = m_WorkerSocket;
NotificationCallBack.get_log_times = NULL;
NotificationCallBack.replay = NULL;
strcpy(NotificationCallBack.streamname, "NETCONF");
NotificationCallBack.cb_opaque = NULL;
if (confd_register_notification_stream(m_DeamonContext, &NotificationCallBack, &m_LiveContext) != CONFD_OK)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::Init confd_register_notification_stream FAILED " );
}
confd_register_done(m_DeamonContext);
Send notification code:
//get a constant string back
char * path = YangMapperP->GetKeyPath(a_TableId);
confd_tag_value_t values[11];
int Index = 0;
confd_hkeypath_t *p_KeyPath ;
struct sockaddr_in SocketAddress;
struct in_addr an_addr = {0xa0a0a0a0};
//create socket to translate the keypath
int MappiSocket;
SocketAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
SocketAddress.sin_family = AF_INET;
SocketAddress.sin_port = htons(CONFD_PORT);
if ((MappiSocket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther socket creation failed " );
}
if (maapi_connect(MappiSocket, (struct sockaddr *)&SocketAddress, sizeof (SocketAddress)) < 0)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther socket connect failed " );
}
if (maapi_xpath2kpath(MappiSocket, path, &p_KeyPath) != CONFD_OK) //translate the keypath
{
DEBUG(netConfTraceP, << "Cannot translate xpath\n");
}
maapi_close(MappiSocket);
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther maapi_close ");
//set the values of the notification
CONFD_SET_TAG_XMLBEGIN(&values[Index], ncn_netconf_config_change, ncn__ns);
Index++;
CONFD_SET_TAG_XMLBEGIN(&values[Index], ncn_changed_by, ncn__ns);
Index++;
CONFD_SET_TAG_STR(&values[Index], ncn_username, "Admin");
Index++;
CONFD_SET_TAG_UINT32(&values[Index], ncn_session_id, 0);
Index++;
CONFD_SET_TAG_IPV4(&values[Index], ncn_source_host, an_addr);
Index++;
CONFD_SET_TAG_XMLEND(&values[Index], ncn_changed_by, ncn__ns);
Index++;
CONFD_SET_TAG_ENUM_VALUE(&values[Index], ncn_datastore, ncn_running);
Index++;
CONFD_SET_TAG_XMLBEGIN(&values[Index], ncn_edit, ncn__ns);
Index++;
CONFD_SET_TAG_OBJECTREF(&values[Index], ncn_target, p_KeyPath);
Index++;
CONFD_SET_TAG_XMLEND(&values[Index], ncn_edit, ncn__ns);
Index++;
CONFD_SET_TAG_XMLEND(&values[Index], ncn_netconf_config_change, ncn__ns);
Index++;
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther CONFD_SET_TAG done ");
struct confd_datetime EventTime;
struct tm Time;
struct timeval TimeValue;
gettimeofday(&TimeValue, NULL);
gmtime_r(&TimeValue.tv_sec, &Time);
memset(&EventTime, 0, sizeof(EventTime));
EventTime.year = 1900 + Time.tm_year;
EventTime.month = Time.tm_mon + 1;
EventTime.day = Time.tm_mday;
EventTime.sec = Time.tm_sec;
EventTime.micro = TimeValue.tv_usec;
EventTime.timezone = 0;
EventTime.timezone_minutes = 0;
EventTime.hour = Time.tm_hour;
EventTime.min = Time.tm_min;
print_modifications(values, Index, NULL, 0);
int status = confd_notification_send(m_LiveContext, &EventTime, values, Index);
if (status != CONFD_OK)
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther confd_notification_send was failed\n");
}
else
{
DEBUG(netConfTraceP, <<"ConfDAdaptorManager::CommitWasDoneByOther confd_notification_send for table Id = " << a_TableId);
}
confd_free_hkeypath(p_KeyPath);
}