summaryrefslogtreecommitdiff
path: root/sysdep/bsd
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2017-12-07 13:06:01 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2017-12-07 13:06:01 +0100
commit153f02da3bce1f3f1a99295648679c71327e8319 (patch)
treeb7b7acf8026ba182f3a81f2d6da975b0b1524972 /sysdep/bsd
parent4ae3ee1200b386219673c2168eae996c6207b077 (diff)
Nest: Maintain separate IPv4, IPv6 and LLv6 preferred addresses
Also redesign preferred address selection and update protocols to use appropriate preferred address. Based on a previous work by Jan Maria Matejka.
Diffstat (limited to 'sysdep/bsd')
-rw-r--r--sysdep/bsd/krt-sock.c41
-rw-r--r--sysdep/bsd/sysio.h4
2 files changed, 18 insertions, 27 deletions
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index df639816..be8b50d6 100644
--- a/sysdep/bsd/krt-sock.c
+++ b/sysdep/bsd/krt-sock.c
@@ -287,18 +287,21 @@ krt_send_route(struct krt_proto *p, int cmd, rte *e)
#endif
{
/* Fallback for all other valid cases */
- if (!i->addr)
- {
- log(L_ERR "KRT: interface %s has no IP addess", i->name);
- return -1;
- }
#ifdef RTF_CLONING
if (cmd == RTM_ADD && (i->flags & IF_MULTIACCESS) != IF_MULTIACCESS) /* PTP */
msg.rtm.rtm_flags |= RTF_CLONING;
#endif
- sockaddr_fill(&gate, ipa_is_ip4(i->addr->ip) ? AF_INET : AF_INET6, i->addr->ip, NULL, 0);
+ struct ifa *addr = (net->n.addr->type == NET_IP4) ? i->addr4 : (i->addr6 ?: i->llv6);
+
+ if (!addr)
+ {
+ log(L_ERR "KRT: interface %s has no IP addess", i->name);
+ return -1;
+ }
+
+ sockaddr_fill(&gate, af, addr->ip, i, 0);
msg.rtm.rtm_addrs |= RTA_GATEWAY;
break;
}
@@ -1124,13 +1127,11 @@ kif_sys_shutdown(struct kif_proto *p)
krt_buffer_release(&p->p);
}
-
-struct ifa *
-kif_get_primary_ip(struct iface *i UNUSED)
+int
+kif_update_sysdep_addr(struct iface *i)
{
-#if 0
static int fd = -1;
-
+
if (fd < 0)
fd = socket(AF_INET, SOCK_DGRAM, 0);
@@ -1140,20 +1141,10 @@ kif_get_primary_ip(struct iface *i UNUSED)
int rv = ioctl(fd, SIOCGIFADDR, (char *) &ifr);
if (rv < 0)
- return NULL;
-
- ip_addr addr;
- struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
- memcpy(&addr, &sin->sin_addr.s_addr, sizeof(ip_addr));
- ipa_ntoh(addr);
+ return 0;
- struct ifa *a;
- WALK_LIST(a, i->addrs)
- {
- if (ipa_equal(a->ip, addr))
- return a;
- }
-#endif
+ ip4_addr old = i->sysdep;
+ i->sysdep = ip4_from_ipa(ipa_from_sa4(&ifr.ifr_addr);
- return NULL;
+ return !ip4_equal(i->sysdep, addr);
}
diff --git a/sysdep/bsd/sysio.h b/sysdep/bsd/sysio.h
index 0e895e20..68296e65 100644
--- a/sysdep/bsd/sysio.h
+++ b/sysdep/bsd/sysio.h
@@ -38,12 +38,12 @@
*/
#define INIT_MREQ4(maddr,ifa) \
- { .imr_multiaddr = ipa_to_in4(maddr), .imr_interface = ipa_to_in4(ifa->addr->ip) }
+ { .imr_multiaddr = ipa_to_in4(maddr), .imr_interface = ip4_to_in4(ifa->sysdep) }
static inline int
sk_setup_multicast4(sock *s)
{
- struct in_addr ifa = ipa_to_in4(s->iface->addr->ip);
+ struct in_addr ifa = ip4_to_in4(s->iface->sysdep);
u8 ttl = s->ttl;
u8 n = 0;