1 /* 2 * include/net/switchdev.h - Switch device API 3 * Copyright (c) 2014 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 17 #define SWITCHDEV_F_NO_RECURSE BIT(0) 18 19 enum switchdev_trans { 20 SWITCHDEV_TRANS_NONE, 21 SWITCHDEV_TRANS_PREPARE, 22 SWITCHDEV_TRANS_ABORT, 23 SWITCHDEV_TRANS_COMMIT, 24 }; 25 26 enum switchdev_attr_id { 27 SWITCHDEV_ATTR_UNDEFINED, 28 SWITCHDEV_ATTR_PORT_PARENT_ID, 29 SWITCHDEV_ATTR_PORT_STP_STATE, 30 SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS, 31 }; 32 33 struct switchdev_attr { 34 enum switchdev_attr_id id; 35 enum switchdev_trans trans; 36 u32 flags; 37 union { 38 struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */ 39 u8 stp_state; /* PORT_STP_STATE */ 40 unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */ 41 } u; 42 }; 43 44 struct fib_info; 45 46 enum switchdev_obj_id { 47 SWITCHDEV_OBJ_UNDEFINED, 48 SWITCHDEV_OBJ_PORT_VLAN, 49 SWITCHDEV_OBJ_IPV4_FIB, 50 SWITCHDEV_OBJ_PORT_FDB, 51 }; 52 53 struct switchdev_obj { 54 enum switchdev_obj_id id; 55 enum switchdev_trans trans; 56 int (*cb)(struct net_device *dev, struct switchdev_obj *obj); 57 union { 58 struct switchdev_obj_vlan { /* PORT_VLAN */ 59 u16 flags; 60 u16 vid_begin; 61 u16 vid_end; 62 } vlan; 63 struct switchdev_obj_ipv4_fib { /* IPV4_FIB */ 64 u32 dst; 65 int dst_len; 66 struct fib_info *fi; 67 u8 tos; 68 u8 type; 69 u32 nlflags; 70 u32 tb_id; 71 } ipv4_fib; 72 struct switchdev_obj_fdb { /* PORT_FDB */ 73 const unsigned char *addr; 74 u16 vid; 75 } fdb; 76 } u; 77 }; 78 79 /** 80 * struct switchdev_ops - switchdev operations 81 * 82 * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr). 83 * 84 * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr). 85 * 86 * @switchdev_port_obj_add: Add an object to port (see switchdev_obj). 87 * 88 * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj). 89 * 90 * @switchdev_port_obj_dump: Dump port objects (see switchdev_obj). 91 */ 92 struct switchdev_ops { 93 int (*switchdev_port_attr_get)(struct net_device *dev, 94 struct switchdev_attr *attr); 95 int (*switchdev_port_attr_set)(struct net_device *dev, 96 struct switchdev_attr *attr); 97 int (*switchdev_port_obj_add)(struct net_device *dev, 98 struct switchdev_obj *obj); 99 int (*switchdev_port_obj_del)(struct net_device *dev, 100 struct switchdev_obj *obj); 101 int (*switchdev_port_obj_dump)(struct net_device *dev, 102 struct switchdev_obj *obj); 103 }; 104 105 enum switchdev_notifier_type { 106 SWITCHDEV_FDB_ADD = 1, 107 SWITCHDEV_FDB_DEL, 108 }; 109 110 struct switchdev_notifier_info { 111 struct net_device *dev; 112 }; 113 114 struct switchdev_notifier_fdb_info { 115 struct switchdev_notifier_info info; /* must be first */ 116 const unsigned char *addr; 117 u16 vid; 118 }; 119 120 static inline struct net_device * 121 switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) 122 { 123 return info->dev; 124 } 125 126 #ifdef CONFIG_NET_SWITCHDEV 127 128 int switchdev_port_attr_get(struct net_device *dev, 129 struct switchdev_attr *attr); 130 int switchdev_port_attr_set(struct net_device *dev, 131 struct switchdev_attr *attr); 132 int switchdev_port_obj_add(struct net_device *dev, struct switchdev_obj *obj); 133 int switchdev_port_obj_del(struct net_device *dev, struct switchdev_obj *obj); 134 int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj); 135 int register_switchdev_notifier(struct notifier_block *nb); 136 int unregister_switchdev_notifier(struct notifier_block *nb); 137 int call_switchdev_notifiers(unsigned long val, struct net_device *dev, 138 struct switchdev_notifier_info *info); 139 int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, 140 struct net_device *dev, u32 filter_mask, 141 int nlflags); 142 int switchdev_port_bridge_setlink(struct net_device *dev, 143 struct nlmsghdr *nlh, u16 flags); 144 int switchdev_port_bridge_dellink(struct net_device *dev, 145 struct nlmsghdr *nlh, u16 flags); 146 int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, 147 u8 tos, u8 type, u32 nlflags, u32 tb_id); 148 int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi, 149 u8 tos, u8 type, u32 tb_id); 150 void switchdev_fib_ipv4_abort(struct fib_info *fi); 151 int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], 152 struct net_device *dev, const unsigned char *addr, 153 u16 vid, u16 nlm_flags); 154 int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], 155 struct net_device *dev, const unsigned char *addr, 156 u16 vid); 157 int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, 158 struct net_device *dev, 159 struct net_device *filter_dev, int idx); 160 void switchdev_port_fwd_mark_set(struct net_device *dev, 161 struct net_device *group_dev, 162 bool joining); 163 164 #else 165 166 static inline int switchdev_port_attr_get(struct net_device *dev, 167 struct switchdev_attr *attr) 168 { 169 return -EOPNOTSUPP; 170 } 171 172 static inline int switchdev_port_attr_set(struct net_device *dev, 173 struct switchdev_attr *attr) 174 { 175 return -EOPNOTSUPP; 176 } 177 178 static inline int switchdev_port_obj_add(struct net_device *dev, 179 struct switchdev_obj *obj) 180 { 181 return -EOPNOTSUPP; 182 } 183 184 static inline int switchdev_port_obj_del(struct net_device *dev, 185 struct switchdev_obj *obj) 186 { 187 return -EOPNOTSUPP; 188 } 189 190 static inline int switchdev_port_obj_dump(struct net_device *dev, 191 struct switchdev_obj *obj) 192 { 193 return -EOPNOTSUPP; 194 } 195 196 static inline int register_switchdev_notifier(struct notifier_block *nb) 197 { 198 return 0; 199 } 200 201 static inline int unregister_switchdev_notifier(struct notifier_block *nb) 202 { 203 return 0; 204 } 205 206 static inline int call_switchdev_notifiers(unsigned long val, 207 struct net_device *dev, 208 struct switchdev_notifier_info *info) 209 { 210 return NOTIFY_DONE; 211 } 212 213 static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, 214 u32 seq, struct net_device *dev, 215 u32 filter_mask, int nlflags) 216 { 217 return -EOPNOTSUPP; 218 } 219 220 static inline int switchdev_port_bridge_setlink(struct net_device *dev, 221 struct nlmsghdr *nlh, 222 u16 flags) 223 { 224 return -EOPNOTSUPP; 225 } 226 227 static inline int switchdev_port_bridge_dellink(struct net_device *dev, 228 struct nlmsghdr *nlh, 229 u16 flags) 230 { 231 return -EOPNOTSUPP; 232 } 233 234 static inline int switchdev_fib_ipv4_add(u32 dst, int dst_len, 235 struct fib_info *fi, 236 u8 tos, u8 type, 237 u32 nlflags, u32 tb_id) 238 { 239 return 0; 240 } 241 242 static inline int switchdev_fib_ipv4_del(u32 dst, int dst_len, 243 struct fib_info *fi, 244 u8 tos, u8 type, u32 tb_id) 245 { 246 return 0; 247 } 248 249 static inline void switchdev_fib_ipv4_abort(struct fib_info *fi) 250 { 251 } 252 253 static inline int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], 254 struct net_device *dev, 255 const unsigned char *addr, 256 u16 vid, u16 nlm_flags) 257 { 258 return -EOPNOTSUPP; 259 } 260 261 static inline int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], 262 struct net_device *dev, 263 const unsigned char *addr, u16 vid) 264 { 265 return -EOPNOTSUPP; 266 } 267 268 static inline int switchdev_port_fdb_dump(struct sk_buff *skb, 269 struct netlink_callback *cb, 270 struct net_device *dev, 271 struct net_device *filter_dev, 272 int idx) 273 { 274 return -EOPNOTSUPP; 275 } 276 277 static inline void switchdev_port_fwd_mark_set(struct net_device *dev, 278 struct net_device *group_dev, 279 bool joining) 280 { 281 } 282 283 #endif 284 285 #endif /* _LINUX_SWITCHDEV_H_ */ 286