• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/netifd/proto-static.c

  1 /*
  2  * netifd - network interface daemon
  3  * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
  4  *
  5  * This program is free software; you can redistribute it and/or modify
  6  * it under the terms of the GNU General Public License version 2
  7  * as published by the Free Software Foundation
  8  *
  9  * This program is distributed in the hope that it will be useful,
 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12  * GNU General Public License for more details.
 13  */
 14 #include <string.h>
 15 #include <stdlib.h>
 16 #include <stdio.h>
 17 
 18 #include <arpa/inet.h>
 19 #include <netinet/in.h>
 20 
 21 #include "netifd.h"
 22 #include "interface.h"
 23 #include "interface-ip.h"
 24 #include "proto.h"
 25 #include "system.h"
 26 
 27 struct static_proto_state {
 28         struct interface_proto_state proto;
 29 
 30         struct blob_attr *config;
 31 };
 32 
 33 static bool
 34 static_proto_setup(struct static_proto_state *state)
 35 {
 36         struct interface *iface = state->proto.iface;
 37         struct device *dev = iface->main_dev.dev;
 38 
 39         interface_set_l3_dev(iface, dev);
 40         return proto_apply_static_ip_settings(state->proto.iface, state->config) == 0;
 41 }
 42 
 43 static int
 44 static_handler(struct interface_proto_state *proto,
 45                enum interface_proto_cmd cmd, bool force)
 46 {
 47         struct static_proto_state *state;
 48         int ret = 0;
 49 
 50         state = container_of(proto, struct static_proto_state, proto);
 51 
 52         switch (cmd) {
 53         case PROTO_CMD_SETUP:
 54                 if (!static_proto_setup(state))
 55                         return -1;
 56 
 57                 break;
 58         case PROTO_CMD_TEARDOWN:
 59         case PROTO_CMD_RENEW:
 60                 break;
 61         }
 62 
 63         return ret;
 64 }
 65 
 66 static void
 67 static_free(struct interface_proto_state *proto)
 68 {
 69         struct static_proto_state *state;
 70 
 71         state = container_of(proto, struct static_proto_state, proto);
 72         free(state->config);
 73         free(state);
 74 }
 75 
 76 static struct interface_proto_state *
 77 static_attach(const struct proto_handler *h, struct interface *iface,
 78               struct blob_attr *attr)
 79 {
 80         struct static_proto_state *state;
 81 
 82         state = calloc(1, sizeof(*state));
 83         if (!state)
 84                 return NULL;
 85 
 86         state->config = malloc(blob_pad_len(attr));
 87         if (!state->config)
 88                 goto error;
 89 
 90         memcpy(state->config, attr, blob_pad_len(attr));
 91         state->proto.free = static_free;
 92         state->proto.cb = static_handler;
 93 
 94         return &state->proto;
 95 
 96 error:
 97         free(state);
 98         return NULL;
 99 }
100 
101 static struct proto_handler static_proto = {
102         .name = "static",
103         .flags = PROTO_FLAG_IMMEDIATE |
104                  PROTO_FLAG_FORCE_LINK_DEFAULT,
105         .config_params = &proto_ip_attr,
106         .attach = static_attach,
107 };
108 
109 static void __init
110 static_proto_init(void)
111 {
112         add_proto_handler(&static_proto);
113 }
114 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt