vxlan: add missing options
[project/unetd.git] / service.h
index ff652b7d9789acb1730ca43f0136ae1de58cee81..09041d837e6aa4184ba6c77489ad4cd21e2bf8b0 100644 (file)
--- a/service.h
+++ b/service.h
@@ -5,17 +5,56 @@
 #ifndef __UNETD_SERVICE_H
 #define __UNETD_SERVICE_H
 
+struct vxlan_tunnel;
+struct service_ops;
+
 struct network_service {
-       struct avl_node node;
+       struct vlist_node node;
+
+       struct blob_attr *config;
 
        const char *type;
 
+       const struct service_ops *ops;
+       union {
+               struct vxlan_tunnel *vxlan;
+               void *priv;
+       };
+
        int n_members;
        struct network_host *members[];
 };
 
+struct service_ops {
+       void (*init)(struct network *net,
+                    struct network_service *s_new,
+                    struct network_service *s_old);
+       void (*peer_update)(struct network *net, struct network_service *s,
+                           struct network_peer *peer);
+       void (*free)(struct network *net, struct network_service *s);
+};
+
+extern const struct service_ops vxlan_ops;
+
+static inline const char *
+network_service_name(struct network_service *s)
+{
+       return s->node.avl.key;
+}
+
 void network_services_init(struct network *net);
 void network_services_free(struct network *net);
 void network_services_add(struct network *net, struct blob_attr *data);
+void network_services_peer_update(struct network *net, struct network_peer *peer);
+
+static inline void network_services_update_start(struct network *net)
+{
+       vlist_update(&net->services);
+}
+
+static inline void network_services_update_done(struct network *net)
+{
+       vlist_flush(&net->services);
+}
 
 #endif