From f0b5245f883b0285232ef8e8b21f4a4dbfa889c2 Mon Sep 17 00:00:00 2001 From: Yakun Xu Date: Thu, 25 Oct 2018 11:40:15 +0800 Subject: [PATCH] [platform-udp] fix processing message received from other interface (#3200) --- src/posix/platform/udp.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/posix/platform/udp.cpp b/src/posix/platform/udp.cpp index 03d4f5b16..18aa77a95 100644 --- a/src/posix/platform/udp.cpp +++ b/src/posix/platform/udp.cpp @@ -123,27 +123,21 @@ static otError transmitPacket(int aFd, uint8_t *aPayload, uint16_t aLength, cons controlLength += CMSG_SPACE(sizeof(int)); } + if (!IsMulticast(reinterpret_cast(aMessageInfo.mSockAddr)) && + memcmp(&aMessageInfo.mSockAddr, &in6addr_any, sizeof(aMessageInfo.mSockAddr))) { - struct in6_pktinfo *pktinfo = NULL; + struct in6_pktinfo &pktinfo = *reinterpret_cast(CMSG_DATA(cmsg)); cmsg->cmsg_level = IPPROTO_IPV6; cmsg->cmsg_type = IPV6_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(*pktinfo)); + cmsg->cmsg_len = CMSG_LEN(sizeof(pktinfo)); - pktinfo = reinterpret_cast(CMSG_DATA(cmsg)); - pktinfo->ipi6_ifindex = (aMessageInfo.mInterfaceId == OT_NETIF_INTERFACE_ID_THREAD ? sPlatNetifIndex : 0); + pktinfo.ipi6_ifindex = (aMessageInfo.mInterfaceId == OT_NETIF_INTERFACE_ID_THREAD ? sPlatNetifIndex : 0); - if (!IsMulticast(reinterpret_cast(aMessageInfo.mSockAddr)) && - memcmp(&aMessageInfo.mSockAddr, &in6addr_any, sizeof(aMessageInfo.mSockAddr))) - { - memcpy(&pktinfo->ipi6_addr, &aMessageInfo.mSockAddr, sizeof(pktinfo->ipi6_addr)); - } + memcpy(&pktinfo.ipi6_addr, &aMessageInfo.mSockAddr, sizeof(pktinfo.ipi6_addr)); - if (pktinfo->ipi6_ifindex || memcmp(&pktinfo->ipi6_addr, &in6addr_any, sizeof(pktinfo->ipi6_addr))) - { - controlLength += CMSG_SPACE(sizeof(*pktinfo)); - cmsg = CMSG_NXTHDR(&msg, cmsg); - } + controlLength += CMSG_SPACE(sizeof(pktinfo)); + cmsg = CMSG_NXTHDR(&msg, cmsg); } #ifdef __APPLE__ @@ -196,6 +190,9 @@ static otError receivePacket(int aFd, uint8_t *aPayload, uint16_t &aLength, otMe struct in6_pktinfo *pktinfo; pktinfo = reinterpret_cast(CMSG_DATA(cmsg)); + + aMessageInfo.mInterfaceId = + (pktinfo->ipi6_ifindex == sPlatNetifIndex ? static_cast(OT_NETIF_INTERFACE_ID_THREAD) : 0); memcpy(&aMessageInfo.mSockAddr, &pktinfo->ipi6_addr, sizeof(aMessageInfo.mSockAddr)); } } @@ -378,8 +375,7 @@ void platformUdpProcess(otInstance *aInstance, const fd_set *aReadFdSet) uint16_t length = sizeof(payload); memset(&messageInfo, 0, sizeof(messageInfo)); - messageInfo.mSockPort = socket->mSockName.mPort; - messageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD; + messageInfo.mSockPort = socket->mSockName.mPort; if (OT_ERROR_NONE != receivePacket(fd, payload, length, messageInfo)) {