switchdev: introduce switchdev add/del obj ops
[deliverable/linux.git] / include / net / switchdev.h
CommitLineData
007f790c
JP
1/*
2 * include/net/switchdev.h - Switch device API
3 * Copyright (c) 2014 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
JP
15#include <linux/notifier.h>
16
3094333d
SF
17#define SWITCHDEV_F_NO_RECURSE BIT(0)
18
19enum switchdev_trans {
20 SWITCHDEV_TRANS_NONE,
21 SWITCHDEV_TRANS_PREPARE,
22 SWITCHDEV_TRANS_ABORT,
23 SWITCHDEV_TRANS_COMMIT,
24};
25
26enum switchdev_attr_id {
27 SWITCHDEV_ATTR_UNDEFINED,
f8e20a9f 28 SWITCHDEV_ATTR_PORT_PARENT_ID,
35636062 29 SWITCHDEV_ATTR_PORT_STP_STATE,
3094333d
SF
30};
31
32struct switchdev_attr {
33 enum switchdev_attr_id id;
34 enum switchdev_trans trans;
35 u32 flags;
f8e20a9f
SF
36 union {
37 struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
35636062 38 u8 stp_state; /* PORT_STP_STATE */
f8e20a9f 39 };
3094333d
SF
40};
41
4170604f
SF
42struct fib_info;
43
491d0f15
SF
44enum switchdev_obj_id {
45 SWITCHDEV_OBJ_UNDEFINED,
46};
47
48struct switchdev_obj {
49 enum switchdev_obj_id id;
50 enum switchdev_trans trans;
51};
52
4170604f
SF
53/**
54 * struct switchdev_ops - switchdev operations
55 *
3094333d
SF
56 * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr).
57 *
58 * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr).
59 *
491d0f15
SF
60 * @switchdev_port_obj_add: Add an object to port (see switchdev_obj).
61 *
62 * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj).
63 *
9d47c0a2 64 * @switchdev_fib_ipv4_add: Called to add/modify IPv4 route to switch device.
4170604f 65 *
9d47c0a2 66 * @switchdev_fib_ipv4_del: Called to delete IPv4 route from switch device.
4170604f 67 */
9d47c0a2 68struct switchdev_ops {
3094333d
SF
69 int (*switchdev_port_attr_get)(struct net_device *dev,
70 struct switchdev_attr *attr);
71 int (*switchdev_port_attr_set)(struct net_device *dev,
72 struct switchdev_attr *attr);
491d0f15
SF
73 int (*switchdev_port_obj_add)(struct net_device *dev,
74 struct switchdev_obj *obj);
75 int (*switchdev_port_obj_del)(struct net_device *dev,
76 struct switchdev_obj *obj);
9d47c0a2
JP
77 int (*switchdev_fib_ipv4_add)(struct net_device *dev, __be32 dst,
78 int dst_len, struct fib_info *fi,
79 u8 tos, u8 type, u32 nlflags,
80 u32 tb_id);
81 int (*switchdev_fib_ipv4_del)(struct net_device *dev, __be32 dst,
82 int dst_len, struct fib_info *fi,
83 u8 tos, u8 type, u32 tb_id);
4170604f
SF
84};
85
ebb9a03a
JP
86enum switchdev_notifier_type {
87 SWITCHDEV_FDB_ADD = 1,
88 SWITCHDEV_FDB_DEL,
3aeb6617
JP
89};
90
ebb9a03a 91struct switchdev_notifier_info {
03bf0c28
JP
92 struct net_device *dev;
93};
94
ebb9a03a
JP
95struct switchdev_notifier_fdb_info {
96 struct switchdev_notifier_info info; /* must be first */
3aeb6617
JP
97 const unsigned char *addr;
98 u16 vid;
99};
100
03bf0c28 101static inline struct net_device *
ebb9a03a 102switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
03bf0c28
JP
103{
104 return info->dev;
105}
007f790c
JP
106
107#ifdef CONFIG_NET_SWITCHDEV
108
3094333d
SF
109int switchdev_port_attr_get(struct net_device *dev,
110 struct switchdev_attr *attr);
111int switchdev_port_attr_set(struct net_device *dev,
112 struct switchdev_attr *attr);
491d0f15
SF
113int switchdev_port_obj_add(struct net_device *dev, struct switchdev_obj *obj);
114int switchdev_port_obj_del(struct net_device *dev, struct switchdev_obj *obj);
ebb9a03a
JP
115int register_switchdev_notifier(struct notifier_block *nb);
116int unregister_switchdev_notifier(struct notifier_block *nb);
117int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
118 struct switchdev_notifier_info *info);
119int switchdev_port_bridge_setlink(struct net_device *dev,
120 struct nlmsghdr *nlh, u16 flags);
121int switchdev_port_bridge_dellink(struct net_device *dev,
122 struct nlmsghdr *nlh, u16 flags);
123int ndo_dflt_switchdev_port_bridge_dellink(struct net_device *dev,
124 struct nlmsghdr *nlh, u16 flags);
125int ndo_dflt_switchdev_port_bridge_setlink(struct net_device *dev,
126 struct nlmsghdr *nlh, u16 flags);
127int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
128 u8 tos, u8 type, u32 nlflags, u32 tb_id);
129int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
130 u8 tos, u8 type, u32 tb_id);
131void switchdev_fib_ipv4_abort(struct fib_info *fi);
5e8d9049 132
007f790c
JP
133#else
134
3094333d
SF
135static inline int switchdev_port_attr_get(struct net_device *dev,
136 struct switchdev_attr *attr)
137{
138 return -EOPNOTSUPP;
139}
140
141static inline int switchdev_port_attr_set(struct net_device *dev,
142 struct switchdev_attr *attr)
143{
144 return -EOPNOTSUPP;
145}
146
491d0f15
SF
147static inline int switchdev_port_obj_add(struct net_device *dev,
148 struct switchdev_obj *obj)
149{
150 return -EOPNOTSUPP;
151}
152
153static inline int switchdev_port_obj_del(struct net_device *dev,
154 struct switchdev_obj *obj)
155{
156 return -EOPNOTSUPP;
157}
158
ebb9a03a 159static inline int register_switchdev_notifier(struct notifier_block *nb)
03bf0c28
JP
160{
161 return 0;
162}
163
ebb9a03a 164static inline int unregister_switchdev_notifier(struct notifier_block *nb)
03bf0c28
JP
165{
166 return 0;
167}
168
ebb9a03a
JP
169static inline int call_switchdev_notifiers(unsigned long val,
170 struct net_device *dev,
171 struct switchdev_notifier_info *info)
03bf0c28
JP
172{
173 return NOTIFY_DONE;
174}
175
ebb9a03a
JP
176static inline int switchdev_port_bridge_setlink(struct net_device *dev,
177 struct nlmsghdr *nlh,
178 u16 flags)
8a44dbb2
RP
179{
180 return -EOPNOTSUPP;
181}
182
ebb9a03a
JP
183static inline int switchdev_port_bridge_dellink(struct net_device *dev,
184 struct nlmsghdr *nlh,
185 u16 flags)
8a44dbb2
RP
186{
187 return -EOPNOTSUPP;
188}
189
ebb9a03a
JP
190static inline int ndo_dflt_switchdev_port_bridge_dellink(struct net_device *dev,
191 struct nlmsghdr *nlh,
192 u16 flags)
8a44dbb2
RP
193{
194 return 0;
195}
196
ebb9a03a
JP
197static inline int ndo_dflt_switchdev_port_bridge_setlink(struct net_device *dev,
198 struct nlmsghdr *nlh,
199 u16 flags)
8a44dbb2
RP
200{
201 return 0;
202}
203
ebb9a03a
JP
204static inline int switchdev_fib_ipv4_add(u32 dst, int dst_len,
205 struct fib_info *fi,
206 u8 tos, u8 type,
207 u32 nlflags, u32 tb_id)
5e8d9049
SF
208{
209 return 0;
210}
211
ebb9a03a
JP
212static inline int switchdev_fib_ipv4_del(u32 dst, int dst_len,
213 struct fib_info *fi,
214 u8 tos, u8 type, u32 tb_id)
5e8d9049
SF
215{
216 return 0;
217}
218
ebb9a03a 219static inline void switchdev_fib_ipv4_abort(struct fib_info *fi)
8e05fd71
SF
220{
221}
222
007f790c
JP
223#endif
224
225#endif /* _LINUX_SWITCHDEV_H_ */
This page took 0.05883 seconds and 5 git commands to generate.