]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Use IPv6 checksums in OSPFv3.
authorOndrej Zajicek <santiago@crfreenet.org>
Mon, 9 Nov 2009 22:22:53 +0000 (23:22 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Mon, 9 Nov 2009 22:22:53 +0000 (23:22 +0100)
lib/socket.h
proto/ospf/iface.c
proto/ospf/packet.c
sysdep/unix/io.c

index f44e8e88571873eab445fe8ffc68d6521f26537d..c642bdf9c66051a4bcfd91473389dbceaa825fea 100644 (file)
@@ -60,6 +60,10 @@ int sk_setup_multicast(sock *s);
 int sk_join_group(sock *s, ip_addr maddr);
 int sk_leave_group(sock *s, ip_addr maddr);
 
+#ifdef IPV6
+int sk_set_ipv6_checksum(sock *s, int offset);
+#endif
+
 static inline int
 sk_send_buffer_empty(sock *sk)
 {
index 9b65961d3a351257047744a36f9b9acfc0889572..e98414f20ae797fd93c937384c441fae2398a7d5 100644 (file)
@@ -89,6 +89,12 @@ ospf_open_socket(struct ospf_iface *ifa, int mc)
   if (sk_open(ipsk) != 0)
     goto err;
 
+#ifdef OSPFv3
+  /* 12 is an offset of the checksum in an OSPF packet */
+  if (sk_set_ipv6_checksum(ipsk, 12) < 0)
+    goto err;
+#endif
+
   if (mc)
   {
     if (sk_setup_multicast(ipsk) < 0)
index 9422a9f3dce722d0c14f2bc8efdaf84dd0bca365..94ec010936ecab058d64b474a97f22adb9324a29 100644 (file)
@@ -320,7 +320,6 @@ ospf_rx_hook(sock * sk, int size)
     return 1;
   }
 
-  /* FIXME - handle checksums in OSPFv3  */ 
 #ifdef OSPFv2
   if ((ps->autype != htons(OSPF_AUTH_CRYPT)) &&
       (!ipsum_verify(ps, 16, (void *) ps + sizeof(struct ospf_packet),
index 3eb2e03c40543414bb08aad70f5f1c9f2d248924..cd5c5db7b9559cc6e7655b34263d8f9614b1b0fb 100644 (file)
@@ -782,12 +782,29 @@ int
 sk_set_broadcast(sock *s, int enable)
 {
   if (setsockopt(s->fd, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(enable)) < 0)
-    log(L_ERR "sk_set_broadcast: SO_BROADCAST: %m");
+    {
+      log(L_ERR "sk_set_broadcast: SO_BROADCAST: %m");
+      return -1;
+    }
+
+  return 0;
 }
 
 
 #ifdef IPV6
 
+int
+sk_set_ipv6_checksum(sock *s, int offset)
+{
+  if (setsockopt(s->fd, IPPROTO_IPV6, IPV6_CHECKSUM, &offset, sizeof(offset)) < 0)
+    {
+      log(L_ERR "sk_set_ipv6_checksum: IPV6_CHECKSUM: %m");
+      return -1;
+    }
+
+  return 0;
+}
+
 int
 sk_setup_multicast(sock *s)
 {