-static int
-static_handler(struct interface_proto_state *proto,
- enum interface_proto_cmd cmd, bool force)
-{
- struct static_proto_state *state;
- struct device *dev;
- int ret = 0;
- int i;
-
- state = container_of(proto, struct static_proto_state, proto);
- dev = state->iface->main_dev.dev;
-
- switch (cmd) {
- case PROTO_CMD_SETUP:
- for (i = 0; i < state->n_v4; i++) {
- if (ret)
- break;
- ret = system_add_address(dev, AF_INET,
- &state->v4[i].addr, state->v4[i].prefix);
- }
- for (i = 0; i < state->n_v6; i++) {
- if (ret)
- break;
- ret = system_add_address(dev, AF_INET6,
- &state->v6[i].addr, state->v6[i].prefix);
- }
-
- if (!ret)
- return 0;
-
- interface_add_error(state->iface, "proto-static",
- "SET_ADDRESS_FAILED", NULL, 0);
- /* fall through */
-
- case PROTO_CMD_TEARDOWN:
- for (i = 0; i < state->n_v4; i++)
- system_del_address(dev, AF_INET, &state->v4[i].addr);
- for (i = 0; i < state->n_v6; i++)
- system_del_address(dev, AF_INET6, &state->v6[i].addr);
- break;
- }
- return ret;
-}
-
-static void
-static_free(struct interface_proto_state *proto)
-{
- struct static_proto_state *state;
-
- state = container_of(proto, struct static_proto_state, proto);
- free(state);
-}
-
-struct interface_proto_state *
-static_create_state(struct interface *iface, struct v4_addr *v4, int n_v4, struct v6_addr *v6, int n_v6)
-{
- struct static_proto_state *state;
- int v4_len = sizeof(struct v4_addr) * n_v4;
- int v6_len = sizeof(struct v6_addr) * n_v6;
- void *next;
-
- state = calloc(1, sizeof(*state) + v4_len + v6_len);
- state->iface = iface;
- state->proto.free = static_free;
- state->proto.handler = static_handler;
- state->proto.flags = PROTO_FLAG_IMMEDIATE;
- next = (void *) (state + 1);
-
- if (n_v4) {
- state->n_v4 = n_v4;
- state->v4 = next;
- memcpy(state->v4, v4, sizeof(*v4) * n_v4);
- next = state->v4 + n_v4;
- }