From 56b7cadaeb51a60afa5666e190906d332840d5a1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 3 Apr 2011 19:05:48 +0200 Subject: [PATCH] move immediate protocol state transitions to a wrapper function --- interface.c | 6 +++--- proto.c | 35 +++++++++++++++++++++++++---------- 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; } diff --git a/proto.c b/proto.c index 287eae5..b16600c 100644 --- a/proto.c +++ b/proto.c @@ -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; } diff --git a/proto.h b/proto.h index 92cef01..d94b992 100644 --- a/proto.h +++ b/proto.h @@ -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 -- 2.11.0