On Thu, Mar 20, 2014 at 4:26 PM, Helmut Schaa
<[email protected]> wrote:
> Introduce a new device event "topology change" that gets signaled
> by bridges on adding/removing members.
>
> On "topology changes" the proto handlers are requested to "renew"
> which is most useful for DHCP.
>
> Signed-off-by: Helmut Schaa <[email protected]>
> ---
>
> Changes in v2:
> - Only run renew handler if registered during proto init

Felix, did you have a chance to review this yet?

Thanks,
Helmut

>  bridge.c                |  4 ++++
>  device.h                |  3 +++
>  interface.c             |  5 +++++
>  proto-shell.c           |  8 ++++++++
>  proto-static.c          |  1 +
>  proto.c                 |  3 +++
>  proto.h                 |  3 +++
>  scripts/netifd-proto.sh | 10 +++++++++-
>  vlan.c                  |  4 ++++
>  9 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/bridge.c b/bridge.c
> index 147fe0a..6baef29 100644
> --- a/bridge.c
> +++ b/bridge.c
> @@ -140,6 +140,8 @@ bridge_disable_member(struct bridge_member *bm)
>         system_bridge_delif(&bst->dev, bm->dev.dev);
>         device_release(&bm->dev);
>
> +       device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
> +
>         return 0;
>  }
>
> @@ -162,6 +164,8 @@ bridge_enable_member(struct bridge_member *bm)
>                 goto error;
>         }
>
> +       device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
> +
>         return 0;
>
>  error:
> diff --git a/device.h b/device.h
> index dd57927..8d2aca6 100644
> --- a/device.h
> +++ b/device.h
> @@ -78,6 +78,9 @@ enum device_event {
>         DEV_EVENT_LINK_UP,
>         DEV_EVENT_LINK_DOWN,
>
> +       /* Topology changed (i.e. bridge member added) */
> +       DEV_EVENT_TOPO_CHANGE,
> +
>         __DEV_EVENT_MAX
>  };
>
> diff --git a/interface.c b/interface.c
> index 4a3a725..fa8e55e 100644
> --- a/interface.c
> +++ b/interface.c
> @@ -328,6 +328,9 @@ interface_cb(struct device_user *dep, enum device_event 
> ev)
>          case DEV_EVENT_LINK_DOWN:
>                 interface_set_link_state(iface, new_state);
>                 break;
> +       case DEV_EVENT_TOPO_CHANGE:
> +               interface_proto_event(iface->proto, PROTO_CMD_RENEW, false);
> +               return;
>         default:
>                 break;
>         }
> @@ -599,6 +602,8 @@ interface_proto_cb(struct interface_proto_state *state, 
> enum interface_proto_eve
>                 mark_interface_down(iface);
>                 iface->state = IFS_SETUP;
>                 break;
> +       default:
> +               return;
>         }
>
>         interface_write_resolv_conf();
> diff --git a/proto-shell.c b/proto-shell.c
> index 9041045..de1b084 100644
> --- a/proto-shell.c
> +++ b/proto-shell.c
> @@ -159,6 +159,10 @@ proto_shell_handler(struct interface_proto_state *proto,
>                 state->last_error = -1;
>                 proto_shell_clear_host_dep(state);
>                 state->sm = S_SETUP;
> +       } else if (cmd == PROTO_CMD_RENEW) {
> +               if (!(handler->proto.flags & PROTO_FLAG_RENEW_AVAILABLE))
> +                       return 0;
> +               action = "renew";
>         } else {
>                 if (state->sm == S_TEARDOWN)
>                         return 0;
> @@ -761,6 +765,10 @@ proto_shell_add_handler(const char *script, const char 
> *name, json_object *obj)
>         if (tmp && json_object_get_boolean(tmp))
>                 handler->proto.flags |= PROTO_FLAG_INIT_AVAILABLE;
>
> +       tmp = json_get_field(obj, "renew-handler", json_type_boolean);
> +       if (tmp && json_object_get_boolean(tmp))
> +               handler->proto.flags |= PROTO_FLAG_RENEW_AVAILABLE;
> +
>         config = json_get_field(obj, "config", json_type_array);
>         if (config)
>                 handler->config_buf = 
> netifd_handler_parse_config(&handler->config, config);
> diff --git a/proto-static.c b/proto-static.c
> index 77a536a..b492d92 100644
> --- a/proto-static.c
> +++ b/proto-static.c
> @@ -52,6 +52,7 @@ static_handler(struct interface_proto_state *proto,
>
>                 break;
>         case PROTO_CMD_TEARDOWN:
> +       case PROTO_CMD_RENEW:
>                 break;
>         }
>
> diff --git a/proto.c b/proto.c
> index 64be308..3a7b2a8 100644
> --- a/proto.c
> +++ b/proto.c
> @@ -615,6 +615,9 @@ interface_proto_event(struct interface_proto_state *proto,
>         case PROTO_CMD_TEARDOWN:
>                 ev = IFPEV_DOWN;
>                 break;
> +       case PROTO_CMD_RENEW:
> +               ev = IFPEV_RENEW;
> +               break;
>         default:
>                 return -EINVAL;
>         }
> diff --git a/proto.h b/proto.h
> index e402a91..e7d84ac 100644
> --- a/proto.h
> +++ b/proto.h
> @@ -22,17 +22,20 @@ enum interface_proto_event {
>         IFPEV_UP,
>         IFPEV_DOWN,
>         IFPEV_LINK_LOST,
> +       IFPEV_RENEW,
>  };
>
>  enum interface_proto_cmd {
>         PROTO_CMD_SETUP,
>         PROTO_CMD_TEARDOWN,
> +       PROTO_CMD_RENEW,
>  };
>
>  enum {
>         PROTO_FLAG_IMMEDIATE = (1 << 0),
>         PROTO_FLAG_NODEV = (1 << 1),
>         PROTO_FLAG_INIT_AVAILABLE = (1 << 2),
> +       PROTO_FLAG_RENEW_AVAILABLE = (1 << 3),
>  };
>
>  struct interface_proto_state {
> diff --git a/scripts/netifd-proto.sh b/scripts/netifd-proto.sh
> index 7f08b1d..ce316c4 100644
> --- a/scripts/netifd-proto.sh
> +++ b/scripts/netifd-proto.sh
> @@ -20,6 +20,11 @@ _proto_do_teardown() {
>         eval "proto_$1_teardown \"$interface\" \"$ifname\""
>  }
>
> +_proto_do_renew() {
> +       json_load "$data"
> +       eval "proto_$1_renew \"$interface\" \"$ifname\""
> +}
> +
>  _proto_do_setup() {
>         json_load "$data"
>         _EXPORT_VAR=0
> @@ -352,6 +357,7 @@ init_proto() {
>                         add_protocol() {
>                                 no_device=0
>                                 available=0
> +                               renew_handler=0
>
>                                 add_default_handler "proto_$1_init_config"
>
> @@ -362,10 +368,11 @@ init_proto() {
>                                 json_close_array
>                                 json_add_boolean no-device "$no_device"
>                                 json_add_boolean available "$available"
> +                               json_add_boolean renew-handler 
> "$renew_handler"
>                                 json_dump
>                         }
>                 ;;
> -               setup|teardown)
> +               setup|teardown|renew)
>                         interface="$1"; shift
>                         data="$1"; shift
>                         ifname="$1"; shift
> @@ -376,6 +383,7 @@ init_proto() {
>                                 case "$cmd" in
>                                         setup) _proto_do_setup "$1";;
>                                         teardown) _proto_do_teardown "$1" ;;
> +                                       renew) _proto_do_renew "$1" ;;
>                                         *) return 1 ;;
>                                 esac
>                         }
> diff --git a/vlan.c b/vlan.c
> index 9201979..28e561b 100644
> --- a/vlan.c
> +++ b/vlan.c
> @@ -88,6 +88,10 @@ static void vlan_dev_cb(struct device_user *dep, enum 
> device_event ev)
>                 vlan_dev_set_name(vldev, dep->dev);
>                 device_broadcast_event(&vldev->dev, ev);
>                 break;
> +       case DEV_EVENT_TOPO_CHANGE:
> +               /* Propagate topo changes */
> +               device_broadcast_event(&vldev->dev, DEV_EVENT_TOPO_CHANGE);
> +               break;
>         default:
>                 break;
>         }
> --
> 1.8.1.4
>
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to