rtc: ds1307: add clock provider support for DS3231
[deliverable/linux.git] / include / net / switchdev.h
CommitLineData
007f790c
JP
1/*
2 * include/net/switchdev.h - Switch device API
7ea6eb3f 3 * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
f8f21471 4 * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
007f790c
JP
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>
03bf0c28 15#include <linux/notifier.h>
7ea6eb3f 16#include <linux/list.h>
850d0cbc 17#include <net/ip_fib.h>
03bf0c28 18
3094333d 19#define SWITCHDEV_F_NO_RECURSE BIT(0)
464314ea 20#define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1)
0bc05d58 21#define SWITCHDEV_F_DEFER BIT(2)
3094333d 22
7ea6eb3f
JP
23struct switchdev_trans_item {
24 struct list_head list;
25 void *data;
26 void (*destructor)(const void *data);
27};
28
29struct switchdev_trans {
30 struct list_head item_list;
f623ab7f 31 bool ph_prepare;
7ea6eb3f
JP
32};
33
8bdb4272
JP
34static inline bool switchdev_trans_ph_prepare(struct switchdev_trans *trans)
35{
f623ab7f 36 return trans && trans->ph_prepare;
8bdb4272
JP
37}
38
39static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)
40{
f623ab7f 41 return trans && !trans->ph_prepare;
8bdb4272
JP
42}
43
3094333d 44enum switchdev_attr_id {
1f868398
JP
45 SWITCHDEV_ATTR_ID_UNDEFINED,
46 SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
47 SWITCHDEV_ATTR_ID_PORT_STP_STATE,
48 SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
f55ac58a 49 SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
81435c33 50 SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
3094333d
SF
51};
52
53struct switchdev_attr {
6ff64f6f 54 struct net_device *orig_dev;
3094333d 55 enum switchdev_attr_id id;
3094333d 56 u32 flags;
f8e20a9f
SF
57 union {
58 struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
35636062 59 u8 stp_state; /* PORT_STP_STATE */
6004c867 60 unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */
f55ac58a 61 u32 ageing_time; /* BRIDGE_AGEING_TIME */
81435c33 62 bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */
42275bd8 63 } u;
3094333d
SF
64};
65
491d0f15 66enum switchdev_obj_id {
57d80838
JP
67 SWITCHDEV_OBJ_ID_UNDEFINED,
68 SWITCHDEV_OBJ_ID_PORT_VLAN,
69 SWITCHDEV_OBJ_ID_IPV4_FIB,
70 SWITCHDEV_OBJ_ID_PORT_FDB,
4d41e125 71 SWITCHDEV_OBJ_ID_PORT_MDB,
491d0f15
SF
72};
73
648b4a99 74struct switchdev_obj {
6ff64f6f 75 struct net_device *orig_dev;
9e8f4a54 76 enum switchdev_obj_id id;
4d429c5d 77 u32 flags;
648b4a99
JP
78};
79
57d80838 80/* SWITCHDEV_OBJ_ID_PORT_VLAN */
8f24f309 81struct switchdev_obj_port_vlan {
648b4a99 82 struct switchdev_obj obj;
44bbcf5c
VD
83 u16 flags;
84 u16 vid_begin;
85 u16 vid_end;
86};
87
648b4a99
JP
88#define SWITCHDEV_OBJ_PORT_VLAN(obj) \
89 container_of(obj, struct switchdev_obj_port_vlan, obj)
90
57d80838 91/* SWITCHDEV_OBJ_ID_IPV4_FIB */
44bbcf5c 92struct switchdev_obj_ipv4_fib {
648b4a99 93 struct switchdev_obj obj;
44bbcf5c
VD
94 u32 dst;
95 int dst_len;
850d0cbc 96 struct fib_info fi;
44bbcf5c
VD
97 u8 tos;
98 u8 type;
99 u32 nlflags;
100 u32 tb_id;
101};
102
648b4a99
JP
103#define SWITCHDEV_OBJ_IPV4_FIB(obj) \
104 container_of(obj, struct switchdev_obj_ipv4_fib, obj)
105
57d80838 106/* SWITCHDEV_OBJ_ID_PORT_FDB */
52ba57cf 107struct switchdev_obj_port_fdb {
648b4a99 108 struct switchdev_obj obj;
850d0cbc 109 unsigned char addr[ETH_ALEN];
44bbcf5c
VD
110 u16 vid;
111 u16 ndm_state;
491d0f15
SF
112};
113
648b4a99
JP
114#define SWITCHDEV_OBJ_PORT_FDB(obj) \
115 container_of(obj, struct switchdev_obj_port_fdb, obj)
116
4d41e125
ER
117/* SWITCHDEV_OBJ_ID_PORT_MDB */
118struct switchdev_obj_port_mdb {
119 struct switchdev_obj obj;
120 unsigned char addr[ETH_ALEN];
121 u16 vid;
122};
123
124#define SWITCHDEV_OBJ_PORT_MDB(obj) \
125 container_of(obj, struct switchdev_obj_port_mdb, obj)
126
7ea6eb3f
JP
127void switchdev_trans_item_enqueue(struct switchdev_trans *trans,
128 void *data, void (*destructor)(void const *),
129 struct switchdev_trans_item *tritem);
130void *switchdev_trans_item_dequeue(struct switchdev_trans *trans);
131
648b4a99
JP
132typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
133
4170604f
SF
134/**
135 * struct switchdev_ops - switchdev operations
136 *
3094333d
SF
137 * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr).
138 *
139 * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr).
140 *
44bbcf5c 141 * @switchdev_port_obj_add: Add an object to port (see switchdev_obj_*).
491d0f15 142 *
44bbcf5c 143 * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj_*).
45d4122c 144 *
44bbcf5c 145 * @switchdev_port_obj_dump: Dump port objects (see switchdev_obj_*).
4170604f 146 */
9d47c0a2 147struct switchdev_ops {
3094333d
SF
148 int (*switchdev_port_attr_get)(struct net_device *dev,
149 struct switchdev_attr *attr);
150 int (*switchdev_port_attr_set)(struct net_device *dev,
f7fadf30 151 const struct switchdev_attr *attr,
7ea6eb3f 152 struct switchdev_trans *trans);
491d0f15 153 int (*switchdev_port_obj_add)(struct net_device *dev,
648b4a99 154 const struct switchdev_obj *obj,
7ea6eb3f 155 struct switchdev_trans *trans);
491d0f15 156 int (*switchdev_port_obj_del)(struct net_device *dev,
648b4a99 157 const struct switchdev_obj *obj);
45d4122c 158 int (*switchdev_port_obj_dump)(struct net_device *dev,
648b4a99
JP
159 struct switchdev_obj *obj,
160 switchdev_obj_dump_cb_t *cb);
4170604f
SF
161};
162
ebb9a03a
JP
163enum switchdev_notifier_type {
164 SWITCHDEV_FDB_ADD = 1,
165 SWITCHDEV_FDB_DEL,
3aeb6617
JP
166};
167
ebb9a03a 168struct switchdev_notifier_info {
03bf0c28
JP
169 struct net_device *dev;
170};
171
ebb9a03a
JP
172struct switchdev_notifier_fdb_info {
173 struct switchdev_notifier_info info; /* must be first */
3aeb6617
JP
174 const unsigned char *addr;
175 u16 vid;
176};
177
03bf0c28 178static inline struct net_device *
ebb9a03a 179switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
03bf0c28
JP
180{
181 return info->dev;
182}
007f790c
JP
183
184#ifdef CONFIG_NET_SWITCHDEV
185
793f4014 186void switchdev_deferred_process(void);
3094333d
SF
187int switchdev_port_attr_get(struct net_device *dev,
188 struct switchdev_attr *attr);
189int switchdev_port_attr_set(struct net_device *dev,
f7fadf30 190 const struct switchdev_attr *attr);
9e8f4a54 191int switchdev_port_obj_add(struct net_device *dev,
648b4a99 192 const struct switchdev_obj *obj);
9e8f4a54 193int switchdev_port_obj_del(struct net_device *dev,
648b4a99 194 const struct switchdev_obj *obj);
9e8f4a54 195int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj,
648b4a99 196 switchdev_obj_dump_cb_t *cb);
ebb9a03a
JP
197int register_switchdev_notifier(struct notifier_block *nb);
198int unregister_switchdev_notifier(struct notifier_block *nb);
199int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
200 struct switchdev_notifier_info *info);
8793d0a6
SF
201int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
202 struct net_device *dev, u32 filter_mask,
203 int nlflags);
ebb9a03a
JP
204int switchdev_port_bridge_setlink(struct net_device *dev,
205 struct nlmsghdr *nlh, u16 flags);
206int switchdev_port_bridge_dellink(struct net_device *dev,
207 struct nlmsghdr *nlh, u16 flags);
ebb9a03a
JP
208int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
209 u8 tos, u8 type, u32 nlflags, u32 tb_id);
210int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
211 u8 tos, u8 type, u32 tb_id);
212void switchdev_fib_ipv4_abort(struct fib_info *fi);
45d4122c
SS
213int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
214 struct net_device *dev, const unsigned char *addr,
215 u16 vid, u16 nlm_flags);
216int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
217 struct net_device *dev, const unsigned char *addr,
218 u16 vid);
219int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
220 struct net_device *dev,
221 struct net_device *filter_dev, int idx);
1a3b2ec9
SF
222void switchdev_port_fwd_mark_set(struct net_device *dev,
223 struct net_device *group_dev,
224 bool joining);
5e8d9049 225
007f790c
JP
226#else
227
793f4014
JP
228static inline void switchdev_deferred_process(void)
229{
230}
231
3094333d
SF
232static inline int switchdev_port_attr_get(struct net_device *dev,
233 struct switchdev_attr *attr)
234{
235 return -EOPNOTSUPP;
236}
237
238static inline int switchdev_port_attr_set(struct net_device *dev,
f7fadf30 239 const struct switchdev_attr *attr)
3094333d
SF
240{
241 return -EOPNOTSUPP;
242}
243
491d0f15 244static inline int switchdev_port_obj_add(struct net_device *dev,
648b4a99 245 const struct switchdev_obj *obj)
491d0f15
SF
246{
247 return -EOPNOTSUPP;
248}
249
250static inline int switchdev_port_obj_del(struct net_device *dev,
648b4a99 251 const struct switchdev_obj *obj)
491d0f15
SF
252{
253 return -EOPNOTSUPP;
254}
255
45d4122c 256static inline int switchdev_port_obj_dump(struct net_device *dev,
648b4a99
JP
257 const struct switchdev_obj *obj,
258 switchdev_obj_dump_cb_t *cb)
45d4122c
SS
259{
260 return -EOPNOTSUPP;
261}
262
ebb9a03a 263static inline int register_switchdev_notifier(struct notifier_block *nb)
03bf0c28
JP
264{
265 return 0;
266}
267
ebb9a03a 268static inline int unregister_switchdev_notifier(struct notifier_block *nb)
03bf0c28
JP
269{
270 return 0;
271}
272
ebb9a03a
JP
273static inline int call_switchdev_notifiers(unsigned long val,
274 struct net_device *dev,
275 struct switchdev_notifier_info *info)
03bf0c28
JP
276{
277 return NOTIFY_DONE;
278}
279
8793d0a6
SF
280static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid,
281 u32 seq, struct net_device *dev,
282 u32 filter_mask, int nlflags)
283{
284 return -EOPNOTSUPP;
285}
286
ebb9a03a
JP
287static inline int switchdev_port_bridge_setlink(struct net_device *dev,
288 struct nlmsghdr *nlh,
289 u16 flags)
8a44dbb2
RP
290{
291 return -EOPNOTSUPP;
292}
293
ebb9a03a
JP
294static inline int switchdev_port_bridge_dellink(struct net_device *dev,
295 struct nlmsghdr *nlh,
296 u16 flags)
8a44dbb2
RP
297{
298 return -EOPNOTSUPP;
299}
300
ebb9a03a
JP
301static inline int switchdev_fib_ipv4_add(u32 dst, int dst_len,
302 struct fib_info *fi,
303 u8 tos, u8 type,
304 u32 nlflags, u32 tb_id)
5e8d9049
SF
305{
306 return 0;
307}
308
ebb9a03a
JP
309static inline int switchdev_fib_ipv4_del(u32 dst, int dst_len,
310 struct fib_info *fi,
311 u8 tos, u8 type, u32 tb_id)
5e8d9049
SF
312{
313 return 0;
314}
315
ebb9a03a 316static inline void switchdev_fib_ipv4_abort(struct fib_info *fi)
8e05fd71
SF
317{
318}
319
45d4122c
SS
320static inline int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
321 struct net_device *dev,
322 const unsigned char *addr,
323 u16 vid, u16 nlm_flags)
324{
325 return -EOPNOTSUPP;
326}
327
328static inline int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
329 struct net_device *dev,
330 const unsigned char *addr, u16 vid)
331{
332 return -EOPNOTSUPP;
333}
334
335static inline int switchdev_port_fdb_dump(struct sk_buff *skb,
336 struct netlink_callback *cb,
337 struct net_device *dev,
338 struct net_device *filter_dev,
339 int idx)
340{
24cb7055 341 return idx;
45d4122c
SS
342}
343
1a3b2ec9
SF
344static inline void switchdev_port_fwd_mark_set(struct net_device *dev,
345 struct net_device *group_dev,
346 bool joining)
347{
348}
349
007f790c
JP
350#endif
351
352#endif /* _LINUX_SWITCHDEV_H_ */
This page took 0.112167 seconds and 5 git commands to generate.