Add carrier detection callbacks and driver data functions
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 30 Dec 2007 03:12:04 +0000 (04:12 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 30 Dec 2007 03:12:04 +0000 (04:12 +0100)
include/iface.h
src/iface.c
src/rtnl.c

index 930abe7..d4eb213 100644 (file)
@@ -63,7 +63,6 @@ struct connman_network {
 };
 
 struct connman_iface {
-       struct connman_iface_driver *driver;
        char *path;
        char *udi;
        char *sysfs;
@@ -73,6 +72,9 @@ struct connman_iface {
        enum connman_iface_flags flags;
        enum connman_iface_state state;
        struct connman_ipv4 ipv4;
+
+       struct connman_iface_driver *driver;
+       void *driver_data;
 };
 
 struct connman_iface_driver {
@@ -90,6 +92,7 @@ struct connman_iface_driver {
        int (*connect) (struct connman_iface *iface,
                                        struct connman_network *network);
 
+       void (*rtnl_carrier) (struct connman_iface *iface, int carrier);
        void (*rtnl_wireless) (struct connman_iface *iface,
                                        void *data, unsigned short len);
 };
@@ -97,9 +100,23 @@ struct connman_iface_driver {
 extern int connman_iface_register(struct connman_iface_driver *driver);
 extern void connman_iface_unregister(struct connman_iface_driver *driver);
 
+static inline void *connman_iface_get_data(struct connman_iface *iface)
+{
+       return iface->driver_data;
+}
+
+static inline void connman_iface_set_data(struct connman_iface *iface,
+                                                               void *data)
+{
+       iface->driver_data = data;
+}
+
 extern int connman_iface_update(struct connman_iface *iface,
                                        enum connman_iface_state state);
 
+extern void connman_iface_indicate_carrier(struct connman_iface *iface,
+                                                       int carrier);
+
 #ifdef __cplusplus
 }
 #endif
index 72bc142..a641bf3 100644 (file)
@@ -108,6 +108,11 @@ int connman_iface_update(struct connman_iface *iface,
        return 0;
 }
 
+void connman_iface_indicate_carrier(struct connman_iface *iface, int carrier)
+{
+       DBG("iface %p carrier %d", iface, carrier);
+}
+
 static DBusMessage *enable_iface(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
index 726d491..33031ff 100644 (file)
@@ -43,6 +43,12 @@ static inline void print_char(struct rtattr *attr, const char *name)
                                                (char *) RTA_DATA(attr));
 }
 
+static inline void print_byte(struct rtattr *attr, const char *name)
+{
+       printf("  attr %s (len %d) 0x%02x\n", name, RTA_PAYLOAD(attr),
+                                       *((unsigned char *) RTA_DATA(attr)));
+}
+
 static inline void print_attr(struct rtattr *attr, const char *name)
 {
        if (name)
@@ -71,9 +77,12 @@ static void rtnl_link(struct nlmsghdr *hdr)
        if ((iface->flags & CONNMAN_IFACE_FLAG_RTNL) == 0)
                return;
 
-       if (iface->carrier != (msg->ifi_flags & IFF_RUNNING)) {
-               iface->carrier = (msg->ifi_flags & IFF_RUNNING);
-               DBG("carrier %s", iface->carrier ? "on" : "off");
+       if (iface->carrier != ((msg->ifi_flags & IFF_RUNNING) != 0)) {
+               iface->carrier = ((msg->ifi_flags & IFF_RUNNING) != 0);
+               if (iface->driver->rtnl_carrier)
+                       iface->driver->rtnl_carrier(iface, iface->carrier);
+               else
+                       connman_iface_indicate_carrier(iface, iface->carrier);
        }
 
        for (attr = IFLA_RTA(msg); RTA_OK(attr, bytes);
@@ -127,10 +136,10 @@ static void rtnl_link(struct nlmsghdr *hdr)
                        print_attr(attr, "weight");
                        break;
                case IFLA_OPERSTATE:
-                       print_attr(attr, "operstate");
+                       print_byte(attr, "operstate");
                        break;
                case IFLA_LINKMODE:
-                       print_attr(attr, "linkmode");
+                       print_byte(attr, "linkmode");
                        break;
                default:
                        print_attr(attr, NULL);