From 597ccb4900f3c3d8713529f90a738c6bc6df37c3 Mon Sep 17 00:00:00 2001 From: Martin Xu Date: Wed, 8 Dec 2010 16:28:39 +0800 Subject: [PATCH] inet: Add connman_inet_[add|remove]_to_bridge() routines --- include/inet.h | 2 ++ src/inet.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/inet.h b/include/inet.h index d7af826..7b34900 100644 --- a/include/inet.h +++ b/include/inet.h @@ -65,6 +65,8 @@ int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway); void connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress, const char *address, const char *netmask, const char *gateway); +int connman_inet_add_to_bridge(int index, const char *bridge); +int connman_inet_remove_from_bridge(int index, const char *bridge); #ifdef __cplusplus } diff --git a/src/inet.c b/src/inet.c index f6b8019..b5cd528 100644 --- a/src/inet.c +++ b/src/inet.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -1100,3 +1101,61 @@ connman_bool_t connman_inet_compare_subnet(int index, const char *host) return ((if_addr & netmask_addr) == (host_addr & netmask_addr)); } + +int connman_inet_remove_from_bridge(int index, const char *bridge) +{ + struct ifreq ifr; + int sk, err; + + if (bridge == NULL) + return -EINVAL; + + sk = socket(AF_INET, SOCK_STREAM, 0); + if (sk < 0) + return sk; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1); + ifr.ifr_ifindex = index; + + err = ioctl(sk, SIOCBRDELIF, &ifr); + + close(sk); + + if (err < 0) { + connman_error("Remove interface from bridge error %s", + strerror(errno)); + return err; + } + + return 0; +} + +int connman_inet_add_to_bridge(int index, const char *bridge) +{ + struct ifreq ifr; + int sk, err; + + if (bridge == NULL) + return -EINVAL; + + sk = socket(AF_INET, SOCK_STREAM, 0); + if (sk < 0) + return sk; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1); + ifr.ifr_ifindex = index; + + err = ioctl(sk, SIOCBRADDIF, &ifr); + + close(sk); + + if (err < 0) { + connman_error("Add interface to bridge error %s", + strerror(errno)); + return err; + } + + return 0; +} -- 2.7.4