1 Star 1 Fork 0

RobotCT/bcc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
vlan_learning.c 1.98 KB
一键复制 编辑 原始数据 按行查看 历史
// Copyright (c) PLUMgrid, Inc.
// Licensed under the Apache License, Version 2.0 (the "License")
#include <bcc/proto.h>
struct ifindex_leaf_t {
int out_ifindex;
u16 vlan_tci; // populated by phys2virt and used by virt2phys
u16 vlan_proto; // populated by phys2virt and used by virt2phys
u64 tx_pkts;
u64 tx_bytes;
};
// redirect based on mac -> out_ifindex (auto-learning)
BPF_HASH(egress, int, struct ifindex_leaf_t, 4096);
// redirect based on mac -> out_ifindex (config-driven)
BPF_HASH(ingress, u64, struct ifindex_leaf_t, 4096);
int handle_phys2virt(struct __sk_buff *skb) {
// only handle vlan packets
if (!skb->vlan_present)
return 1;
u8 *cursor = 0;
ethernet: {
struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));
u64 src_mac = ethernet->src;
struct ifindex_leaf_t *leaf = ingress.lookup(&src_mac);
if (leaf) {
lock_xadd(&leaf->tx_pkts, 1);
lock_xadd(&leaf->tx_bytes, skb->len);
// auto-program reverse direction table
int out_ifindex = leaf->out_ifindex;
struct ifindex_leaf_t zleaf = {0};
struct ifindex_leaf_t *out_leaf = egress.lookup_or_try_init(&out_ifindex, &zleaf);
if (out_leaf) {
// to capture potential configuration changes
out_leaf->out_ifindex = skb->ifindex;
out_leaf->vlan_tci = skb->vlan_tci;
out_leaf->vlan_proto = skb->vlan_proto;
}
// pop the vlan header and send to the destination
bpf_skb_vlan_pop(skb);
bpf_clone_redirect(skb, leaf->out_ifindex, 0);
}
}
return 1;
}
int handle_virt2phys(struct __sk_buff *skb) {
u8 *cursor = 0;
ethernet: {
struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));
int src_ifindex = skb->ifindex;
struct ifindex_leaf_t *leaf = egress.lookup(&src_ifindex);
if (leaf) {
lock_xadd(&leaf->tx_pkts, 1);
lock_xadd(&leaf->tx_bytes, skb->len);
bpf_skb_vlan_push(skb, leaf->vlan_proto, leaf->vlan_tci);
bpf_clone_redirect(skb, leaf->out_ifindex, 0);
}
}
return 1;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/Dmi-compute/bcc.git
git@gitee.com:Dmi-compute/bcc.git
Dmi-compute
bcc
bcc
master

搜索帮助