at v4.11-rc8 8.9 kB view raw
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#include <net/ip_fib.h> 18 19#define SWITCHDEV_F_NO_RECURSE BIT(0) 20#define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1) 21#define SWITCHDEV_F_DEFER BIT(2) 22 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; 31 bool ph_prepare; 32}; 33 34static inline bool switchdev_trans_ph_prepare(struct switchdev_trans *trans) 35{ 36 return trans && trans->ph_prepare; 37} 38 39static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans) 40{ 41 return trans && !trans->ph_prepare; 42} 43 44enum switchdev_attr_id { 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, 49 SWITCHDEV_ATTR_ID_PORT_MROUTER, 50 SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, 51 SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING, 52 SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED, 53}; 54 55struct switchdev_attr { 56 struct net_device *orig_dev; 57 enum switchdev_attr_id id; 58 u32 flags; 59 void *complete_priv; 60 void (*complete)(struct net_device *dev, int err, void *priv); 61 union { 62 struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */ 63 u8 stp_state; /* PORT_STP_STATE */ 64 unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */ 65 bool mrouter; /* PORT_MROUTER */ 66 clock_t ageing_time; /* BRIDGE_AGEING_TIME */ 67 bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */ 68 bool mc_disabled; /* MC_DISABLED */ 69 } u; 70}; 71 72enum switchdev_obj_id { 73 SWITCHDEV_OBJ_ID_UNDEFINED, 74 SWITCHDEV_OBJ_ID_PORT_VLAN, 75 SWITCHDEV_OBJ_ID_PORT_FDB, 76 SWITCHDEV_OBJ_ID_PORT_MDB, 77}; 78 79struct switchdev_obj { 80 struct net_device *orig_dev; 81 enum switchdev_obj_id id; 82 u32 flags; 83 void *complete_priv; 84 void (*complete)(struct net_device *dev, int err, void *priv); 85}; 86 87/* SWITCHDEV_OBJ_ID_PORT_VLAN */ 88struct switchdev_obj_port_vlan { 89 struct switchdev_obj obj; 90 u16 flags; 91 u16 vid_begin; 92 u16 vid_end; 93}; 94 95#define SWITCHDEV_OBJ_PORT_VLAN(obj) \ 96 container_of(obj, struct switchdev_obj_port_vlan, obj) 97 98/* SWITCHDEV_OBJ_ID_PORT_FDB */ 99struct switchdev_obj_port_fdb { 100 struct switchdev_obj obj; 101 unsigned char addr[ETH_ALEN]; 102 u16 vid; 103 u16 ndm_state; 104}; 105 106#define SWITCHDEV_OBJ_PORT_FDB(obj) \ 107 container_of(obj, struct switchdev_obj_port_fdb, obj) 108 109/* SWITCHDEV_OBJ_ID_PORT_MDB */ 110struct switchdev_obj_port_mdb { 111 struct switchdev_obj obj; 112 unsigned char addr[ETH_ALEN]; 113 u16 vid; 114}; 115 116#define SWITCHDEV_OBJ_PORT_MDB(obj) \ 117 container_of(obj, struct switchdev_obj_port_mdb, obj) 118 119void switchdev_trans_item_enqueue(struct switchdev_trans *trans, 120 void *data, void (*destructor)(void const *), 121 struct switchdev_trans_item *tritem); 122void *switchdev_trans_item_dequeue(struct switchdev_trans *trans); 123 124typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); 125 126/** 127 * struct switchdev_ops - switchdev operations 128 * 129 * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr). 130 * 131 * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr). 132 * 133 * @switchdev_port_obj_add: Add an object to port (see switchdev_obj_*). 134 * 135 * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj_*). 136 * 137 * @switchdev_port_obj_dump: Dump port objects (see switchdev_obj_*). 138 */ 139struct switchdev_ops { 140 int (*switchdev_port_attr_get)(struct net_device *dev, 141 struct switchdev_attr *attr); 142 int (*switchdev_port_attr_set)(struct net_device *dev, 143 const struct switchdev_attr *attr, 144 struct switchdev_trans *trans); 145 int (*switchdev_port_obj_add)(struct net_device *dev, 146 const struct switchdev_obj *obj, 147 struct switchdev_trans *trans); 148 int (*switchdev_port_obj_del)(struct net_device *dev, 149 const struct switchdev_obj *obj); 150 int (*switchdev_port_obj_dump)(struct net_device *dev, 151 struct switchdev_obj *obj, 152 switchdev_obj_dump_cb_t *cb); 153}; 154 155enum switchdev_notifier_type { 156 SWITCHDEV_FDB_ADD = 1, 157 SWITCHDEV_FDB_DEL, 158}; 159 160struct switchdev_notifier_info { 161 struct net_device *dev; 162}; 163 164struct switchdev_notifier_fdb_info { 165 struct switchdev_notifier_info info; /* must be first */ 166 const unsigned char *addr; 167 u16 vid; 168}; 169 170static inline struct net_device * 171switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) 172{ 173 return info->dev; 174} 175 176#ifdef CONFIG_NET_SWITCHDEV 177 178void switchdev_deferred_process(void); 179int switchdev_port_attr_get(struct net_device *dev, 180 struct switchdev_attr *attr); 181int switchdev_port_attr_set(struct net_device *dev, 182 const struct switchdev_attr *attr); 183int switchdev_port_obj_add(struct net_device *dev, 184 const struct switchdev_obj *obj); 185int switchdev_port_obj_del(struct net_device *dev, 186 const struct switchdev_obj *obj); 187int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj, 188 switchdev_obj_dump_cb_t *cb); 189int register_switchdev_notifier(struct notifier_block *nb); 190int unregister_switchdev_notifier(struct notifier_block *nb); 191int call_switchdev_notifiers(unsigned long val, struct net_device *dev, 192 struct switchdev_notifier_info *info); 193int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, 194 struct net_device *dev, u32 filter_mask, 195 int nlflags); 196int switchdev_port_bridge_setlink(struct net_device *dev, 197 struct nlmsghdr *nlh, u16 flags); 198int switchdev_port_bridge_dellink(struct net_device *dev, 199 struct nlmsghdr *nlh, u16 flags); 200int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], 201 struct net_device *dev, const unsigned char *addr, 202 u16 vid, u16 nlm_flags); 203int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], 204 struct net_device *dev, const unsigned char *addr, 205 u16 vid); 206int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, 207 struct net_device *dev, 208 struct net_device *filter_dev, int *idx); 209void switchdev_port_fwd_mark_set(struct net_device *dev, 210 struct net_device *group_dev, 211 bool joining); 212 213bool switchdev_port_same_parent_id(struct net_device *a, 214 struct net_device *b); 215#else 216 217static inline void switchdev_deferred_process(void) 218{ 219} 220 221static inline int switchdev_port_attr_get(struct net_device *dev, 222 struct switchdev_attr *attr) 223{ 224 return -EOPNOTSUPP; 225} 226 227static inline int switchdev_port_attr_set(struct net_device *dev, 228 const struct switchdev_attr *attr) 229{ 230 return -EOPNOTSUPP; 231} 232 233static inline int switchdev_port_obj_add(struct net_device *dev, 234 const struct switchdev_obj *obj) 235{ 236 return -EOPNOTSUPP; 237} 238 239static inline int switchdev_port_obj_del(struct net_device *dev, 240 const struct switchdev_obj *obj) 241{ 242 return -EOPNOTSUPP; 243} 244 245static inline int switchdev_port_obj_dump(struct net_device *dev, 246 const struct switchdev_obj *obj, 247 switchdev_obj_dump_cb_t *cb) 248{ 249 return -EOPNOTSUPP; 250} 251 252static inline int register_switchdev_notifier(struct notifier_block *nb) 253{ 254 return 0; 255} 256 257static inline int unregister_switchdev_notifier(struct notifier_block *nb) 258{ 259 return 0; 260} 261 262static inline int call_switchdev_notifiers(unsigned long val, 263 struct net_device *dev, 264 struct switchdev_notifier_info *info) 265{ 266 return NOTIFY_DONE; 267} 268 269static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, 270 u32 seq, struct net_device *dev, 271 u32 filter_mask, int nlflags) 272{ 273 return -EOPNOTSUPP; 274} 275 276static inline int switchdev_port_bridge_setlink(struct net_device *dev, 277 struct nlmsghdr *nlh, 278 u16 flags) 279{ 280 return -EOPNOTSUPP; 281} 282 283static inline int switchdev_port_bridge_dellink(struct net_device *dev, 284 struct nlmsghdr *nlh, 285 u16 flags) 286{ 287 return -EOPNOTSUPP; 288} 289 290static inline int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], 291 struct net_device *dev, 292 const unsigned char *addr, 293 u16 vid, u16 nlm_flags) 294{ 295 return -EOPNOTSUPP; 296} 297 298static inline int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], 299 struct net_device *dev, 300 const unsigned char *addr, u16 vid) 301{ 302 return -EOPNOTSUPP; 303} 304 305static inline int switchdev_port_fdb_dump(struct sk_buff *skb, 306 struct netlink_callback *cb, 307 struct net_device *dev, 308 struct net_device *filter_dev, 309 int *idx) 310{ 311 return *idx; 312} 313 314static inline bool switchdev_port_same_parent_id(struct net_device *a, 315 struct net_device *b) 316{ 317 return false; 318} 319 320#endif 321 322#endif /* _LINUX_SWITCHDEV_H_ */