2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-09-01 06:45:27 +00:00

Tidy up the receive calls and eliminate the need for found_pkt

[ISC-Bugs #25066]
This commit is contained in:
Shawn Routhier
2012-02-10 00:07:06 +00:00
parent 87132514a0
commit 865afd5e44
2 changed files with 27 additions and 27 deletions

View File

@@ -81,6 +81,9 @@ work on other platforms. Please report any problems and suggested fixes to
from the DNS client code. from the DNS client code.
[ISC-Bugs 26287]. [ISC-Bugs 26287].
- Tidy up the receive calls and eliminate the need for found_pkt
[ISC-Bugs #25066]
Changes since 4.2.2 Changes since 4.2.2
- Fix the code that checks for an existing DDNS transaction to cancel - Fix the code that checks for an existing DDNS transaction to cancel

View File

@@ -765,7 +765,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
struct sockaddr_in *from; struct sockaddr_in *from;
struct hardware *hfrom; struct hardware *hfrom;
{ {
#if !defined(USE_V4_PKTINFO) #if !(defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO))
SOCKLEN_T flen = sizeof *from; SOCKLEN_T flen = sizeof *from;
#endif #endif
int result; int result;
@@ -788,7 +788,6 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
struct in_pktinfo *pktinfo; struct in_pktinfo *pktinfo;
unsigned int ifindex; unsigned int ifindex;
int found_pktinfo;
/* /*
* If necessary allocate space for the control message header. * If necessary allocate space for the control message header.
@@ -831,7 +830,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
* We set up some space for a "control message". We have * We set up some space for a "control message". We have
* previously asked the kernel to give us packet * previously asked the kernel to give us packet
* information (when we initialized the interface), so we * information (when we initialized the interface), so we
* should get the destination address from that. * should get the interface index from that.
*/ */
m.msg_control = control_buf; m.msg_control = control_buf;
m.msg_controllen = control_buf_len; m.msg_controllen = control_buf_len;
@@ -842,12 +841,8 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
/* /*
* If we did read successfully, then we need to loop * If we did read successfully, then we need to loop
* through the control messages we received and * through the control messages we received and
* find the one with our destination address. * find the one with our inteface index.
*
* We also keep a flag to see if we found it. If we
* didn't, then we consider this to be an error.
*/ */
found_pktinfo = 0;
cmsg = CMSG_FIRSTHDR(&m); cmsg = CMSG_FIRSTHDR(&m);
while (cmsg != NULL) { while (cmsg != NULL) {
if ((cmsg->cmsg_level == IPPROTO_IP) && if ((cmsg->cmsg_level == IPPROTO_IP) &&
@@ -861,18 +856,21 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
* the discover code. * the discover code.
*/ */
memcpy(hfrom->hbuf, &ifindex, sizeof(ifindex)); memcpy(hfrom->hbuf, &ifindex, sizeof(ifindex));
found_pktinfo = 1; return (result);
} }
cmsg = CMSG_NXTHDR(&m, cmsg); cmsg = CMSG_NXTHDR(&m, cmsg);
} }
if (!found_pktinfo) {
result = -1; /*
errno = EIO; * We didn't find the necessary control message
} * flag it as an error
*/
result = -1;
errno = EIO;
} }
#else #else
result = recvfrom (interface -> rfdesc, (char *)buf, len, 0, result = recvfrom(interface -> rfdesc, (char *)buf, len, 0,
(struct sockaddr *)from, &flen); (struct sockaddr *)from, &flen);
#endif /* IP_PKTINFO ... */ #endif /* IP_PKTINFO ... */
#ifdef IGNORE_HOSTUNREACH #ifdef IGNORE_HOSTUNREACH
} while (result < 0 && } while (result < 0 &&
@@ -880,7 +878,7 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
errno == ECONNREFUSED) && errno == ECONNREFUSED) &&
retry++ < 10); retry++ < 10);
#endif #endif
return result; return (result);
} }
#endif /* USE_SOCKET_RECEIVE */ #endif /* USE_SOCKET_RECEIVE */
@@ -897,7 +895,6 @@ receive_packet6(struct interface_info *interface,
int result; int result;
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
struct in6_pktinfo *pktinfo; struct in6_pktinfo *pktinfo;
int found_pktinfo;
/* /*
* If necessary allocate space for the control message header. * If necessary allocate space for the control message header.
@@ -952,11 +949,7 @@ receive_packet6(struct interface_info *interface,
* If we did read successfully, then we need to loop * If we did read successfully, then we need to loop
* through the control messages we received and * through the control messages we received and
* find the one with our destination address. * find the one with our destination address.
*
* We also keep a flag to see if we found it. If we
* didn't, then we consider this to be an error.
*/ */
found_pktinfo = 0;
cmsg = CMSG_FIRSTHDR(&m); cmsg = CMSG_FIRSTHDR(&m);
while (cmsg != NULL) { while (cmsg != NULL) {
if ((cmsg->cmsg_level == IPPROTO_IPV6) && if ((cmsg->cmsg_level == IPPROTO_IPV6) &&
@@ -964,17 +957,21 @@ receive_packet6(struct interface_info *interface,
pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
*to_addr = pktinfo->ipi6_addr; *to_addr = pktinfo->ipi6_addr;
*if_idx = pktinfo->ipi6_ifindex; *if_idx = pktinfo->ipi6_ifindex;
found_pktinfo = 1;
return (result);
} }
cmsg = CMSG_NXTHDR(&m, cmsg); cmsg = CMSG_NXTHDR(&m, cmsg);
} }
if (!found_pktinfo) {
result = -1; /*
errno = EIO; * We didn't find the necessary control message
} * flag is as an error
*/
result = -1;
errno = EIO;
} }
return result; return (result);
} }
#endif /* DHCPv6 */ #endif /* DHCPv6 */