b16600ce749ab06ed2bbce301faddc99049d4d5a
[project/netifd.git] / proto.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 #include "netifd.h"
6 #include "interface.h"
7 #include "proto.h"
8
9 static void
10 default_proto_free(struct interface_proto_state *proto)
11 {
12 free(proto);
13 }
14
15 static int
16 default_proto_handler(struct interface_proto_state *proto,
17 enum interface_proto_cmd cmd, bool force)
18 {
19 return 0;
20 }
21
22 struct interface_proto_state *get_default_proto(void)
23 {
24 struct interface_proto_state *proto;
25
26 proto = calloc(1, sizeof(*proto));
27 proto->handler = default_proto_handler;
28 proto->free = default_proto_free;
29 proto->flags = PROTO_FLAG_IMMEDIATE;
30
31 return proto;
32 }
33
34 int interface_proto_event(struct interface_proto_state *proto,
35 enum interface_proto_cmd cmd, bool force)
36 {
37 enum interface_event ev;
38 int ret;
39
40 ret = proto->handler(proto, cmd, force);
41 if (ret || !(proto->flags & PROTO_FLAG_IMMEDIATE))
42 goto out;
43
44 switch(cmd) {
45 case PROTO_CMD_SETUP:
46 ev = IFEV_UP;
47 break;
48 case PROTO_CMD_TEARDOWN:
49 ev = IFEV_DOWN;
50 break;
51 default:
52 return -EINVAL;
53 }
54 proto->proto_event(proto, ev);
55
56 out:
57 return ret;
58 }