swconfig: swlib.c: free device name and alias
[openwrt/svn-archive/archive.git] / package / network / config / swconfig / src / swlib.h
1 /*
2 * swlib.h: Switch configuration API (user space part)
3 *
4 * Copyright (C) 2008-2009 Felix Fietkau <nbd@openwrt.org>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * version 2.1 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15
16 Usage of the library functions:
17
18 The main datastructure for a switch is the struct switch_device
19 To get started, you first need to use switch_connect() to probe
20 for switches and allocate an instance of this struct.
21
22 There are two possible usage modes:
23 dev = switch_connect("eth0");
24 - this call will look for a switch registered for the linux device
25 "eth0" and only allocate a switch_device for this particular switch.
26
27 dev = switch_connect(NULL)
28 - this will return one switch_device struct for each available
29 switch. The switch_device structs are chained with by ->next pointer
30
31 Then to query a switch for all available attributes, use:
32 swlib_scan(dev);
33
34 All allocated datastructures for the switch_device struct can be freed with
35 swlib_free(dev);
36 or
37 swlib_free_all(dev);
38
39 The latter traverses a whole chain of switch_device structs and frees them all
40
41 Switch attributes (struct switch_attr) are divided into three groups:
42 dev->ops:
43 - global settings
44 dev->port_ops:
45 - per-port settings
46 dev->vlan_ops:
47 - per-vlan settings
48
49 switch_lookup_attr() is a small helper function to locate attributes
50 by name.
51
52 switch_set_attr() and switch_get_attr() can alter or request the values
53 of attributes.
54
55 Usage of the switch_attr struct:
56
57 ->atype: attribute group, one of:
58 - SWLIB_ATTR_GROUP_GLOBAL
59 - SWLIB_ATTR_GROUP_VLAN
60 - SWLIB_ATTR_GROUP_PORT
61
62 ->id: identifier for the attribute
63
64 ->type: data type, one of:
65 - SWITCH_TYPE_INT
66 - SWITCH_TYPE_STRING
67 - SWITCH_TYPE_PORT
68
69 ->name: short name of the attribute
70 ->description: longer description
71 ->next: pointer to the next attribute of the current group
72
73
74 Usage of the switch_val struct:
75
76 When setting attributes, following members of the struct switch_val need
77 to be set up:
78
79 ->len (for attr->type == SWITCH_TYPE_PORT)
80 ->port_vlan:
81 - port number (for attr->atype == SWLIB_ATTR_GROUP_PORT), or:
82 - vlan number (for attr->atype == SWLIB_ATTR_GROUP_VLAN)
83 ->value.i (for attr->type == SWITCH_TYPE_INT)
84 ->value.s (for attr->type == SWITCH_TYPE_STRING)
85 - owned by the caller, not stored in the library internally
86 ->value.ports (for attr->type == SWITCH_TYPE_PORT)
87 - must point to an array of at lest val->len * sizeof(struct switch_port)
88
89 When getting string attributes, val->value.s must be freed by the caller
90 When getting port list attributes, an internal static buffer is used,
91 which changes from call to call.
92
93 */
94
95 #ifndef __SWLIB_H
96 #define __SWLIB_H
97
98 enum swlib_attr_group {
99 SWLIB_ATTR_GROUP_GLOBAL,
100 SWLIB_ATTR_GROUP_VLAN,
101 SWLIB_ATTR_GROUP_PORT,
102 };
103
104 enum swlib_port_flags {
105 SWLIB_PORT_FLAG_TAGGED = (1 << 0),
106 };
107
108
109 struct switch_dev;
110 struct switch_attr;
111 struct switch_port;
112 struct switch_port_map;
113 struct switch_val;
114 struct uci_package;
115
116 struct switch_dev {
117 int id;
118 char dev_name[IFNAMSIZ];
119 char *name;
120 char *alias;
121 int ports;
122 int vlans;
123 int cpu_port;
124 struct switch_attr *ops;
125 struct switch_attr *port_ops;
126 struct switch_attr *vlan_ops;
127 struct switch_portmap *maps;
128 struct switch_dev *next;
129 void *priv;
130 };
131
132 struct switch_val {
133 struct switch_attr *attr;
134 int len;
135 int err;
136 int port_vlan;
137 union {
138 const char *s;
139 int i;
140 struct switch_port *ports;
141 } value;
142 };
143
144 struct switch_attr {
145 struct switch_dev *dev;
146 int atype;
147 int id;
148 int type;
149 const char *name;
150 const char *description;
151 struct switch_attr *next;
152 };
153
154 struct switch_port {
155 unsigned int id;
156 unsigned int flags;
157 };
158
159 struct switch_portmap {
160 unsigned int virt;
161 const char *segment;
162 };
163
164 /**
165 * swlib_list: list all switches
166 */
167 void swlib_list(void);
168
169 /**
170 * swlib_print_portmap: get portmap
171 * @dev: switch device struct
172 */
173 void swlib_print_portmap(struct switch_dev *dev, char *segment);
174
175 /**
176 * swlib_connect: connect to the switch through netlink
177 * @name: name of the ethernet interface,
178 *
179 * if name is NULL, it connect and builds a chain of all switches
180 */
181 struct switch_dev *swlib_connect(const char *name);
182
183 /**
184 * swlib_free: free all dynamically allocated data for the switch connection
185 * @dev: switch device struct
186 *
187 * all members of a switch device chain (generated by swlib_connect(NULL))
188 * must be freed individually
189 */
190 void swlib_free(struct switch_dev *dev);
191
192 /**
193 * swlib_free_all: run swlib_free on all devices in the chain
194 * @dev: switch device struct
195 */
196 void swlib_free_all(struct switch_dev *dev);
197
198 /**
199 * swlib_scan: probe the switch driver for available commands/attributes
200 * @dev: switch device struct
201 */
202 int swlib_scan(struct switch_dev *dev);
203
204 /**
205 * swlib_lookup_attr: look up a switch attribute
206 * @dev: switch device struct
207 * @type: global, port or vlan
208 * @name: name of the attribute
209 */
210 struct switch_attr *swlib_lookup_attr(struct switch_dev *dev,
211 enum swlib_attr_group atype, const char *name);
212
213 /**
214 * swlib_set_attr: set the value for an attribute
215 * @dev: switch device struct
216 * @attr: switch attribute struct
217 * @val: attribute value pointer
218 * returns 0 on success
219 */
220 int swlib_set_attr(struct switch_dev *dev, struct switch_attr *attr,
221 struct switch_val *val);
222
223 /**
224 * swlib_set_attr_string: set the value for an attribute with type conversion
225 * @dev: switch device struct
226 * @attr: switch attribute struct
227 * @port_vlan: port or vlan (if applicable)
228 * @str: string value
229 * returns 0 on success
230 */
231 int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *attr,
232 int port_vlan, const char *str);
233
234 /**
235 * swlib_get_attr: get the value for an attribute
236 * @dev: switch device struct
237 * @attr: switch attribute struct
238 * @val: attribute value pointer
239 * returns 0 on success
240 * for string attributes, the result string must be freed by the caller
241 */
242 int swlib_get_attr(struct switch_dev *dev, struct switch_attr *attr,
243 struct switch_val *val);
244
245 /**
246 * swlib_apply_from_uci: set up the switch from a uci configuration
247 * @dev: switch device struct
248 * @p: uci package which contains the desired global config
249 */
250 int swlib_apply_from_uci(struct switch_dev *dev, struct uci_package *p);
251
252 #endif