02fa45610c9be031993b0cb01074db2b9d18a478
[openwrt.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_val;
113 struct uci_package;
114
115 struct switch_dev {
116         int id;
117         char dev_name[IFNAMSIZ];
118         const char *name;
119         const char *alias;
120         int ports;
121         int vlans;
122         int cpu_port;
123         struct switch_attr *ops;
124         struct switch_attr *port_ops;
125         struct switch_attr *vlan_ops;
126         struct switch_dev *next;
127         void *priv;
128 };
129
130 struct switch_val {
131         struct switch_attr *attr;
132         int len;
133         int err;
134         int port_vlan;
135         union {
136                 const char *s;
137                 int i;
138                 struct switch_port *ports;
139         } value;
140 };
141
142 struct switch_attr {
143         struct switch_dev *dev;
144         int atype;
145         int id;
146         int type;
147         const char *name;
148         const char *description;
149         struct switch_attr *next;
150 };
151
152 struct switch_port {
153         unsigned int id;
154         unsigned int flags;
155 };
156
157 /**
158  * swlib_list: list all switches
159  */
160 void swlib_list(void);
161
162 /**
163  * swlib_connect: connect to the switch through netlink
164  * @name: name of the ethernet interface,
165  *
166  * if name is NULL, it connect and builds a chain of all switches
167  */
168 struct switch_dev *swlib_connect(const char *name);
169
170 /**
171  * swlib_free: free all dynamically allocated data for the switch connection
172  * @dev: switch device struct
173  *
174  * all members of a switch device chain (generated by swlib_connect(NULL))
175  * must be freed individually
176  */
177 void swlib_free(struct switch_dev *dev);
178
179 /**
180  * swlib_free_all: run swlib_free on all devices in the chain
181  * @dev: switch device struct
182  */
183 void swlib_free_all(struct switch_dev *dev);
184
185 /**
186  * swlib_scan: probe the switch driver for available commands/attributes
187  * @dev: switch device struct
188  */
189 int swlib_scan(struct switch_dev *dev);
190
191 /**
192  * swlib_lookup_attr: look up a switch attribute
193  * @dev: switch device struct
194  * @type: global, port or vlan
195  * @name: name of the attribute
196  */
197 struct switch_attr *swlib_lookup_attr(struct switch_dev *dev,
198                 enum swlib_attr_group atype, const char *name);
199
200 /**
201  * swlib_set_attr: set the value for an attribute
202  * @dev: switch device struct
203  * @attr: switch attribute struct
204  * @val: attribute value pointer
205  * returns 0 on success
206  */
207 int swlib_set_attr(struct switch_dev *dev, struct switch_attr *attr,
208                 struct switch_val *val);
209
210 /**
211  * swlib_set_attr_string: set the value for an attribute with type conversion
212  * @dev: switch device struct
213  * @attr: switch attribute struct
214  * @port_vlan: port or vlan (if applicable)
215  * @str: string value
216  * returns 0 on success
217  */
218 int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *attr,
219                 int port_vlan, const char *str);
220
221 /**
222  * swlib_get_attr: get the value for an attribute
223  * @dev: switch device struct
224  * @attr: switch attribute struct
225  * @val: attribute value pointer
226  * returns 0 on success
227  * for string attributes, the result string must be freed by the caller
228  */
229 int swlib_get_attr(struct switch_dev *dev, struct switch_attr *attr,
230                 struct switch_val *val);
231
232 /**
233  * swlib_apply_from_uci: set up the switch from a uci configuration
234  * @dev: switch device struct
235  * @p: uci package which contains the desired global config
236  */
237 int swlib_apply_from_uci(struct switch_dev *dev, struct uci_package *p);
238
239 #endif