}
TAILQ_INIT(ctx->ra_routers);
- // controllen is set at send/recieve
ctx->sndhdr.msg_namelen = sizeof(struct sockaddr_in6);
ctx->sndhdr.msg_iov = ctx->sndiov;
ctx->sndhdr.msg_iovlen = 1;
ctx->sndhdr.msg_control = ctx->sndbuf;
- //ctx->sndhdr.msg_controllen = sizeof(ctx->sndbuf);
+ ctx->sndhdr.msg_controllen = sizeof(ctx->sndbuf);
ctx->rcvhdr.msg_name = &ctx->from;
ctx->rcvhdr.msg_namelen = sizeof(ctx->from);
ctx->rcvhdr.msg_iov = ctx->rcviov;
ctx->rcvhdr.msg_iovlen = 1;
ctx->rcvhdr.msg_control = ctx->rcvbuf;
+ // controllen is set at recieve
//ctx->rcvhdr.msg_controllen = sizeof(ctx->rcvbuf);
ctx->rcviov[0].iov_base = ctx->ansbuf;
ctx->rcviov[0].iov_len = sizeof(ctx->ansbuf);
}
#endif
+ /* RFC4861 4.1 */
+ on = 255;
+ if (setsockopt(ctx->nd_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+ &on, sizeof(on)) == -1)
+ goto eexit;
+
on = 1;
if (setsockopt(ctx->nd_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
&on, sizeof(on)) == -1)
struct sockaddr_in6 dst;
struct cmsghdr *cm;
struct in6_pktinfo pi;
- int hoplimit = 255; /* RFC4861 4.1 */
if (ipv6_linklocal(ifp) == NULL) {
syslog(LOG_DEBUG,
ctx->sndhdr.msg_name = (caddr_t)&dst;
ctx->sndhdr.msg_iov[0].iov_base = state->rs;
ctx->sndhdr.msg_iov[0].iov_len = state->rslen;
- ctx->sndhdr.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
- CMSG_SPACE(sizeof(int));
/* Set the outbound interface */
cm = CMSG_FIRSTHDR(&ctx->sndhdr);
pi.ipi6_ifindex = ifp->index;
memcpy(CMSG_DATA(cm), &pi, sizeof(pi));
- /* Hop limit */
- cm = CMSG_NXTHDR(&ctx->sndhdr, cm);
- if (cm == NULL) /* unlikely */
- return;
- cm->cmsg_level = IPPROTO_IPV6;
- cm->cmsg_type = IPV6_HOPLIMIT;
- cm->cmsg_len = CMSG_LEN(sizeof(hoplimit));
- memcpy(CMSG_DATA(cm), &hoplimit, sizeof(hoplimit));
-
syslog(LOG_DEBUG, "%s: sending Router Solicitation", ifp->name);
if (sendmsg(ctx->nd_fd, &ctx->sndhdr, 0) == -1) {
syslog(LOG_ERR, "%s: %s: sendmsg: %m", ifp->name, __func__);
struct sockaddr_in6 dst;
struct cmsghdr *cm;
struct in6_pktinfo pi;
- int hoplimit = 255; /* RFC4861 4.1 */
struct timeval tv, rtv;
struct ipv6_ctx *ctx;
ctx->sndhdr.msg_name = (caddr_t)&dst;
ctx->sndhdr.msg_iov[0].iov_base = rap->ns;
ctx->sndhdr.msg_iov[0].iov_len = rap->nslen;
- ctx->sndhdr.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
- CMSG_SPACE(sizeof(int));
/* Set the outbound interface */
cm = CMSG_FIRSTHDR(&ctx->sndhdr);
pi.ipi6_ifindex = rap->iface->index;
memcpy(CMSG_DATA(cm), &pi, sizeof(pi));
- /* Hop limit */
- cm = CMSG_NXTHDR(&ctx->sndhdr, cm);
- if (cm == NULL) /* unlikely */
- return;
- cm->cmsg_level = IPPROTO_IPV6;
- cm->cmsg_type = IPV6_HOPLIMIT;
- cm->cmsg_len = CMSG_LEN(sizeof(hoplimit));
- memcpy(CMSG_DATA(cm), &hoplimit, sizeof(hoplimit));
-
#ifdef DEBUG_NS
syslog(LOG_INFO, "%s: sending IPv6 NS for %s",
rap->iface->name, rap->sfrom);