- if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO)
- ifindex = ((struct in_pktinfo *) c)->ipi_ifindex;
- else if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO)
- ifindex = ((struct in6_pktinfo *) c)->ipi6_ifindex;
+ switch (cmsgptr->cmsg_type) {
+ case IPV6_PKTINFO:
+ inp = ((struct in6_pktinfo *) c);
+ break;
+
+ case IPV6_HOPLIMIT:
+ ttl = (uint8_t) *((int *) c);
+ break;
+
+ default:
+ fprintf(stderr, "unknown cmsg %x\n", cmsgptr->cmsg_type);
+ return;
+ }
+ }
+
+ if (ttl != 255)
+ return;
+
+ if (debug > 1) {
+ char buf[256];
+
+ fprintf(stderr, "RX ipv6: %s\n", iface->name);
+ fprintf(stderr, " multicast: %d\n", iface->multicast);
+ inet_ntop(AF_INET6, &from.sin6_addr, buf, 256);
+ fprintf(stderr, " src %s:%d\n", buf, from.sin6_port);
+ inet_ntop(AF_INET6, &inp->ipi6_addr, buf, 256);
+ fprintf(stderr, " dst %s\n", buf);