at v4.14-rc7 6.6 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_BRIDGE_FLAGS_SUPPORT, 50 SWITCHDEV_ATTR_ID_PORT_MROUTER, 51 SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, 52 SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING, 53 SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED, 54}; 55 56struct switchdev_attr { 57 struct net_device *orig_dev; 58 enum switchdev_attr_id id; 59 u32 flags; 60 void *complete_priv; 61 void (*complete)(struct net_device *dev, int err, void *priv); 62 union { 63 struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */ 64 u8 stp_state; /* PORT_STP_STATE */ 65 unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */ 66 unsigned long brport_flags_support; /* PORT_BRIDGE_FLAGS_SUPPORT */ 67 bool mrouter; /* PORT_MROUTER */ 68 clock_t ageing_time; /* BRIDGE_AGEING_TIME */ 69 bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */ 70 bool mc_disabled; /* MC_DISABLED */ 71 } u; 72}; 73 74enum switchdev_obj_id { 75 SWITCHDEV_OBJ_ID_UNDEFINED, 76 SWITCHDEV_OBJ_ID_PORT_VLAN, 77 SWITCHDEV_OBJ_ID_PORT_MDB, 78}; 79 80struct switchdev_obj { 81 struct net_device *orig_dev; 82 enum switchdev_obj_id id; 83 u32 flags; 84 void *complete_priv; 85 void (*complete)(struct net_device *dev, int err, void *priv); 86}; 87 88/* SWITCHDEV_OBJ_ID_PORT_VLAN */ 89struct switchdev_obj_port_vlan { 90 struct switchdev_obj obj; 91 u16 flags; 92 u16 vid_begin; 93 u16 vid_end; 94}; 95 96#define SWITCHDEV_OBJ_PORT_VLAN(obj) \ 97 container_of(obj, struct switchdev_obj_port_vlan, obj) 98 99/* SWITCHDEV_OBJ_ID_PORT_MDB */ 100struct switchdev_obj_port_mdb { 101 struct switchdev_obj obj; 102 unsigned char addr[ETH_ALEN]; 103 u16 vid; 104}; 105 106#define SWITCHDEV_OBJ_PORT_MDB(obj) \ 107 container_of(obj, struct switchdev_obj_port_mdb, obj) 108 109void switchdev_trans_item_enqueue(struct switchdev_trans *trans, 110 void *data, void (*destructor)(void const *), 111 struct switchdev_trans_item *tritem); 112void *switchdev_trans_item_dequeue(struct switchdev_trans *trans); 113 114typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); 115 116/** 117 * struct switchdev_ops - switchdev operations 118 * 119 * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr). 120 * 121 * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr). 122 * 123 * @switchdev_port_obj_add: Add an object to port (see switchdev_obj_*). 124 * 125 * @switchdev_port_obj_del: Delete an object from port (see switchdev_obj_*). 126 */ 127struct switchdev_ops { 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 const struct switchdev_attr *attr, 132 struct switchdev_trans *trans); 133 int (*switchdev_port_obj_add)(struct net_device *dev, 134 const struct switchdev_obj *obj, 135 struct switchdev_trans *trans); 136 int (*switchdev_port_obj_del)(struct net_device *dev, 137 const struct switchdev_obj *obj); 138}; 139 140enum switchdev_notifier_type { 141 SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, 142 SWITCHDEV_FDB_DEL_TO_BRIDGE, 143 SWITCHDEV_FDB_ADD_TO_DEVICE, 144 SWITCHDEV_FDB_DEL_TO_DEVICE, 145 SWITCHDEV_FDB_OFFLOADED, 146}; 147 148struct switchdev_notifier_info { 149 struct net_device *dev; 150}; 151 152struct switchdev_notifier_fdb_info { 153 struct switchdev_notifier_info info; /* must be first */ 154 const unsigned char *addr; 155 u16 vid; 156}; 157 158static inline struct net_device * 159switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) 160{ 161 return info->dev; 162} 163 164#ifdef CONFIG_NET_SWITCHDEV 165 166void switchdev_deferred_process(void); 167int switchdev_port_attr_get(struct net_device *dev, 168 struct switchdev_attr *attr); 169int switchdev_port_attr_set(struct net_device *dev, 170 const struct switchdev_attr *attr); 171int switchdev_port_obj_add(struct net_device *dev, 172 const struct switchdev_obj *obj); 173int switchdev_port_obj_del(struct net_device *dev, 174 const struct switchdev_obj *obj); 175int register_switchdev_notifier(struct notifier_block *nb); 176int unregister_switchdev_notifier(struct notifier_block *nb); 177int call_switchdev_notifiers(unsigned long val, struct net_device *dev, 178 struct switchdev_notifier_info *info); 179void switchdev_port_fwd_mark_set(struct net_device *dev, 180 struct net_device *group_dev, 181 bool joining); 182 183bool switchdev_port_same_parent_id(struct net_device *a, 184 struct net_device *b); 185 186#define SWITCHDEV_SET_OPS(netdev, ops) ((netdev)->switchdev_ops = (ops)) 187#else 188 189static inline void switchdev_deferred_process(void) 190{ 191} 192 193static inline int switchdev_port_attr_get(struct net_device *dev, 194 struct switchdev_attr *attr) 195{ 196 return -EOPNOTSUPP; 197} 198 199static inline int switchdev_port_attr_set(struct net_device *dev, 200 const struct switchdev_attr *attr) 201{ 202 return -EOPNOTSUPP; 203} 204 205static inline int switchdev_port_obj_add(struct net_device *dev, 206 const struct switchdev_obj *obj) 207{ 208 return -EOPNOTSUPP; 209} 210 211static inline int switchdev_port_obj_del(struct net_device *dev, 212 const struct switchdev_obj *obj) 213{ 214 return -EOPNOTSUPP; 215} 216 217static inline int register_switchdev_notifier(struct notifier_block *nb) 218{ 219 return 0; 220} 221 222static inline int unregister_switchdev_notifier(struct notifier_block *nb) 223{ 224 return 0; 225} 226 227static inline int call_switchdev_notifiers(unsigned long val, 228 struct net_device *dev, 229 struct switchdev_notifier_info *info) 230{ 231 return NOTIFY_DONE; 232} 233 234static inline bool switchdev_port_same_parent_id(struct net_device *a, 235 struct net_device *b) 236{ 237 return false; 238} 239 240#define SWITCHDEV_SET_OPS(netdev, ops) do {} while (0) 241 242#endif 243 244#endif /* _LINUX_SWITCHDEV_H_ */