-static int
-static_handler(struct interface_proto_state *proto,
- enum interface_proto_cmd cmd, bool force)
-{
- struct static_proto_state *state;
- struct static_proto_settings *ps;
- struct device *dev;
- int ret = 0;
- int i;
-
- state = container_of(proto, struct static_proto_state, proto);
- ps = &state->s;
- dev = state->iface->main_dev.dev;
-
- switch (cmd) {
- case PROTO_CMD_SETUP:
- for (i = 0; i < state->s.n_v4; i++) {
- if (ret)
- break;
- ret = system_add_address(dev, AF_INET,
- &ps->v4[i].addr, ps->v4[i].prefix);
- }
- for (i = 0; i < state->s.n_v6; i++) {
- if (ret)
- break;
- ret = system_add_address(dev, AF_INET6,
- &ps->v6[i].addr, ps->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 < ps->n_v4; i++)
- system_del_address(dev, AF_INET, &ps->v4[i].addr);
- for (i = 0; i < ps->n_v6; i++)
- system_del_address(dev, AF_INET6, &ps->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 static_proto_settings *ps)
-{
- struct static_proto_state *state;
- int v4_len = sizeof(struct v4_addr) * ps->n_v4;
- int v6_len = sizeof(struct v6_addr) * ps->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;
- memcpy(&state->s, ps, sizeof(state->s));
-
- next = (void *) (state + 1);
-
- if (ps->n_v4) {
- ps->v4 = next;
- memcpy(next, ps->v4, sizeof(struct v4_addr) * ps->n_v4);
-
- next = ps->v4 + ps->n_v4;
- }
-
- if (ps->n_v6) {
- ps->v6 = next;
- memcpy(next, ps->v6, sizeof(struct v6_addr) * ps->n_v6);
- }
-
- return &state->proto;
-}
-