freebsd-ports/net/bird/files/patch-bird_addr_select
Alexander V. Chernikov 902ce1ba7f Do proper primary IP selection.
Do not strip binaries explicitly.
Bump revision.

Approved by:	vsevolod
2013-08-01 16:25:09 +00:00

77 lines
1.7 KiB
Text

diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index e970d6b..202255e 100644
--- sysdep/bsd/krt-sock.c
+++ sysdep/bsd/krt-sock.c
@@ -594,6 +594,45 @@ krt_read_addr(struct ks_msg *msg)
ifa_delete(&ifa);
}
+#ifndef IPV6
+struct ifa *
+kif_get_primary_ip(struct iface *i)
+{
+ struct ifreq ifr;
+ int fd, res;
+ struct sockaddr_in *sin;
+ ip_addr addr = IPA_NONE;
+ struct ifa *a = NULL;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+
+ if (fd == -1)
+ return NULL;
+
+ memset(&ifr, 0, sizeof(ifr));
+
+ strcpy(ifr.ifr_name, i->name);
+
+ res = ioctl(fd, SIOCGIFADDR, (char *)&ifr);
+ close(fd);
+
+ if (res == -1)
+ return NULL;
+
+ sin = (struct sockaddr_in *)&ifr.ifr_addr;
+ memcpy(&addr, &sin->sin_addr, sizeof(ip_addr));
+ ipa_ntoh(addr);
+
+ WALK_LIST(a, i->addrs)
+ {
+ if (a->ip == addr)
+ return a;
+ }
+
+ return NULL;
+}
+#endif
+
void
krt_read_msg(struct proto *p, struct ks_msg *msg, int scan)
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
index 3761ace..1fc4345 100644
--- sysdep/unix/krt.c
+++ sysdep/unix/krt.c
@@ -157,6 +157,9 @@ kif_choose_primary(struct iface *i)
return a;
}
+ if (a = kif_get_primary_ip(i))
+ return a;
+
return find_preferred_ifa(i, IPA_NONE, IPA_NONE);
}
diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h
index d6fbf72..3a037e3 100644
--- sysdep/unix/krt.h
+++ sysdep/unix/krt.h
@@ -78,6 +78,8 @@ void kif_request_scan(void);
void krt_got_route(struct krt_proto *p, struct rte *e);
void krt_got_route_async(struct krt_proto *p, struct rte *e, int new);
+struct ifa *kif_get_primary_ip(struct iface *i);
+
/* Values for rte->u.krt_sync.src */
#define KRT_SRC_UNKNOWN -1 /* Nobody knows */
#define KRT_SRC_BIRD 0 /* Our route (not passed in async mode) */