switchdev: remove "NONE" transaction phase
[cascardo/linux.git] / include / net / switchdev.h
1 /*
2  * include/net/switchdev.h - Switch device API
3  * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
4  * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11 #ifndef _LINUX_SWITCHDEV_H_
12 #define _LINUX_SWITCHDEV_H_
13
14 #include <linux/netdevice.h>
15 #include <linux/notifier.h>
16 #include <linux/list.h>
17
18 #define SWITCHDEV_F_NO_RECURSE          BIT(0)
19
20 enum switchdev_trans_ph {
21         SWITCHDEV_TRANS_PREPARE,
22         SWITCHDEV_TRANS_ABORT,
23         SWITCHDEV_TRANS_COMMIT,
24 };
25
26 struct switchdev_trans_item {
27         struct list_head list;
28         void *data;
29         void (*destructor)(const void *data);
30 };
31
32 struct switchdev_trans {
33         struct list_head item_list;
34         enum switchdev_trans_ph ph;
35 };
36
37 static inline bool switchdev_trans_ph_prepare(struct switchdev_trans *trans)
38 {
39         return trans && trans->ph == SWITCHDEV_TRANS_PREPARE;
40 }
41
42 static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)
43 {
44         return trans && trans->ph == SWITCHDEV_TRANS_COMMIT;
45 }
46
47 enum switchdev_attr_id {
48         SWITCHDEV_ATTR_UNDEFINED,
49         SWITCHDEV_ATTR_PORT_PARENT_ID,
50         SWITCHDEV_ATTR_PORT_STP_STATE,
51         SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS,
52 };
53
54 struct switchdev_attr {
55         enum switchdev_attr_id id;
56         u32 flags;
57         union {
58                 struct netdev_phys_item_id ppid;        /* PORT_PARENT_ID */
59                 u8 stp_state;                           /* PORT_STP_STATE */
60                 unsigned long brport_flags;             /* PORT_BRIDGE_FLAGS */
61         } u;
62 };
63
64 struct fib_info;
65
66 enum switchdev_obj_id {
67         SWITCHDEV_OBJ_UNDEFINED,
68         SWITCHDEV_OBJ_PORT_VLAN,
69         SWITCHDEV_OBJ_IPV4_FIB,
70         SWITCHDEV_OBJ_PORT_FDB,
71 };
72
73 struct switchdev_obj {
74         enum switchdev_obj_id id;
75         int (*cb)(struct net_device *dev, struct switchdev_obj *obj);
76         union {
77                 struct switchdev_obj_vlan {             /* PORT_VLAN */
78                         u16 flags;
79                         u16 vid_begin;
80                         u16 vid_end;
81                 } vlan;
82                 struct switchdev_obj_ipv4_fib {         /* IPV4_FIB */
83                         u32 dst;
84                         int dst_len;
85                         struct fib_info *fi;
86                         u8 tos;
87                         u8 type;
88                         u32 nlflags;
89                         u32 tb_id;
90                 } ipv4_fib;
91                 struct switchdev_obj_fdb {              /* PORT_FDB */
92                         const unsigned char *addr;
93                         u16 vid;
94                         u16 ndm_state;
95                 } fdb;
96         } u;
97 };
98
99 void switchdev_trans_item_enqueue(struct switchdev_trans *trans,
100                                   void *data, void (*destructor)(void const *),
101                                   struct switchdev_trans_item *tritem);
102 void *switchdev_trans_item_dequeue(struct switchdev_trans *trans);
103
104 /**
105  * struct switchdev_ops - switchdev operations
106  *
107  * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr).
108  *
109  * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr).
110  *
111  * @switchdev_port_obj_add: Add an object to port (see switchdev_obj).
112  *
113  * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj).
114  *
115  * @switchdev_port_obj_dump: Dump port objects (see switchdev_obj).
116  */
117 struct switchdev_ops {
118         int     (*switchdev_port_attr_get)(struct net_device *dev,
119                                            struct switchdev_attr *attr);
120         int     (*switchdev_port_attr_set)(struct net_device *dev,
121                                            struct switchdev_attr *attr,
122                                            struct switchdev_trans *trans);
123         int     (*switchdev_port_obj_add)(struct net_device *dev,
124                                           struct switchdev_obj *obj,
125                                           struct switchdev_trans *trans);
126         int     (*switchdev_port_obj_del)(struct net_device *dev,
127                                           struct switchdev_obj *obj);
128         int     (*switchdev_port_obj_dump)(struct net_device *dev,
129                                           struct switchdev_obj *obj);
130 };
131
132 enum switchdev_notifier_type {
133         SWITCHDEV_FDB_ADD = 1,
134         SWITCHDEV_FDB_DEL,
135 };
136
137 struct switchdev_notifier_info {
138         struct net_device *dev;
139 };
140
141 struct switchdev_notifier_fdb_info {
142         struct switchdev_notifier_info info; /* must be first */
143         const unsigned char *addr;
144         u16 vid;
145 };
146
147 static inline struct net_device *
148 switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
149 {
150         return info->dev;
151 }
152
153 #ifdef CONFIG_NET_SWITCHDEV
154
155 int switchdev_port_attr_get(struct net_device *dev,
156                             struct switchdev_attr *attr);
157 int switchdev_port_attr_set(struct net_device *dev,
158                             struct switchdev_attr *attr);
159 int switchdev_port_obj_add(struct net_device *dev, struct switchdev_obj *obj);
160 int switchdev_port_obj_del(struct net_device *dev, struct switchdev_obj *obj);
161 int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj);
162 int register_switchdev_notifier(struct notifier_block *nb);
163 int unregister_switchdev_notifier(struct notifier_block *nb);
164 int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
165                              struct switchdev_notifier_info *info);
166 int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
167                                   struct net_device *dev, u32 filter_mask,
168                                   int nlflags);
169 int switchdev_port_bridge_setlink(struct net_device *dev,
170                                   struct nlmsghdr *nlh, u16 flags);
171 int switchdev_port_bridge_dellink(struct net_device *dev,
172                                   struct nlmsghdr *nlh, u16 flags);
173 int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
174                            u8 tos, u8 type, u32 nlflags, u32 tb_id);
175 int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
176                            u8 tos, u8 type, u32 tb_id);
177 void switchdev_fib_ipv4_abort(struct fib_info *fi);
178 int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
179                            struct net_device *dev, const unsigned char *addr,
180                            u16 vid, u16 nlm_flags);
181 int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
182                            struct net_device *dev, const unsigned char *addr,
183                            u16 vid);
184 int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
185                             struct net_device *dev,
186                             struct net_device *filter_dev, int idx);
187 void switchdev_port_fwd_mark_set(struct net_device *dev,
188                                  struct net_device *group_dev,
189                                  bool joining);
190
191 #else
192
193 static inline int switchdev_port_attr_get(struct net_device *dev,
194                                           struct switchdev_attr *attr)
195 {
196         return -EOPNOTSUPP;
197 }
198
199 static inline int switchdev_port_attr_set(struct net_device *dev,
200                                           struct switchdev_attr *attr)
201 {
202         return -EOPNOTSUPP;
203 }
204
205 static inline int switchdev_port_obj_add(struct net_device *dev,
206                                          struct switchdev_obj *obj)
207 {
208         return -EOPNOTSUPP;
209 }
210
211 static inline int switchdev_port_obj_del(struct net_device *dev,
212                                          struct switchdev_obj *obj)
213 {
214         return -EOPNOTSUPP;
215 }
216
217 static inline int switchdev_port_obj_dump(struct net_device *dev,
218                                           struct switchdev_obj *obj)
219 {
220         return -EOPNOTSUPP;
221 }
222
223 static inline int register_switchdev_notifier(struct notifier_block *nb)
224 {
225         return 0;
226 }
227
228 static inline int unregister_switchdev_notifier(struct notifier_block *nb)
229 {
230         return 0;
231 }
232
233 static inline int call_switchdev_notifiers(unsigned long val,
234                                            struct net_device *dev,
235                                            struct switchdev_notifier_info *info)
236 {
237         return NOTIFY_DONE;
238 }
239
240 static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid,
241                                             u32 seq, struct net_device *dev,
242                                             u32 filter_mask, int nlflags)
243 {
244         return -EOPNOTSUPP;
245 }
246
247 static inline int switchdev_port_bridge_setlink(struct net_device *dev,
248                                                 struct nlmsghdr *nlh,
249                                                 u16 flags)
250 {
251         return -EOPNOTSUPP;
252 }
253
254 static inline int switchdev_port_bridge_dellink(struct net_device *dev,
255                                                 struct nlmsghdr *nlh,
256                                                 u16 flags)
257 {
258         return -EOPNOTSUPP;
259 }
260
261 static inline int switchdev_fib_ipv4_add(u32 dst, int dst_len,
262                                          struct fib_info *fi,
263                                          u8 tos, u8 type,
264                                          u32 nlflags, u32 tb_id)
265 {
266         return 0;
267 }
268
269 static inline int switchdev_fib_ipv4_del(u32 dst, int dst_len,
270                                          struct fib_info *fi,
271                                          u8 tos, u8 type, u32 tb_id)
272 {
273         return 0;
274 }
275
276 static inline void switchdev_fib_ipv4_abort(struct fib_info *fi)
277 {
278 }
279
280 static inline int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
281                                          struct net_device *dev,
282                                          const unsigned char *addr,
283                                          u16 vid, u16 nlm_flags)
284 {
285         return -EOPNOTSUPP;
286 }
287
288 static inline int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
289                                          struct net_device *dev,
290                                          const unsigned char *addr, u16 vid)
291 {
292         return -EOPNOTSUPP;
293 }
294
295 static inline int switchdev_port_fdb_dump(struct sk_buff *skb,
296                                           struct netlink_callback *cb,
297                                           struct net_device *dev,
298                                           struct net_device *filter_dev,
299                                           int idx)
300 {
301         return -EOPNOTSUPP;
302 }
303
304 static inline void switchdev_port_fwd_mark_set(struct net_device *dev,
305                                                struct net_device *group_dev,
306                                                bool joining)
307 {
308 }
309
310 #endif
311
312 #endif /* _LINUX_SWITCHDEV_H_ */