1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3 #ifndef __DSA_TAG_H 4 #define __DSA_TAG_H 5 6 #include <linux/if_vlan.h> 7 #include <linux/list.h> 8 #include <linux/types.h> 9 #include <net/dsa.h> 10 11 #include "port.h" 12 #include "user.h" 13 14 struct dsa_tag_driver { 15 const struct dsa_device_ops *ops; 16 struct list_head list; 17 struct module *owner; 18 }; 19 20 extern struct packet_type dsa_pack_type; 21 22 const struct dsa_device_ops *dsa_tag_driver_get_by_id(int tag_protocol); 23 const struct dsa_device_ops *dsa_tag_driver_get_by_name(const char *name); 24 void dsa_tag_driver_put(const struct dsa_device_ops *ops); 25 const char *dsa_tag_protocol_to_str(const struct dsa_device_ops *ops); 26 27 static inline int dsa_tag_protocol_overhead(const struct dsa_device_ops *ops) 28 { 29 return ops->needed_headroom + ops->needed_tailroom; 30 } 31 32 static inline struct net_device *dsa_conduit_find_user(struct net_device *dev, 33 int device, int port) 34 { 35 struct dsa_port *cpu_dp = dev->dsa_ptr; 36 struct dsa_switch_tree *dst = cpu_dp->dst; 37 struct dsa_port *dp; 38 39 list_for_each_entry(dp, &dst->ports, list) 40 if (dp->ds->index == device && dp->index == port && 41 dp->type == DSA_PORT_TYPE_USER) 42 return dp->user; 43 44 return NULL; 45 } 46 47 /** 48 * dsa_software_untag_vlan_aware_bridge: Software untagging for VLAN-aware bridge 49 * @skb: Pointer to received socket buffer (packet) 50 * @br: Pointer to bridge upper interface of ingress port 51 * @vid: Parsed VID from packet 52 * 53 * The bridge can process tagged packets. Software like STP/PTP may not. The 54 * bridge can also process untagged packets, to the same effect as if they were 55 * tagged with the PVID of the ingress port. So packets tagged with the PVID of 56 * the bridge port must be software-untagged, to support both use cases. 57 */ 58 static inline void dsa_software_untag_vlan_aware_bridge(struct sk_buff *skb, 59 struct net_device *br, 60 u16 vid) 61 { 62 u16 pvid, proto; 63 int err; 64 65 err = br_vlan_get_proto(br, &proto); 66 if (err) 67 return; 68 69 err = br_vlan_get_pvid_rcu(skb->dev, &pvid); 70 if (err) 71 return; 72 73 if (vid == pvid && skb->vlan_proto == htons(proto)) 74 __vlan_hwaccel_clear_tag(skb); 75 } 76 77 /** 78 * dsa_software_untag_vlan_unaware_bridge: Software untagging for VLAN-unaware bridge 79 * @skb: Pointer to received socket buffer (packet) 80 * @br: Pointer to bridge upper interface of ingress port 81 * @vid: Parsed VID from packet 82 * 83 * The bridge ignores all VLAN tags. Software like STP/PTP may not (it may run 84 * on the plain port, or on a VLAN upper interface). Maybe packets are coming 85 * to software as tagged with a driver-defined VID which is NOT equal to the 86 * PVID of the bridge port (since the bridge is VLAN-unaware, its configuration 87 * should NOT be committed to hardware). DSA needs a method for this private 88 * VID to be communicated by software to it, and if packets are tagged with it, 89 * software-untag them. Note: the private VID may be different per bridge, to 90 * support the FDB isolation use case. 91 * 92 * FIXME: this is currently implemented based on the broken assumption that 93 * the "private VID" used by the driver in VLAN-unaware mode is equal to the 94 * bridge PVID. It should not be, except for a coincidence; the bridge PVID is 95 * irrelevant to the data path in the VLAN-unaware mode. Thus, the VID that 96 * this function removes is wrong. 97 * 98 * All users of ds->untag_bridge_pvid should fix their drivers, if necessary, 99 * to make the two independent. Only then, if there still remains a need to 100 * strip the private VID from packets, then a new ds->ops->get_private_vid() 101 * API shall be introduced to communicate to DSA what this VID is, which needs 102 * to be stripped here. 103 */ 104 static inline void dsa_software_untag_vlan_unaware_bridge(struct sk_buff *skb, 105 struct net_device *br, 106 u16 vid) 107 { 108 struct net_device *upper_dev; 109 u16 pvid, proto; 110 int err; 111 112 err = br_vlan_get_proto(br, &proto); 113 if (err) 114 return; 115 116 err = br_vlan_get_pvid_rcu(skb->dev, &pvid); 117 if (err) 118 return; 119 120 if (vid != pvid || skb->vlan_proto != htons(proto)) 121 return; 122 123 /* The sad part about attempting to untag from DSA is that we 124 * don't know, unless we check, if the skb will end up in 125 * the bridge's data path - br_allowed_ingress() - or not. 126 * For example, there might be an 8021q upper for the 127 * default_pvid of the bridge, which will steal VLAN-tagged traffic 128 * from the bridge's data path. This is a configuration that DSA 129 * supports because vlan_filtering is 0. In that case, we should 130 * definitely keep the tag, to make sure it keeps working. 131 */ 132 upper_dev = __vlan_find_dev_deep_rcu(br, htons(proto), vid); 133 if (!upper_dev) 134 __vlan_hwaccel_clear_tag(skb); 135 } 136 137 /** 138 * dsa_software_vlan_untag: Software VLAN untagging in DSA receive path 139 * @skb: Pointer to socket buffer (packet) 140 * 141 * Receive path method for switches which send some packets as VLAN-tagged 142 * towards the CPU port (generally from VLAN-aware bridge ports) even when the 143 * packet was not tagged on the wire. Called when ds->untag_bridge_pvid 144 * (legacy) or ds->untag_vlan_aware_bridge_pvid is set to true. 145 * 146 * As a side effect of this method, any VLAN tag from the skb head is moved 147 * to hwaccel. 148 */ 149 static inline struct sk_buff *dsa_software_vlan_untag(struct sk_buff *skb) 150 { 151 struct dsa_port *dp = dsa_user_to_port(skb->dev); 152 struct net_device *br = dsa_port_bridge_dev_get(dp); 153 u16 vid, proto; 154 int err; 155 156 /* software untagging for standalone ports not yet necessary */ 157 if (!br) 158 return skb; 159 160 err = br_vlan_get_proto(br, &proto); 161 if (err) 162 return skb; 163 164 /* Move VLAN tag from data to hwaccel */ 165 if (!skb_vlan_tag_present(skb) && skb->protocol == htons(proto)) { 166 skb = skb_vlan_untag(skb); 167 if (!skb) 168 return NULL; 169 } 170 171 if (!skb_vlan_tag_present(skb)) 172 return skb; 173 174 vid = skb_vlan_tag_get_id(skb); 175 176 if (br_vlan_enabled(br)) { 177 if (dp->ds->untag_vlan_aware_bridge_pvid) 178 dsa_software_untag_vlan_aware_bridge(skb, br, vid); 179 } else { 180 if (dp->ds->untag_bridge_pvid) 181 dsa_software_untag_vlan_unaware_bridge(skb, br, vid); 182 } 183 184 return skb; 185 } 186 187 /* For switches without hardware support for DSA tagging to be able 188 * to support termination through the bridge. 189 */ 190 static inline struct net_device * 191 dsa_find_designated_bridge_port_by_vid(struct net_device *conduit, u16 vid) 192 { 193 struct dsa_port *cpu_dp = conduit->dsa_ptr; 194 struct dsa_switch_tree *dst = cpu_dp->dst; 195 struct bridge_vlan_info vinfo; 196 struct net_device *user; 197 struct dsa_port *dp; 198 int err; 199 200 list_for_each_entry(dp, &dst->ports, list) { 201 if (dp->type != DSA_PORT_TYPE_USER) 202 continue; 203 204 if (!dp->bridge) 205 continue; 206 207 if (dp->stp_state != BR_STATE_LEARNING && 208 dp->stp_state != BR_STATE_FORWARDING) 209 continue; 210 211 /* Since the bridge might learn this packet, keep the CPU port 212 * affinity with the port that will be used for the reply on 213 * xmit. 214 */ 215 if (dp->cpu_dp != cpu_dp) 216 continue; 217 218 user = dp->user; 219 220 err = br_vlan_get_info_rcu(user, vid, &vinfo); 221 if (err) 222 continue; 223 224 return user; 225 } 226 227 return NULL; 228 } 229 230 /* If the ingress port offloads the bridge, we mark the frame as autonomously 231 * forwarded by hardware, so the software bridge doesn't forward in twice, back 232 * to us, because we already did. However, if we're in fallback mode and we do 233 * software bridging, we are not offloading it, therefore the dp->bridge 234 * pointer is not populated, and flooding needs to be done by software (we are 235 * effectively operating in standalone ports mode). 236 */ 237 static inline void dsa_default_offload_fwd_mark(struct sk_buff *skb) 238 { 239 struct dsa_port *dp = dsa_user_to_port(skb->dev); 240 241 skb->offload_fwd_mark = !!(dp->bridge); 242 } 243 244 /* Helper for removing DSA header tags from packets in the RX path. 245 * Must not be called before skb_pull(len). 246 * skb->data 247 * | 248 * v 249 * | | | | | | | | | | | | | | | | | | | 250 * +-----------------------+-----------------------+---------------+-------+ 251 * | Destination MAC | Source MAC | DSA header | EType | 252 * +-----------------------+-----------------------+---------------+-------+ 253 * | | 254 * <----- len -----> <----- len -----> 255 * | 256 * >>>>>>> v 257 * >>>>>>> | | | | | | | | | | | | | | | 258 * >>>>>>> +-----------------------+-----------------------+-------+ 259 * >>>>>>> | Destination MAC | Source MAC | EType | 260 * +-----------------------+-----------------------+-------+ 261 * ^ 262 * | 263 * skb->data 264 */ 265 static inline void dsa_strip_etype_header(struct sk_buff *skb, int len) 266 { 267 memmove(skb->data - ETH_HLEN, skb->data - ETH_HLEN - len, 2 * ETH_ALEN); 268 } 269 270 /* Helper for creating space for DSA header tags in TX path packets. 271 * Must not be called before skb_push(len). 272 * 273 * Before: 274 * 275 * <<<<<<< | | | | | | | | | | | | | | | 276 * ^ <<<<<<< +-----------------------+-----------------------+-------+ 277 * | <<<<<<< | Destination MAC | Source MAC | EType | 278 * | +-----------------------+-----------------------+-------+ 279 * <----- len -----> 280 * | 281 * | 282 * skb->data 283 * 284 * After: 285 * 286 * | | | | | | | | | | | | | | | | | | | 287 * +-----------------------+-----------------------+---------------+-------+ 288 * | Destination MAC | Source MAC | DSA header | EType | 289 * +-----------------------+-----------------------+---------------+-------+ 290 * ^ | | 291 * | <----- len -----> 292 * skb->data 293 */ 294 static inline void dsa_alloc_etype_header(struct sk_buff *skb, int len) 295 { 296 memmove(skb->data, skb->data + len, 2 * ETH_ALEN); 297 } 298 299 /* On RX, eth_type_trans() on the DSA conduit pulls ETH_HLEN bytes starting from 300 * skb_mac_header(skb), which leaves skb->data pointing at the first byte after 301 * what the DSA conduit perceives as the EtherType (the beginning of the L3 302 * protocol). Since DSA EtherType header taggers treat the EtherType as part of 303 * the DSA tag itself, and the EtherType is 2 bytes in length, the DSA header 304 * is located 2 bytes behind skb->data. Note that EtherType in this context 305 * means the first 2 bytes of the DSA header, not the encapsulated EtherType 306 * that will become visible after the DSA header is stripped. 307 */ 308 static inline void *dsa_etype_header_pos_rx(struct sk_buff *skb) 309 { 310 return skb->data - 2; 311 } 312 313 /* On TX, skb->data points to the MAC header, which means that EtherType 314 * header taggers start exactly where the EtherType is (the EtherType is 315 * treated as part of the DSA header). 316 */ 317 static inline void *dsa_etype_header_pos_tx(struct sk_buff *skb) 318 { 319 return skb->data + 2 * ETH_ALEN; 320 } 321 322 /* Create 2 modaliases per tagging protocol, one to auto-load the module 323 * given the ID reported by get_tag_protocol(), and the other by name. 324 */ 325 #define DSA_TAG_DRIVER_ALIAS "dsa_tag:" 326 #define MODULE_ALIAS_DSA_TAG_DRIVER(__proto, __name) \ 327 MODULE_ALIAS(DSA_TAG_DRIVER_ALIAS __name); \ 328 MODULE_ALIAS(DSA_TAG_DRIVER_ALIAS "id-" \ 329 __stringify(__proto##_VALUE)) 330 331 void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[], 332 unsigned int count, 333 struct module *owner); 334 void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[], 335 unsigned int count); 336 337 #define dsa_tag_driver_module_drivers(__dsa_tag_drivers_array, __count) \ 338 static int __init dsa_tag_driver_module_init(void) \ 339 { \ 340 dsa_tag_drivers_register(__dsa_tag_drivers_array, __count, \ 341 THIS_MODULE); \ 342 return 0; \ 343 } \ 344 module_init(dsa_tag_driver_module_init); \ 345 \ 346 static void __exit dsa_tag_driver_module_exit(void) \ 347 { \ 348 dsa_tag_drivers_unregister(__dsa_tag_drivers_array, __count); \ 349 } \ 350 module_exit(dsa_tag_driver_module_exit) 351 352 /** 353 * module_dsa_tag_drivers() - Helper macro for registering DSA tag 354 * drivers 355 * @__ops_array: Array of tag driver structures 356 * 357 * Helper macro for DSA tag drivers which do not do anything special 358 * in module init/exit. Each module may only use this macro once, and 359 * calling it replaces module_init() and module_exit(). 360 */ 361 #define module_dsa_tag_drivers(__ops_array) \ 362 dsa_tag_driver_module_drivers(__ops_array, ARRAY_SIZE(__ops_array)) 363 364 #define DSA_TAG_DRIVER_NAME(__ops) dsa_tag_driver ## _ ## __ops 365 366 /* Create a static structure we can build a linked list of dsa_tag 367 * drivers 368 */ 369 #define DSA_TAG_DRIVER(__ops) \ 370 static struct dsa_tag_driver DSA_TAG_DRIVER_NAME(__ops) = { \ 371 .ops = &__ops, \ 372 } 373 374 /** 375 * module_dsa_tag_driver() - Helper macro for registering a single DSA tag 376 * driver 377 * @__ops: Single tag driver structures 378 * 379 * Helper macro for DSA tag drivers which do not do anything special 380 * in module init/exit. Each module may only use this macro once, and 381 * calling it replaces module_init() and module_exit(). 382 */ 383 #define module_dsa_tag_driver(__ops) \ 384 DSA_TAG_DRIVER(__ops); \ 385 \ 386 static struct dsa_tag_driver *dsa_tag_driver_array[] = { \ 387 &DSA_TAG_DRIVER_NAME(__ops) \ 388 }; \ 389 module_dsa_tag_drivers(dsa_tag_driver_array) 390 391 #endif 392