aboutsummaryrefslogtreecommitdiffstats
path: root/pingu_iface.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-07-15 11:38:36 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-07-15 11:38:36 +0200
commitb1817e210a434bec5543c574c6846f6e114426a5 (patch)
tree5cf1c6e1617fbfb3bf15434a9a7afb4d1515dc9b /pingu_iface.c
parentce876b2ff6d01b5c6f488836dad92807bef735ef (diff)
downloadpingu-b1817e210a434bec5543c574c6846f6e114426a5.tar.bz2
pingu-b1817e210a434bec5543c574c6846f6e114426a5.tar.xz
pingu_netlink: pick up primary address for interfaces
Diffstat (limited to 'pingu_iface.c')
-rw-r--r--pingu_iface.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/pingu_iface.c b/pingu_iface.c
index b5d8355..4de0bc6 100644
--- a/pingu_iface.c
+++ b/pingu_iface.c
@@ -62,7 +62,7 @@ int pingu_iface_usable(struct pingu_iface *iface)
return iface->has_link && iface->has_binding;
}
-struct pingu_iface *pingu_iface_find(const char *name)
+struct pingu_iface *pingu_iface_get_by_name(const char *name)
{
struct pingu_iface *iface;
list_for_each_entry(iface, &iface_list, iface_list_entry) {
@@ -75,9 +75,19 @@ struct pingu_iface *pingu_iface_find(const char *name)
return NULL;
}
+struct pingu_iface *pingu_iface_get_by_index(int index)
+{
+ struct pingu_iface *iface;
+ list_for_each_entry(iface, &iface_list, iface_list_entry) {
+ if (iface->index == index)
+ return iface;
+ }
+ return NULL;
+}
+
struct pingu_iface *pingu_iface_find_or_create(struct ev_loop *loop, const char *name)
{
- struct pingu_iface *iface = pingu_iface_find(name);
+ struct pingu_iface *iface = pingu_iface_get_by_name(name);
if (iface != NULL)
return iface;
@@ -99,6 +109,25 @@ struct pingu_iface *pingu_iface_find_or_create(struct ev_loop *loop, const char
return iface;
}
+void pingu_iface_set_addr(struct pingu_iface *iface, int family,
+ void *data, int len)
+{
+ struct sockaddr_in *sin;
+ memset(&iface->primary_addr, 0, sizeof(iface->primary_addr));
+ if (len <= 0) {
+ log_debug("%s: address removed", iface->name);
+ return;
+ }
+ iface->primary_addr.sa_family = family;
+ switch (family) {
+ case AF_INET:
+ sin = (struct sockaddr_in *)&iface->primary_addr;
+ memcpy(&sin->sin_addr, data, len);
+ log_debug("%s: new address: %s", iface->name, inet_ntoa(sin->sin_addr));
+ break;
+ }
+}
+
int pingu_iface_init(struct ev_loop *loop, struct list_head *host_list)
{
struct pingu_host *host;