Hi Anders Widel,

Sorry I was on vacation last week , will get back to soon.

-AVM


On 11/9/2016 8:50 PM, Anders Widell wrote:
> When looking more closely at this patch I notice that there is a risk 
> for starvation here. We ought to have a message counter and break out 
> of the receive loop after we have received, say, 1024 messages - even 
> if there are still more messages on the socket. This applies to both 
> the topology socket and the data socket.
>
> regards,
>
> Anders Widell
>
>
> On 11/09/2016 01:11 PM, Anders Widell wrote:
>> I agree that this patch will make the out of order problems more 
>> visible, but it is a problem both with and without this patch and I 
>> think the proper way forward is to actually solve the problem! I have 
>> created ticket [#2180] to track the out of order problem.
>>
>> regards,
>>
>> Anders Widell
>>
>>
>> On 11/09/2016 06:19 AM, A V Mahesh wrote:
>>> Hi HansN,
>>>
>>> On 11/8/2016 3:28 PM, Hans Nordeback wrote:
>>>> "I checked the code and found that MSG_DONTWAIT flag is supported 
>>>> by both send() and recv() functions since kernel v2.6.16.
>>>>
>>>> lxr.free-electrons.com/source/net/tipc/socket.c?v=3.11#L990
>>>>
>>>> The documentation just specifies the send() support.
>>>
>>> Ok i will check the code  ( i Have TIPC 1.7 code ).
>>>
>>> One more theoretical observation with  this new logic is that , the 
>>> new logic do either you completely loop through  all Dsock recv ,
>>> then we loop through   BSRsock  all recvfrom or vice versa , so this 
>>> increases possibility of  processing out of order of data and 
>>> control  event.
>>>
>>> In case of existing logic both  FD_BSRSOCK &  FD_DSOCK were getting 
>>> alternate processing ,  so out of order time was manageable ,
>>> now with new approach  the  out of order time  time is unpredictable.
>>>
>>>   I will also  test piratically by fuddling lot of Data messages and 
>>> provide my observation.
>>>
>>> =========================================================
>>> while(true) {
>>>  recv(tipc_cb.Dsock ....)
>>>
>>> while(true) {
>>>   recvfrom_connectionless(tipc_cb.BSRsock ...)
>>>
>>> =========================================================
>>>
>>> -AVM
>>>
>>>
>>> On 11/8/2016 3:28 PM, Hans Nordeback wrote:
>>>> Hi Mahesh,
>>>>
>>>> I checked with the TIPC maintainers,  with the following answer:
>>>>
>>>> "I checked the code and found that MSG_DONTWAIT flag is supported 
>>>> by both send() and recv() functions since kernel v2.6.16.
>>>>
>>>> lxr.free-electrons.com/source/net/tipc/socket.c?v=3.11#L990
>>>>
>>>> The documentation just specifies the send() support.
>>>>
>>>> Since the MSG_DONTWAIT flag was introduced in Linux 2.2 all 
>>>> networking protocols in linux do support it. "
>>>>
>>>> /Regards HansN
>>>>
>>>> On 11/08/2016 08:21 AM, A V Mahesh wrote:
>>>>> Hi HansN,
>>>>>
>>>>> Based on TIPC Programmers_Guide, I  can see TIPC supports the 
>>>>> MSG_DONTWAIT flag when sending only,
>>>>> but this patch is using  MSG_DONTWAIT flag while recv, can you 
>>>>> please provide the reference document .
>>>>>
>>>>> -AVM
>>>>>
>>>>> On 10/27/2016 8:59 PM, Hans Nordeback wrote:
>>>>>>   osaf/libs/core/mds/mds_dt_tipc.c | 374 
>>>>>> +++++++++++++++++++++-----------------
>>>>>>   1 files changed, 203 insertions(+), 171 deletions(-)
>>>>>>
>>>>>>
>>>>>> This first part changes the socket descriptors to non blocking at 
>>>>>> receive.
>>>>>> This to read all incoming messages before returning to the next 
>>>>>> poll call.
>>>>>>
>>>>>> diff --git a/osaf/libs/core/mds/mds_dt_tipc.c 
>>>>>> b/osaf/libs/core/mds/mds_dt_tipc.c
>>>>>> --- a/osaf/libs/core/mds/mds_dt_tipc.c
>>>>>> +++ b/osaf/libs/core/mds/mds_dt_tipc.c
>>>>>> @@ -565,15 +565,13 @@ static uint32_t mdtm_destroy_rcv_task(vo
>>>>>>   ssize_t recvfrom_connectionless (int sd, void *buf, size_t 
>>>>>> nbytes, int flags,
>>>>>>           struct sockaddr *from, socklen_t *addrlen)
>>>>>>   {
>>>>>> -    struct msghdr msg;
>>>>>> -    struct iovec iov;
>>>>>> +    struct msghdr msg = {0};
>>>>>> +    struct iovec iov = {0};
>>>>>>       char anc_buf[CMSG_SPACE(8) + CMSG_SPACE(1024) + 
>>>>>> CMSG_SPACE(12)];
>>>>>>       struct cmsghdr *anc;
>>>>>>       int has_addr;
>>>>>>       int anc_data[2];
>>>>>>   -    ssize_t sz;
>>>>>> -
>>>>>>       has_addr = (from != NULL) && (addrlen != NULL);
>>>>>>         iov.iov_base = buf;
>>>>>> @@ -586,55 +584,63 @@ ssize_t recvfrom_connectionless (int sd,
>>>>>>       msg.msg_control = anc_buf;
>>>>>>       msg.msg_controllen = sizeof(anc_buf);
>>>>>>   -    sz = recvmsg(sd, &msg, flags);
>>>>>> -    if (sz >= 0) {
>>>>>> -        anc = CMSG_FIRSTHDR(&msg);
>>>>>> -        if (anc == NULL) {
>>>>>> -            m_MDS_LOG_DBG("MDTM: size: %d  anc is NULL", (int)sz);
>>>>>> +    while (true) {
>>>>>> +        ssize_t sz = recvmsg(sd, &msg, flags);
>>>>>> +        if (sz == -1) {
>>>>>> +            if (errno == EAGAIN || errno == EWOULDBLOCK) {
>>>>>> +                return sz;
>>>>>> +            } else if (errno == EINTR) {
>>>>>> +                continue;
>>>>>> +            } else {
>>>>>> +                /* -1 indicates connection termination 
>>>>>> connectionless this not possible */
>>>>>> +                abort();
>>>>>> +            }
>>>>>>           }
>>>>>> -        while (anc != NULL) {
>>>>>> -
>>>>>> -            /* Receipt of a normal data message never creates 
>>>>>> the TIPC_ERRINFO
>>>>>> -               and TIPC_RETDATA objects, and only creates the 
>>>>>> TIPC_DESTNAME object
>>>>>> -               if the message was sent using a TIPC name or name 
>>>>>> sequence as the
>>>>>> -               destination rather than a TIPC port ID*/
>>>>>> -            if (anc->cmsg_type == TIPC_ERRINFO) {
>>>>>> -                anc_data[0] = *((unsigned int*)(CMSG_DATA(anc) + 
>>>>>> 0));
>>>>>> -                if (anc_data[0] == TIPC_ERR_OVERLOAD) {
>>>>>> -                    LOG_CR("MDTM: undelivered message condition 
>>>>>> ancillary data: TIPC_ERR_OVERLOAD");
>>>>>> -                    m_MDS_LOG_CRITICAL("MDTM: undelivered 
>>>>>> message condition ancillary data: TIPC_ERR_OVERLOAD");
>>>>>> +        if (sz >= 0) {
>>>>>> +            anc = CMSG_FIRSTHDR(&msg);
>>>>>> +            if (anc == NULL) {
>>>>>> +                m_MDS_LOG_DBG("MDTM: size: %d  anc is NULL", 
>>>>>> (int)sz);
>>>>>> +            }
>>>>>> +            while (anc != NULL) {
>>>>>> +
>>>>>> +                /* Receipt of a normal data message never 
>>>>>> creates the TIPC_ERRINFO
>>>>>> +                   and TIPC_RETDATA objects, and only creates 
>>>>>> the TIPC_DESTNAME object
>>>>>> +                   if the message was sent using a TIPC name or 
>>>>>> name sequence as the
>>>>>> +                   destination rather than a TIPC port ID*/
>>>>>> +                if (anc->cmsg_type == TIPC_ERRINFO) {
>>>>>> +                    anc_data[0] = *((unsigned 
>>>>>> int*)(CMSG_DATA(anc) + 0));
>>>>>> +                    if (anc_data[0] == TIPC_ERR_OVERLOAD) {
>>>>>> +                        LOG_CR("MDTM: undelivered message 
>>>>>> condition ancillary data: TIPC_ERR_OVERLOAD");
>>>>>> +                        m_MDS_LOG_CRITICAL("MDTM: undelivered 
>>>>>> message condition ancillary data: TIPC_ERR_OVERLOAD");
>>>>>> +                    } else {
>>>>>> +                        /* TIPC_ERRINFO - TIPC error code 
>>>>>> associated with a returned data message or a connection 
>>>>>> termination message */
>>>>>> +                        m_MDS_LOG_DBG("MDTM: undelivered message 
>>>>>> condition ancillary data: TIPC_ERRINFO err : %d", anc_data[0]);
>>>>>> +                    }
>>>>>> +                } else if (anc->cmsg_type == TIPC_RETDATA) {
>>>>>> +                    /* If we set TIPC_DEST_DROPPABLE off message 
>>>>>> (configure TIPC to return rejected messages to the sender )
>>>>>> +                       we will hit this when we implement MDS 
>>>>>> retransmit lost messages, can be replaced with flow control logic */
>>>>>> +                    /* TIPC_RETDATA -The contents of a returned 
>>>>>> data message */
>>>>>> +                    LOG_CR("MDTM: undelivered message condition 
>>>>>> ancillary data: TIPC_RETDATA");
>>>>>> +                    m_MDS_LOG_CRITICAL("MDTM: undelivered 
>>>>>> message condition ancillary data: TIPC_RETDATA");
>>>>>> +                } else if (anc->cmsg_type == TIPC_DESTNAME) {
>>>>>> +                    if (sz == 0) {
>>>>>> +                        m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unknown condition. Ignoring");
>>>>>> +                    }
>>>>>>                   } else {
>>>>>> -                    /* TIPC_ERRINFO - TIPC error code associated 
>>>>>> with a returned data message or a connection termination message */
>>>>>> -                    m_MDS_LOG_DBG("MDTM: undelivered message 
>>>>>> condition ancillary data: TIPC_ERRINFO err : %d", anc_data[0]);
>>>>>> +                    m_MDS_LOG_INFO("MDTM: unrecognized ancillary 
>>>>>> data type %u\n",    anc->cmsg_type);
>>>>>> +                    if (sz == 0) {
>>>>>> +                        m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unkown  condition. Ignoring");
>>>>>> +                    }
>>>>>>                   }
>>>>>> -            } else if (anc->cmsg_type == TIPC_RETDATA) {
>>>>>> -                /* If we set TIPC_DEST_DROPPABLE off message 
>>>>>> (configure TIPC to return rejected messages to the sender )
>>>>>> -                   we will hit this when we implement MDS 
>>>>>> retransmit lost messages, can be replaced with flow control logic */
>>>>>> -                /* TIPC_RETDATA -The contents of a returned data 
>>>>>> message */
>>>>>> -                LOG_CR("MDTM: undelivered message condition 
>>>>>> ancillary data: TIPC_RETDATA");
>>>>>> -                m_MDS_LOG_CRITICAL("MDTM: undelivered message 
>>>>>> condition ancillary data: TIPC_RETDATA");
>>>>>> -            } else if (anc->cmsg_type == TIPC_DESTNAME) {
>>>>>> -                if (sz == 0) {
>>>>>> -                    m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unknown  condition. Ignoring");
>>>>>> -                }
>>>>>> -            } else {
>>>>>> -                m_MDS_LOG_INFO("MDTM: unrecognized ancillary 
>>>>>> data type %u\n",    anc->cmsg_type);
>>>>>> -                if (sz == 0) {
>>>>>> -                    m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unkown  condition. Ignoring");
>>>>>> -                }
>>>>>> +
>>>>>> +                anc = CMSG_NXTHDR(&msg, anc);
>>>>>>               }
>>>>>>   -            anc = CMSG_NXTHDR(&msg, anc);
>>>>>> +            if (has_addr)
>>>>>> +                *addrlen = msg.msg_namelen;
>>>>>>           }
>>>>>> -
>>>>>> -        if (has_addr)
>>>>>> -            *addrlen = msg.msg_namelen;
>>>>>> -    } else {
>>>>>> -        /* -1 indicates connection termination connectionless 
>>>>>> this not possible */
>>>>>> -        abort();
>>>>>> +        return sz;
>>>>>>       }
>>>>>> -
>>>>>> -    return sz;
>>>>>>   }
>>>>>> /*********************************************************
>>>>>> @@ -651,91 +657,112 @@ ssize_t recvfrom_connectionless (int sd,
>>>>>> *********************************************************/
>>>>>>   static uint32_t mdtm_process_recv_events(void)
>>>>>>   {
>>>>>> +    enum {
>>>>>> +        FD_DSOCK = 0,
>>>>>> +        FD_BSRSOCK,
>>>>>> +        FD_TMRFD,
>>>>>> +        NUM_FDS
>>>>>> +    };
>>>>>> +
>>>>>>       /*
>>>>>>          STEP 1: Poll on the BSRsock and Dsock to get the events
>>>>>>          if data is received process the received data
>>>>>>          if discovery events are received , process the discovery 
>>>>>> events
>>>>>>        */
>>>>>>   -    while (1) {
>>>>>> +    while (true) {
>>>>>>           unsigned int pollres;
>>>>>> -        struct pollfd pfd[3];
>>>>>> +        struct pollfd pfd[NUM_FDS] = {{0}};
>>>>>>           struct tipc_event event;
>>>>>>   -        pfd[0].fd = tipc_cb.Dsock;
>>>>>> -        pfd[0].events = POLLIN;
>>>>>> -        pfd[1].fd = tipc_cb.BSRsock;
>>>>>> -        pfd[1].events = POLLIN;
>>>>>> -        pfd[2].fd = tipc_cb.tmr_fd;
>>>>>> -        pfd[2].events = POLLIN;
>>>>>> -
>>>>>> -        pfd[0].revents = pfd[1].revents = pfd[2].revents = 0;
>>>>>> -
>>>>>> -        pollres = poll(pfd, 3, MDTM_TIPC_POLL_TIMEOUT);
>>>>>> +        pfd[FD_DSOCK].fd = tipc_cb.Dsock;
>>>>>> +        pfd[FD_DSOCK].events = POLLIN;
>>>>>> +        pfd[FD_BSRSOCK].fd = tipc_cb.BSRsock;
>>>>>> +        pfd[FD_BSRSOCK].events = POLLIN;
>>>>>> +        pfd[FD_TMRFD].fd = tipc_cb.tmr_fd;
>>>>>> +        pfd[FD_TMRFD].events = POLLIN;
>>>>>> +
>>>>>> +        pfd[FD_DSOCK].revents = pfd[FD_BSRSOCK].revents = 
>>>>>> pfd[FD_TMRFD].revents = 0;
>>>>>> +
>>>>>> +        pollres = poll(pfd, NUM_FDS, MDTM_TIPC_POLL_TIMEOUT);
>>>>>>             if (pollres > 0) {    /* Check for EINTR and discard */
>>>>>>               memset(&event, 0, sizeof(event));
>>>>>> osaf_mutex_lock_ordie(&gl_mds_library_mutex);
>>>>>> -            if (pfd[0].revents == POLLIN) {
>>>>>> -                if (recv(tipc_cb.Dsock, &event, sizeof(event), 
>>>>>> 0) != sizeof(event)) {
>>>>>> -                    m_MDS_LOG_ERR("Unable to capture the recd 
>>>>>> event .. Continuing  err :%s", strerror(errno));
>>>>>> - osaf_mutex_unlock_ordie(&gl_mds_library_mutex);
>>>>>> -                    continue;
>>>>>> -                } else {
>>>>>> -                    if (NTOHL(event.event) == TIPC_PUBLISHED) {
>>>>>> -
>>>>>> -                        m_MDS_LOG_INFO("MDTM: Published: ");
>>>>>> -                        m_MDS_LOG_INFO("MDTM: <%u,%u,%u> port id 
>>>>>> <0x%08x:%u>\n",
>>>>>> - NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> - NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> - NTOHL(event.port.ref));
>>>>>> -
>>>>>> -                        if ( NCSCC_RC_SUCCESS != 
>>>>>> mdtm_process_discovery_events(TIPC_PUBLISHED,
>>>>>> -                                event)) {
>>>>>> -                            m_MDS_LOG_INFO("MDTM: Published 
>>>>>> Event processing status: F");
>>>>>> +            if (pfd[FD_DSOCK].revents == POLLIN) {
>>>>>> +                while(true) {
>>>>>> +                    ssize_t rc = recv(tipc_cb.Dsock, &event, 
>>>>>> sizeof(event), MSG_DONTWAIT);
>>>>>> +                    if (rc == -1) {
>>>>>> +                        if (errno == EAGAIN || errno == 
>>>>>> EWOULDBLOCK) {
>>>>>> +                            break;
>>>>>> +                        } else if (errno == EINTR) {
>>>>>> +                            continue;
>>>>>> +                        } else {
>>>>>> +                            m_MDS_LOG_ERR("Unable to capture the 
>>>>>> recd event .. Continuing  err :%s", strerror(errno));
>>>>>> +                            break;
>>>>>>                           }
>>>>>> -                    } else if (NTOHL(event.event) == 
>>>>>> TIPC_WITHDRAWN) {
>>>>>> -                        m_MDS_LOG_INFO("MDTM: Withdrawn: ");
>>>>>> -                        m_MDS_LOG_INFO("MDTM: <%u,%u,%u> port id 
>>>>>> <0x%08x:%u>\n",
>>>>>> - NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> - NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> - NTOHL(event.port.ref));
>>>>>> -
>>>>>> -                        if ( NCSCC_RC_SUCCESS != 
>>>>>> mdtm_process_discovery_events(TIPC_WITHDRAWN,
>>>>>> -                                event)) {
>>>>>> -                            m_MDS_LOG_INFO("MDTM: Withdrawn 
>>>>>> event processing status: F");
>>>>>> +                    } else {
>>>>>> +                        if (rc != sizeof(event)) {
>>>>>> +                            m_MDS_LOG_ERR("Unable to capture the 
>>>>>> recd event .. Continuing  err :%s", strerror(errno));
>>>>>> +                            break;
>>>>>> +                        } else {
>>>>>> +                            if (NTOHL(event.event) == 
>>>>>> TIPC_PUBLISHED) {
>>>>>> +
>>>>>> +                                m_MDS_LOG_INFO("MDTM: Published: 
>>>>>> ");
>>>>>> +                                m_MDS_LOG_INFO("MDTM: <%u,%u,%u> 
>>>>>> port id <0x%08x:%u>\n",
>>>>>> + NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> + NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> + NTOHL(event.port.ref));
>>>>>> +
>>>>>> +                                if ( NCSCC_RC_SUCCESS != 
>>>>>> mdtm_process_discovery_events(TIPC_PUBLISHED,
>>>>>> + event)) {
>>>>>> + m_MDS_LOG_INFO("MDTM: Published Event processing status: F");
>>>>>> +                                }
>>>>>> +                            } else if (NTOHL(event.event) == 
>>>>>> TIPC_WITHDRAWN) {
>>>>>> +                                m_MDS_LOG_INFO("MDTM: Withdrawn: 
>>>>>> ");
>>>>>> +                                m_MDS_LOG_INFO("MDTM: <%u,%u,%u> 
>>>>>> port id <0x%08x:%u>\n",
>>>>>> + NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> + NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> + NTOHL(event.port.ref));
>>>>>> +
>>>>>> +                                if ( NCSCC_RC_SUCCESS != 
>>>>>> mdtm_process_discovery_events(TIPC_WITHDRAWN,
>>>>>> + event)) {
>>>>>> + m_MDS_LOG_INFO("MDTM: Withdrawn event processing status: F");
>>>>>> +                                }
>>>>>> +                            } else if (NTOHL(event.event) == 
>>>>>> TIPC_SUBSCR_TIMEOUT) {
>>>>>> +                                /* As the timeout passed in 
>>>>>> infinite, No need to check for the Timeout */
>>>>>> +                                m_MDS_LOG_ERR("MDTM: Timeou 
>>>>>> Event");
>>>>>> +                                m_MDS_LOG_INFO("MDTM: Timeou 
>>>>>> Event");
>>>>>> +                                m_MDS_LOG_INFO("MDTM: <%u,%u,%u> 
>>>>>> port id <0x%08x:%u>\n",
>>>>>> + NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> + NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> + NTOHL(event.port.ref));
>>>>>> +                            } else {
>>>>>> +                                m_MDS_LOG_ERR("MDTM: Unknown 
>>>>>> Event");
>>>>>> +                                /* This should never come */
>>>>>> +                                assert(0);
>>>>>> +                            }
>>>>>>                           }
>>>>>> -                    } else if (NTOHL(event.event) == 
>>>>>> TIPC_SUBSCR_TIMEOUT) {
>>>>>> -                        /* As the timeout passed in infinite, No 
>>>>>> need to check for the Timeout */
>>>>>> -                        m_MDS_LOG_ERR("MDTM: Timeou Event");
>>>>>> -                        m_MDS_LOG_INFO("MDTM: Timeou Event");
>>>>>> -                        m_MDS_LOG_INFO("MDTM: <%u,%u,%u> port id 
>>>>>> <0x%08x:%u>\n",
>>>>>> - NTOHL(event.s.seq.type), NTOHL(event.found_lower),
>>>>>> - NTOHL(event.found_upper), NTOHL(event.port.node),
>>>>>> - NTOHL(event.port.ref));
>>>>>> -                    } else {
>>>>>> -                        m_MDS_LOG_ERR("MDTM: Unknown Event");
>>>>>> -                        /* This should never come */
>>>>>> -                        assert(0);
>>>>>>                       }
>>>>>>                   }
>>>>>> -            } else if (pfd[0].revents & POLLHUP) {
>>>>>> +            }
>>>>>> +            if (pfd[FD_DSOCK].revents & POLLHUP) {
>>>>>>                   /* This value is returned when the number of 
>>>>>> subscriptions made cross the tipc max_subscr limit,
>>>>>>                      so no more connection to the tipc topserver 
>>>>>> is present(viz no more up/down events),
>>>>>>                      so abort and exit the process */
>>>>>> -                   m_MDS_LOG_CRITICAL("MDTM: POLLHUP returned on 
>>>>>> Discovery Socket, No. of subscriptions=%d",
>>>>>> -                     num_subscriptions);
>>>>>> +                m_MDS_LOG_CRITICAL("MDTM: POLLHUP returned on 
>>>>>> Discovery Socket, No. of subscriptions=%d",
>>>>>> +                           num_subscriptions);
>>>>>>                   abort();    /* This means, the process is use 
>>>>>> less as
>>>>>>                              it has lost the connectivity with 
>>>>>> the topology server
>>>>>>                              and will not be able to receive any 
>>>>>> UP/DOWN events */
>>>>>>   -            } else if (pfd[1].revents & POLLIN) {
>>>>>> +            }
>>>>>> +            if (pfd[FD_BSRSOCK].revents & POLLIN) {
>>>>>>                     /* Data Received */
>>>>>>                     uint8_t *inbuf = tipc_cb.recvbuf;
>>>>>>                   uint8_t *data;    /* Used for decoding */
>>>>>> -                uint16_t recd_bytes = 0;
>>>>>>   #ifdef MDS_CHECKSUM_ENABLE_FLAG
>>>>>>                   uint16_t old_checksum = 0;
>>>>>>                   uint16_t new_checksum = 0;
>>>>>> @@ -743,78 +770,83 @@ static uint32_t mdtm_process_recv_events
>>>>>>                   struct sockaddr_tipc client_addr;
>>>>>>                   socklen_t alen = sizeof(client_addr);
>>>>>>   -                uint16_t recd_buf_len = 0;
>>>>>>                   m_MDS_LOG_INFO("MDTM: Data received: Processing 
>>>>>> data ");
>>>>>>   -                recd_bytes = 
>>>>>> recvfrom_connectionless(tipc_cb.BSRsock, inbuf, 
>>>>>> TIPC_MAX_USER_MSG_SIZE, 0,
>>>>>> -                        (struct sockaddr *)&client_addr, &alen);
>>>>>> -                if (recd_bytes == 0) {
>>>>>> -                    m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unknown/hack  condition. Ignoring");
>>>>>> - osaf_mutex_unlock_ordie(&gl_mds_library_mutex);
>>>>>> -                    continue;
>>>>>> +                while (true) {
>>>>>> +                    uint16_t recd_buf_len = 0;
>>>>>> +                    ssize_t recd_bytes = 
>>>>>> recvfrom_connectionless(tipc_cb.BSRsock, inbuf, 
>>>>>> TIPC_MAX_USER_MSG_SIZE, MSG_DONTWAIT,
>>>>>> +                                         (struct sockaddr 
>>>>>> *)&client_addr, &alen);
>>>>>> +                    if (recd_bytes == -1) {
>>>>>> +                        m_MDS_LOG_DBG("MDTM: no more data to 
>>>>>> read");
>>>>>> +                        break;
>>>>>> +                    }
>>>>>> +                    if (recd_bytes == 0) {
>>>>>> +                        m_MDS_LOG_DBG("MDTM: recd bytes=0 on 
>>>>>> received on sock, abnormal/unknown/hack condition. Ignoring");
>>>>>> +                        break;
>>>>>> +                    }
>>>>>> +                    data = inbuf;
>>>>>> +
>>>>>> +                    recd_buf_len = ncs_decode_16bit(&data);
>>>>>> +
>>>>>> +                    if (pfd[FD_BSRSOCK].revents & POLLERR) {
>>>>>> +                        m_MDS_LOG_ERR("MDTM: Error 
>>>>>> Recd:tipc_id=<0x%08x:%u>:errno=0x%08x",
>>>>>> + client_addr.addr.id.node, client_addr.addr.id.ref, errno);
>>>>>> +                    } else if (recd_buf_len == recd_bytes) {
>>>>>> +                        uint64_t tipc_id = 0;
>>>>>> +                        uint32_t buff_dump = 0;
>>>>>> +                        tipc_id = 
>>>>>> ((uint64_t)client_addr.addr.id.node) << 32;    /* 
>>>>>> TIPC_ID=<NODE,REF> */
>>>>>> +                        tipc_id |= client_addr.addr.id.ref;
>>>>>> +
>>>>>> +#ifdef MDS_CHECKSUM_ENABLE_FLAG
>>>>>> +                        if (inbuf[2] == 1) {
>>>>>> +                            old_checksum = ((uint16_t)inbuf[3] 
>>>>>> << 8 | inbuf[4]);
>>>>>> +                            inbuf[3] = 0;
>>>>>> +                            inbuf[4] = 0;
>>>>>> +                            new_checksum = 
>>>>>> mds_checksum(recd_bytes, inbuf);
>>>>>> +
>>>>>> +                            if (old_checksum != new_checksum) {
>>>>>> +                                m_MDS_LOG_ERR
>>>>>> + ("CHECKSUM-MISMATCH:recvd_on_sock=%zd, Tipc_id=0x%llu, Adest = 
>>>>>> <%08x,%u>",
>>>>>> +                                     recd_bytes, tipc_id,
>>>>>> + m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.
>>>>>> + id.node),
>>>>>> + client_addr.addr.id.ref);
>>>>>> +                                mds_buff_dump(inbuf, recd_bytes, 
>>>>>> 100);
>>>>>> +                                abort();
>>>>>> +                                break;
>>>>>> +                            }
>>>>>> + mdtm_process_recv_data(&inbuf[5], recd_bytes - 5, tipc_id, 
>>>>>> &buff_dump);
>>>>>> +                            if (buff_dump) {
>>>>>> +                                m_MDS_LOG_ERR
>>>>>> + ("RECV_DATA_PROCESS:recvd_on_sock=%zd, Tipc_id=0x%llu, Adest = 
>>>>>> <%08x,%u>",
>>>>>> +                                     recd_bytes, tipc_id,
>>>>>> + m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.
>>>>>> + id.node),
>>>>>> + client_addr.addr.id.ref);
>>>>>> +                                mds_buff_dump(inbuf, recd_bytes, 
>>>>>> 100);
>>>>>> +                            }
>>>>>> +                        } else {
>>>>>> + mdtm_process_recv_data(&inbuf[5], recd_bytes - 5, tipc_id, 
>>>>>> &buff_dump);
>>>>>> +                        }
>>>>>> +#else
>>>>>> + mdtm_process_recv_data(&inbuf[2], recd_bytes - 2, tipc_id, 
>>>>>> &buff_dump);
>>>>>> +#endif
>>>>>> +                    } else {
>>>>>> +                        uint64_t tipc_id;
>>>>>> +                        tipc_id = 
>>>>>> ((uint64_t)client_addr.addr.id.node) << 32;    /* 
>>>>>> TIPC_ID=<NODE,REF> */
>>>>>> +                        tipc_id |= client_addr.addr.id.ref;
>>>>>> +
>>>>>> +                        /* Log message that we are dropping the 
>>>>>> data */
>>>>>> +                        m_MDS_LOG_ERR
>>>>>> + ("LEN-MISMATCH:recvd_on_sock=%zd, size_in_mds_hdr=%d, Tipc_id= 
>>>>>> %"PRIu64", Adest = <%08x,%u>",
>>>>>> +                             recd_bytes, recd_buf_len, tipc_id,
>>>>>> + m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.id.node),
>>>>>> +                             client_addr.addr.id.ref);
>>>>>> +                        mds_buff_dump(inbuf, recd_bytes, 100);
>>>>>> +                    }
>>>>>>                   }
>>>>>> -                data = inbuf;
>>>>>> -
>>>>>> -                recd_buf_len = ncs_decode_16bit(&data);
>>>>>> -
>>>>>> -                if (pfd[1].revents & POLLERR) {
>>>>>> -                    m_MDS_LOG_ERR("MDTM: Error 
>>>>>> Recd:tipc_id=<0x%08x:%u>:errno=0x%08x",
>>>>>> -                              client_addr.addr.id.node, 
>>>>>> client_addr.addr.id.ref, errno);
>>>>>> -                } else if (recd_buf_len == recd_bytes) {
>>>>>> -                    uint64_t tipc_id = 0;
>>>>>> -                    uint32_t buff_dump = 0;
>>>>>> -                    tipc_id = 
>>>>>> ((uint64_t)client_addr.addr.id.node) << 32;    /* 
>>>>>> TIPC_ID=<NODE,REF> */
>>>>>> -                    tipc_id |= client_addr.addr.id.ref;
>>>>>> -
>>>>>> -#ifdef MDS_CHECKSUM_ENABLE_FLAG
>>>>>> -                    if (inbuf[2] == 1) {
>>>>>> -                        old_checksum = ((uint16_t)inbuf[3] << 8 
>>>>>> | inbuf[4]);
>>>>>> -                        inbuf[3] = 0;
>>>>>> -                        inbuf[4] = 0;
>>>>>> -                        new_checksum = mds_checksum(recd_bytes, 
>>>>>> inbuf);
>>>>>> -
>>>>>> -                        if (old_checksum != new_checksum) {
>>>>>> -                            m_MDS_LOG_ERR
>>>>>> - ("CHECKSUM-MISMATCH:recvd_on_sock=%d, Tipc_id=0x%llu, Adest = 
>>>>>> <%08x,%u>",
>>>>>> -                                 recd_bytes, tipc_id,
>>>>>> - m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.
>>>>>> - id.node),
>>>>>> - client_addr.addr.id.ref);
>>>>>> -                            mds_buff_dump(inbuf, recd_bytes, 100);
>>>>>> -                            abort();
>>>>>> - osaf_mutex_unlock_ordie(&gl_mds_library_mutex);
>>>>>> -                            continue;
>>>>>> -                        }
>>>>>> - mdtm_process_recv_data(&inbuf[5], recd_bytes - 5, tipc_id, 
>>>>>> &buff_dump);
>>>>>> -                        if (buff_dump) {
>>>>>> -                            m_MDS_LOG_ERR
>>>>>> - ("RECV_DATA_PROCESS:recvd_on_sock=%d, Tipc_id=0x%llu, Adest = 
>>>>>> <%08x,%u>",
>>>>>> -                                 recd_bytes, tipc_id,
>>>>>> - m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.
>>>>>> - id.node),
>>>>>> - client_addr.addr.id.ref);
>>>>>> -                            mds_buff_dump(inbuf, recd_bytes, 100);
>>>>>> -                        }
>>>>>> -                    } else {
>>>>>> - mdtm_process_recv_data(&inbuf[5], recd_bytes - 5, tipc_id, 
>>>>>> &buff_dump);
>>>>>> -                    }
>>>>>> -#else
>>>>>> - mdtm_process_recv_data(&inbuf[2], recd_bytes - 2, tipc_id, 
>>>>>> &buff_dump);
>>>>>> -#endif
>>>>>> -                } else {
>>>>>> -                    uint64_t tipc_id;
>>>>>> -                    tipc_id = 
>>>>>> ((uint64_t)client_addr.addr.id.node) << 32;    /* 
>>>>>> TIPC_ID=<NODE,REF> */
>>>>>> -                    tipc_id |= client_addr.addr.id.ref;
>>>>>> -
>>>>>> -                    /* Log message that we are dropping the data */
>>>>>> -                    m_MDS_LOG_ERR
>>>>>> - ("LEN-MISMATCH:recvd_on_sock=%d, size_in_mds_hdr=%d, Tipc_id= 
>>>>>> %"PRIu64", Adest = <%08x,%u>",
>>>>>> -                         recd_bytes, recd_buf_len, tipc_id,
>>>>>> - m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(client_addr.addr.id.node),
>>>>>> -                         client_addr.addr.id.ref);
>>>>>> -                    mds_buff_dump(inbuf, recd_bytes, 100);
>>>>>> -                }
>>>>>> -            } else if (pfd[2].revents == POLLIN) {
>>>>>> +            }
>>>>>> +            if (pfd[FD_TMRFD].revents == POLLIN) {
>>>>>>                   m_MDS_LOG_INFO("MDTM: Processing Timer mailbox 
>>>>>> events\n");
>>>>>>                     /* Check if destroy-event has been processed */
>>>>>
>>>>
>>>
>>
>


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to