net/dsa/tag_rtl4_a.c
Source file repositories/reference/linux-study-clean/net/dsa/tag_rtl4_a.c
File Facts
- System
- Linux kernel
- Corpus path
net/dsa/tag_rtl4_a.c- Extension
.c- Size
- 3156 bytes
- Lines
- 127
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/etherdevice.hlinux/bits.htag.h
Detected Declarations
function Copyright
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* Handler for Realtek 4 byte DSA switch tags
* Currently only supports protocol "A" found in RTL8366RB
* Copyright (c) 2020 Linus Walleij <linus.walleij@linaro.org>
*
* This "proprietary tag" header looks like so:
*
* -------------------------------------------------
* | MAC DA | MAC SA | 0x8899 | 2 bytes tag | Type |
* -------------------------------------------------
*
* The 2 bytes tag form a 16 bit big endian word. The exact
* meaning has been guessed from packet dumps from ingress
* frames.
*/
#include <linux/etherdevice.h>
#include <linux/bits.h>
#include "tag.h"
#define RTL4_A_NAME "rtl4a"
#define RTL4_A_HDR_LEN 4
#define RTL4_A_PROTOCOL_SHIFT 12
/*
* 0x1 = Realtek Remote Control protocol (RRCP)
* 0x2/0x3 seems to be used for loopback testing
* 0x9 = RTL8306 DSA protocol
* 0xa = RTL8366RB DSA protocol
*/
#define RTL4_A_PROTOCOL_RTL8366RB 0xa
static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb,
struct net_device *dev)
{
struct dsa_port *dp = dsa_user_to_port(dev);
__be16 *p;
u8 *tag;
u16 out;
/* Pad out to at least 60 bytes */
if (unlikely(__skb_put_padto(skb, ETH_ZLEN, false)))
return NULL;
netdev_dbg(dev, "add realtek tag to package to port %d\n",
dp->index);
skb_push(skb, RTL4_A_HDR_LEN);
dsa_alloc_etype_header(skb, RTL4_A_HDR_LEN);
tag = dsa_etype_header_pos_tx(skb);
/* Set Ethertype */
p = (__be16 *)tag;
*p = htons(ETH_P_REALTEK);
out = (RTL4_A_PROTOCOL_RTL8366RB << RTL4_A_PROTOCOL_SHIFT);
/* The lower bits indicate the port number */
out |= dsa_xmit_port_mask(skb, dev);
p = (__be16 *)(tag + 2);
*p = htons(out);
return skb;
}
static struct sk_buff *rtl4a_tag_rcv(struct sk_buff *skb,
struct net_device *dev)
{
u16 protport;
__be16 *p;
u16 etype;
u8 *tag;
u8 prot;
u8 port;
if (unlikely(!pskb_may_pull(skb, RTL4_A_HDR_LEN)))
return NULL;
tag = dsa_etype_header_pos_rx(skb);
p = (__be16 *)tag;
etype = ntohs(*p);
if (etype != ETH_P_REALTEK) {
/* Not custom, just pass through */
netdev_dbg(dev, "non-realtek ethertype 0x%04x\n", etype);
return skb;
}
p = (__be16 *)(tag + 2);
protport = ntohs(*p);
Annotation
- Immediate include surface: `linux/etherdevice.h`, `linux/bits.h`, `tag.h`.
- Detected declarations: `function Copyright`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.