--- a/lib/socket.h
+++ b/lib/socket.h
@@ -85,6 +85,7 @@
 #define SKF_V6ONLY	1	/* Use IPV6_V6ONLY socket option */
 #define SKF_LADDR_RX	2	/* Report local address for RX packets */
 #define SKF_LADDR_TX	4	/* Allow to specify local address for TX packets */
+#define SKF_HLIM_RX	8	/* Report Hop Limit for RX packets */
 
 
 /*
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -670,7 +670,7 @@
 #ifdef IPV6
 
 /* PKTINFO handling is also standardized in IPv6 */
-#define CMSG_RX_SPACE CMSG_SPACE(sizeof(struct in6_pktinfo))
+#define CMSG_RX_SPACE CMSG_SPACE(sizeof(struct in6_pktinfo) + 13)
 #define CMSG_TX_SPACE CMSG_SPACE(sizeof(struct in6_pktinfo))
 
 /*
@@ -682,6 +682,12 @@
 #ifndef IPV6_RECVPKTINFO
 #define IPV6_RECVPKTINFO IPV6_PKTINFO
 #endif
+/*
+ * Same goes for IPV6_HOPLIMIT -> IPV6_RECVHOPLIMIT.
+ */
+#ifndef IPV6_RECVHOPLIMIT
+#define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT
+#endif
 
 static char *
 sysio_register_cmsgs(sock *s)
@@ -690,6 +696,9 @@
   if ((s->flags & SKF_LADDR_RX) &&
       setsockopt(s->fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &ok, sizeof(ok)) < 0)
     return "IPV6_RECVPKTINFO";
+  if ((s->flags & SKF_HLIM_RX) &&
+      setsockopt(s->fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &ok, sizeof(ok)) < 0)
+    return "IPV6_RECVHOPLIMIT";
 
   return NULL;
 }
@@ -699,25 +708,36 @@
 {
   struct cmsghdr *cm;
   struct in6_pktinfo *pi = NULL;
+  int *hlim = NULL;
 
-  if (!(s->flags & SKF_LADDR_RX))
+  if (!(s->flags & (SKF_LADDR_RX | SKF_HLIM_RX)))
     return;
 
-  for (cm = CMSG_FIRSTHDR(msg); cm != NULL; cm = CMSG_NXTHDR(msg, cm))
-    {
-      if (cm->cmsg_level == IPPROTO_IPV6 && cm->cmsg_type == IPV6_PKTINFO)
-	pi = (struct in6_pktinfo *) CMSG_DATA(cm);
-    }
+  for (cm = CMSG_FIRSTHDR(msg); cm != NULL; cm = CMSG_NXTHDR(msg, cm)) {
+    if (cm->cmsg_level == IPPROTO_IPV6 && cm->cmsg_type == IPV6_PKTINFO)
+      pi = (struct in6_pktinfo *) CMSG_DATA(cm);
+    if (cm->cmsg_level == IPPROTO_IPV6 && cm->cmsg_type == IPV6_HOPLIMIT &&
+        cm->cmsg_len == CMSG_LEN(sizeof(int)))
+      hlim = (int *) CMSG_DATA(cm);
+  }
 
-  if (!pi)
-    {
+  if ((s->flags & SKF_LADDR_RX)) {
+    if (!pi) {
       s->laddr = IPA_NONE;
       s->lifindex = 0;
-      return;
+    } else {
+      get_inaddr(&s->laddr, &pi->ipi6_addr);
+      s->lifindex = pi->ipi6_ifindex;
     }
+  }
+
+  if ((s->flags & SKF_HLIM_RX)) {
+    if (!hlim)
+      s->ttl = -1;
+    else
+      s->ttl = *hlim;
+  }
 
-  get_inaddr(&s->laddr, &pi->ipi6_addr);
-  s->lifindex = pi->ipi6_ifindex;
   return;
 }
 
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -478,6 +478,11 @@
   if (! i->iface || s->lifindex != i->iface->index)
     return 1;
 
+  if (s->ttl < 255) {
+    log( L_REMOTE "%s: Discarding packet with HLIM = %d < 255 from %I on %s.", p->name, s->ttl, s->faddr, i->iface ? i->iface->name : "(dummy)" );
+    return 1;
+  }
+
   iface = i->iface;
 #endif
 
@@ -706,9 +711,14 @@
   rif->sock->dport = P_CF->port;
   if (new)
     {
+#ifndef IPV6
       rif->sock->ttl = 1;
-      rif->sock->tos = IP_PREC_INTERNET_CONTROL;
       rif->sock->flags = SKF_LADDR_RX;
+#else
+      rif->sock->ttl = 255;
+      rif->sock->flags = (SKF_LADDR_RX | SKF_HLIM_RX);
+#endif
+      rif->sock->tos = IP_PREC_INTERNET_CONTROL;
     }
 
   if (new) {
