diff options
-rw-r--r-- | interface.c | 6 | ||||
-rw-r--r-- | proto.c | 35 | ||||
-rw-r--r-- | proto.h | 7 |
3 files changed, 35 insertions, 13 deletions
diff --git a/interface.c b/interface.c index ba7b5e5..a947cf6 100644 --- a/interface.c +++ b/interface.c @@ -81,7 +81,7 @@ __set_interface_up(struct interface *iface) return ret; iface->state = IFS_SETUP; - ret = iface->proto->handler(iface->proto, PROTO_CMD_SETUP, false); + ret = interface_proto_event(iface->proto, PROTO_CMD_SETUP, false); if (ret) { mark_interface_down(iface); return ret; @@ -103,7 +103,7 @@ __set_interface_down(struct interface *iface, bool force) iface->state = IFS_TEARDOWN; interface_event(iface, IFEV_DOWN); - iface->proto->handler(iface->proto, PROTO_CMD_TEARDOWN, force); + interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, force); release_device(iface->main_dev.dev); } @@ -162,7 +162,7 @@ interface_proto_cb(struct interface_proto_state *state, enum interface_proto_eve void interface_set_proto_state(struct interface *iface, struct interface_proto_state *state) { if (iface->proto) { - iface->proto->handler(iface->proto, PROTO_CMD_TEARDOWN, true); + interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, true); iface->proto->free(iface->proto); iface->proto = NULL; } @@ -16,7 +16,30 @@ static int default_proto_handler(struct interface_proto_state *proto, enum interface_proto_cmd cmd, bool force) { + return 0; +} + +struct interface_proto_state *get_default_proto(void) +{ + struct interface_proto_state *proto; + + proto = calloc(1, sizeof(*proto)); + proto->handler = default_proto_handler; + proto->free = default_proto_free; + proto->flags = PROTO_FLAG_IMMEDIATE; + + return proto; +} + +int interface_proto_event(struct interface_proto_state *proto, + enum interface_proto_cmd cmd, bool force) +{ enum interface_event ev; + int ret; + + ret = proto->handler(proto, cmd, force); + if (ret || !(proto->flags & PROTO_FLAG_IMMEDIATE)) + goto out; switch(cmd) { case PROTO_CMD_SETUP: @@ -29,15 +52,7 @@ default_proto_handler(struct interface_proto_state *proto, return -EINVAL; } proto->proto_event(proto, ev); - return 0; -} -struct interface_proto_state *get_default_proto(void) -{ - struct interface_proto_state *proto; - - proto = calloc(1, sizeof(*proto)); - proto->handler = default_proto_handler; - proto->free = default_proto_free; - return proto; +out: + return ret; } @@ -13,8 +13,13 @@ enum interface_proto_cmd { PROTO_CMD_TEARDOWN, }; +enum { + PROTO_FLAG_IMMEDIATE = (1 << 0), +}; + struct interface_proto_state { struct interface *iface; + unsigned int flags; /* filled in by the protocol user */ void (*proto_event)(struct interface_proto_state *, enum interface_proto_event ev); @@ -25,5 +30,7 @@ struct interface_proto_state { }; struct interface_proto_state *get_default_proto(void); +int interface_proto_event(struct interface_proto_state *proto, + enum interface_proto_cmd cmd, bool force); #endif |