drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c- Extension
.c- Size
- 4765 bytes
- Lines
- 149
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/tcp.hlinux/ipv6.hnet/inet_ecn.hnet/route.hnet/ip6_route.hlibcxgb_cm.h
Detected Declarations
function Copyrightfunction cxgb_our_interfacefunction cxgb_find_routefunction cxgb_find_route6export cxgb_get_4tupleexport cxgb_find_routeexport cxgb_find_route6
Annotated Snippet
#include <linux/tcp.h>
#include <linux/ipv6.h>
#include <net/inet_ecn.h>
#include <net/route.h>
#include <net/ip6_route.h>
#include "libcxgb_cm.h"
void
cxgb_get_4tuple(struct cpl_pass_accept_req *req, enum chip_type type,
int *iptype, __u8 *local_ip, __u8 *peer_ip,
__be16 *local_port, __be16 *peer_port)
{
int eth_len = (CHELSIO_CHIP_VERSION(type) <= CHELSIO_T5) ?
ETH_HDR_LEN_G(be32_to_cpu(req->hdr_len)) :
T6_ETH_HDR_LEN_G(be32_to_cpu(req->hdr_len));
int ip_len = (CHELSIO_CHIP_VERSION(type) <= CHELSIO_T5) ?
IP_HDR_LEN_G(be32_to_cpu(req->hdr_len)) :
T6_IP_HDR_LEN_G(be32_to_cpu(req->hdr_len));
struct iphdr *ip = (struct iphdr *)((u8 *)(req + 1) + eth_len);
struct ipv6hdr *ip6 = (struct ipv6hdr *)((u8 *)(req + 1) + eth_len);
struct tcphdr *tcp = (struct tcphdr *)
((u8 *)(req + 1) + eth_len + ip_len);
if (ip->version == 4) {
pr_debug("%s saddr 0x%x daddr 0x%x sport %u dport %u\n",
__func__, ntohl(ip->saddr), ntohl(ip->daddr),
ntohs(tcp->source), ntohs(tcp->dest));
*iptype = 4;
memcpy(peer_ip, &ip->saddr, 4);
memcpy(local_ip, &ip->daddr, 4);
} else {
pr_debug("%s saddr %pI6 daddr %pI6 sport %u dport %u\n",
__func__, ip6->saddr.s6_addr, ip6->daddr.s6_addr,
ntohs(tcp->source), ntohs(tcp->dest));
*iptype = 6;
memcpy(peer_ip, ip6->saddr.s6_addr, 16);
memcpy(local_ip, ip6->daddr.s6_addr, 16);
}
*peer_port = tcp->source;
*local_port = tcp->dest;
}
EXPORT_SYMBOL(cxgb_get_4tuple);
static bool
cxgb_our_interface(struct cxgb4_lld_info *lldi,
struct net_device *(*get_real_dev)(struct net_device *),
struct net_device *egress_dev)
{
int i;
egress_dev = get_real_dev(egress_dev);
for (i = 0; i < lldi->nports; i++)
if (lldi->ports[i] == egress_dev)
return true;
return false;
}
struct dst_entry *
cxgb_find_route(struct cxgb4_lld_info *lldi,
struct net_device *(*get_real_dev)(struct net_device *),
__be32 local_ip, __be32 peer_ip, __be16 local_port,
__be16 peer_port, u8 tos)
{
struct rtable *rt;
struct flowi4 fl4;
struct neighbour *n;
rt = ip_route_output_ports(&init_net, &fl4, NULL, peer_ip, local_ip,
peer_port, local_port, IPPROTO_TCP,
tos & ~INET_ECN_MASK, 0);
if (IS_ERR(rt))
return NULL;
n = dst_neigh_lookup(&rt->dst, &peer_ip);
if (!n)
return NULL;
if (!cxgb_our_interface(lldi, get_real_dev, n->dev) &&
!(n->dev->flags & IFF_LOOPBACK)) {
neigh_release(n);
dst_release(&rt->dst);
return NULL;
}
neigh_release(n);
return &rt->dst;
}
EXPORT_SYMBOL(cxgb_find_route);
struct dst_entry *
cxgb_find_route6(struct cxgb4_lld_info *lldi,
struct net_device *(*get_real_dev)(struct net_device *),
Annotation
- Immediate include surface: `linux/tcp.h`, `linux/ipv6.h`, `net/inet_ecn.h`, `net/route.h`, `net/ip6_route.h`, `libcxgb_cm.h`.
- Detected declarations: `function Copyright`, `function cxgb_our_interface`, `function cxgb_find_route`, `function cxgb_find_route6`, `export cxgb_get_4tuple`, `export cxgb_find_route`, `export cxgb_find_route6`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration 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.