openbsd-ports/net/olsrd/patches/patch-src_bsd_kernel_routes_c
stsp d1ead8c734 Several fixes for our net/olsrd port:
Make sendto() work for IPv4 by setting the IP_MULTICAST_IF socket option.
Allows this port to drop the dependency on net/libnet and stop using the
associated sendto() replacement hack (which supports only IPv4).

Make IPv6 work: Fix adding/deleting IPv6 routes, and don't complain
about a missing net.inet6.icmp6.rediraccept sysctl.

Also enable the verbose build so build logs show the commands
being used to compile things.

ok danj@ sthen@
2017-06-20 15:14:10 +00:00

125 lines
4.5 KiB
Plaintext

$OpenBSD: patch-src_bsd_kernel_routes_c,v 1.3 2017/06/20 15:14:10 stsp Exp $
Index: src/bsd/kernel_routes.c
--- src/bsd/kernel_routes.c.orig
+++ src/bsd/kernel_routes.c
@@ -115,6 +115,9 @@ add_del_route(const struct rt_entry *rt, int add)
rtm->rtm_flags = olsr_rt_flags(rt, add);
rtm->rtm_pid = OLSR_PID;
rtm->rtm_seq = ++seq;
+#if defined(__OpenBSD__)
+ rtm->rtm_tableid = getrtable();
+#endif
/* walk to the end of the header */
walker = buff + sizeof(struct rt_msghdr);
@@ -226,14 +229,24 @@ add_del_route(const struct rt_entry *rt, int add)
drtm->rtm_version = RTM_VERSION;
drtm->rtm_type = RTM_DELETE;
drtm->rtm_index = 0;
- drtm->rtm_flags = olsr_rt_flags(rt, add);
+ drtm->rtm_flags = olsr_rt_flags(rt, 0);
drtm->rtm_seq = ++seq;
+#if defined(__OpenBSD__)
+ drtm->rtm_tableid = getrtable();
+#endif
walker = dbuff + sizeof(struct rt_msghdr);
sin4.sin_addr = rt->rt_dst.prefix.v4;
memcpy(walker, &sin4, sizeof(sin4));
walker += sin_size;
drtm->rtm_addrs = RTA_DST;
+ if (0 == (drtm->rtm_flags & RTF_HOST)) {
+ olsr_prefix_to_netmask(&mask, rt->rt_dst.prefix_len);
+ sin4.sin_addr = mask.v4;
+ memcpy(walker, &sin4, sizeof(sin4));
+ walker += sin_size;
+ drtm->rtm_addrs |= RTA_NETMASK;
+ }
drtm->rtm_msglen = (unsigned short)(walker - dbuff);
len = write(olsr_cnf->rts, dbuff, drtm->rtm_msglen);
if (len < 0) {
@@ -302,6 +315,9 @@ add_del_route6(const struct rt_entry *rt, int add)
rtm->rtm_flags = olsr_rt_flags(rt, add);
rtm->rtm_pid = OLSR_PID;
rtm->rtm_seq = ++seq;
+#if defined(__OpenBSD__)
+ rtm->rtm_tableid = getrtable();
+#endif
/* walk to the end of the header */
walker = buff + sizeof(struct rt_msghdr);
@@ -322,13 +338,15 @@ add_del_route6(const struct rt_entry *rt, int add)
nexthop = olsr_get_nh(rt);
if (0 != (rtm->rtm_flags & RTF_GATEWAY)) {
memcpy(&sin6.sin6_addr.s6_addr, &nexthop->gateway.v6, sizeof(struct in6_addr));
- memset(&sin6.sin6_addr.s6_addr, 0, 8);
- sin6.sin6_addr.s6_addr[0] = 0xfe;
- sin6.sin6_addr.s6_addr[1] = 0x80;
- sin6.sin6_scope_id = nexthop->iif_index;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr))
+ sin6.sin6_scope_id = nexthop->iif_index;
#ifdef __KAME__
- *(u_int16_t *) & sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id);
- sin6.sin6_scope_id = 0;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr))
+ {
+ uint16_t tmp16 = htons(sin6.sin6_scope_id);
+ memcpy(&sin6.sin6_addr.s6_addr[2], &tmp16, sizeof(uint16_t));
+ sin6.sin6_scope_id = 0;
+ }
#endif /* __KAME__ */
memcpy(walker, &sin6, sizeof(sin6));
walker += sin_size;
@@ -336,22 +354,15 @@ add_del_route6(const struct rt_entry *rt, int add)
}
else {
/*
- * Host is directly reachable, so add
- * the output interface MAC address.
+ * Host is directly reachable, add a cloning route.
*/
- memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6, sizeof(struct in6_addr));
- memset(&sin6.sin6_addr.s6_addr, 0, 8);
- sin6.sin6_addr.s6_addr[0] = 0xfe;
- sin6.sin6_addr.s6_addr[1] = 0x80;
+ sdl.sdl_index = nexthop->iif_index;
sin6.sin6_scope_id = nexthop->iif_index;
-#ifdef __KAME__
- *(u_int16_t *) & sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id);
- sin6.sin6_scope_id = 0;
-#endif /* __KAME__ */
- memcpy(walker, &sin6, sizeof(sin6));
- walker += sin_size;
+ memcpy(walker, &sdl, sizeof(sdl));
+ walker += sdl_size;
rtm->rtm_addrs |= RTA_GATEWAY;
- rtm->rtm_flags |= RTF_GATEWAY;
+ rtm->rtm_flags |= RTF_CLONING;
+ rtm->rtm_flags &= ~RTF_GATEWAY;
}
/**********************************************************************
@@ -389,12 +400,21 @@ add_del_route6(const struct rt_entry *rt, int add)
drtm->rtm_index = 0;
drtm->rtm_flags = olsr_rt_flags(rt, add);
drtm->rtm_seq = ++seq;
+#if defined(__OpenBSD__)
+ drtm->rtm_tableid = getrtable();
+#endif
walker = dbuff + sizeof(struct rt_msghdr);
memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6, sizeof(struct in6_addr));
memcpy(walker, &sin6, sizeof(sin6));
walker += sin_size;
drtm->rtm_addrs = RTA_DST;
+ if (0 == (drtm->rtm_flags & RTF_HOST)) {
+ olsr_prefix_to_netmask((union olsr_ip_addr *)&sin6.sin6_addr, rt->rt_dst.prefix_len);
+ memcpy(walker, &sin6, sizeof(sin6));
+ walker += sin_size;
+ drtm->rtm_addrs |= RTA_NETMASK;
+ }
drtm->rtm_msglen = (unsigned short)(walker - dbuff);
len = write(olsr_cnf->rts, dbuff, drtm->rtm_msglen);
if (len < 0) {