diff --git a/srsue/src/upper/gw.cc b/srsue/src/upper/gw.cc index f121e5bea..75653524f 100644 --- a/srsue/src/upper/gw.cc +++ b/srsue/src/upper/gw.cc @@ -462,7 +462,7 @@ srslte::error_t gw::setup_if_addr6(uint8_t *ipv6_if_id, char *err_str) bool gw::find_ipv6_addr(struct in6_addr *in6_out) { - int status, rtattrlen, fd = -1; + int n, rtattrlen, fd = -1; unsigned int if_index; struct rtattr *rta, *rtatp; struct nlmsghdr *nlmp; @@ -506,41 +506,40 @@ bool gw::find_ipv6_addr(struct in6_addr *in6_out) rta->rta_len = RTA_LENGTH(16); // Time to send and recv the message from kernel - status = send(fd, &req, req.n.nlmsg_len, 0); - if (status < 0) { + n = send(fd, &req, req.n.nlmsg_len, 0); + if (n < 0) { gw_log->error("Error sending NETLINK message to kernel -- %s", strerror(errno)); goto err_out; } - status = recv(fd, buf, sizeof(buf), 0); - if (status < 0) { + n = recv(fd, buf, sizeof(buf), 0); + if (n < 0) { gw_log->error("Error receiving from NETLINK socket\n"); goto err_out; } - if (status == 0) { - printf("Nothing received from NETLINK Socket\n"); + if (n == 0) { + gw_log->error("Nothing received from NETLINK Socket\n"); goto err_out; } // Parse the reply - for (nlmp = (struct nlmsghdr *)buf; (size_t)status > sizeof(*nlmp);) { - int len = nlmp->nlmsg_len; - int req_len = len - sizeof(*nlmp); - - if (req_len < 0 || len > status) { - gw_log->error("Error in length of NETLINK message\n"); + for (nlmp = (struct nlmsghdr *)buf; NLMSG_OK (nlmp, n); nlmp = NLMSG_NEXT (nlmp, n)){ + + //Chack NL message type + if (nlmp->nlmsg_type == NLMSG_DONE){ + gw_log->error("Reach end of NETLINK message without finding IPv6 address.\n"); goto err_out; } - - if (!NLMSG_OK(nlmp, status)) { - gw_log->error("NLMSG not OK in NETLINK reply\n"); + if (nlmp->nlmsg_type == NLMSG_ERROR) { + gw_log->error("NLMSG_ERROR in NETLINK reply\n"); goto err_out; } + gw_log->debug("NETLINK message type %d\n", nlmp->nlmsg_type); + //Get IFA message rtmp = (struct ifaddrmsg *)NLMSG_DATA(nlmp); rtatp = (struct rtattr *)IFA_RTA(rtmp); - rtattrlen = IFA_PAYLOAD(nlmp); for (; RTA_OK(rtatp, rtattrlen); rtatp = RTA_NEXT(rtatp, rtattrlen)) { // We are looking IFA_ADDRESS rt_attribute type. @@ -555,8 +554,6 @@ bool gw::find_ipv6_addr(struct in6_addr *in6_out) } } } - status -= NLMSG_ALIGN(len); - nlmp = (struct nlmsghdr *)((char *)nlmp + NLMSG_ALIGN(len)); } err_out: