inet: Add connman_inet_[add|remove]_to_bridge() routines
authorMartin Xu <martin.xu@intel.com>
Wed, 8 Dec 2010 08:28:39 +0000 (16:28 +0800)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 8 Dec 2010 11:22:02 +0000 (12:22 +0100)
include/inet.h
src/inet.c

index d7af826..7b34900 100644 (file)
@@ -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
 }
index f6b8019..b5cd528 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/stat.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
+#include <linux/sockios.h>
 #include <arpa/inet.h>
 #include <net/route.h>
 #include <net/ethernet.h>
@@ -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;
+}