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)
{
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)
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),
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)
{