stp的可靠网络配置的实训总结(ebpfskfilter)
stp的可靠网络配置的实训总结(ebpfskfilter)
2024-09-29 02:05:26  作者:茹此落寞  网址:https://m.xinb2b.cn/sport/jmj441361.html

BPF_PROG_TYPE_SOCKET_FILTER,从宏字面意思比较容易想到实现的是socket filter功能,它区别于sockops和tracepoint等功能,需要额外借助setsockopt能力将功能函数和socket绑定,功能才能真正生效。

如何定该类型

在内核态功能函数中定义SEC("socketxxxx"),则会被解析为BPF_PROG_TYPE_SOCKET_FILTER类型功能。

比如内核中实现的三个example程序:

samples/bpf/sockex1_kern.c --->SEC("socket1")

samples/bpf/sockex1_user.c

samples/bpf/sockex2_kern.c --->SEC("socket2")

samples/bpf/sockex2_user.c

samples/bpf/sockex3_kern.c --->SEC("socket3")

samples/bpf/sockex3_user.c

功能程序加载

这个没什么好讲的,程序肯定是装载到了内核,内核定义了一个数据结构

478 struct bpf_prog { 479 u16 pages; 480 u16 jited:1, 481 jit_requested:1, 482 undo_set_mem:1, 483 gpl_compatible:1, 484 cb_access:1, 485 dst_needed:1, 486 blinded:1, 487 is_func:1, 488 kprobe_override:1, 489 has_callchain_buf:1; 490 enum bpf_prog_type type; 491 enum bpf_attach_type expected_attach_type; 492 u32 len; 493 u32 jited_len; 494 u8 tag[BPF_TAG_SIZE]; 495 struct bpf_prog_aux *aux; 496 struct sock_fprog_kern *orig_prog; 497 unsigned int (*bpf_func)(const void *ctx, 498 const struct bpf_insn *insn); 499 500 union { 501 struct sock_filter insns[0]; 502 struct bpf_insn insnsi[0]; 503 }; 504 };

该数据解决在内核态功能函数被解析后逐渐初始化,并且最终初始化完整。

那么struct bpf_prog对象是如何被外部引用的呢 ? 通过文件的方式实现。

在linux内核中万物都可以定位为文件,通过文件的方式让隐晦的内容呈现给用户,用户通过文件fd的方式就可以快速的获取struct bpf_prog对象。片段代码如下:

1366 err = bpf_prog_new_fd(prog);1367 if (err < 0) {1368 1374 bpf_prog_put(prog);1375 return err;1376 }

prog就是功能型函数的存储对象,通过bpf_prog_new_fd最终实现了和文件关联,并且后续可以通过文件方式关联找到struct bpf_prog对象,事实上setsockopt就是这么实现将struct bpf_prog对象和sock关联的。


功能程序关联

struct bpf_prog对象肯定要和sock关联,然后才能在sock关键路径上被调用执行。

11 int main(int ac, char **argv) 12 { 13 char filename[256]; 14 FILE *f; 15 int i, sock; 16 17 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 18 19 if (load_bpf_file(filename)) { 20 printf("%s", bpf_log_buf); 21 return 1; 22 } 23 24 sock = open_raw_sock("lo"); 25 26 assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, 27 sizeof(prog_fd[0])) == 0);

26行代码正式将prog对象和sock关联。

setsockopt 的关键代码片段:

1906 if (level == SOL_SOCKET)1907 err =1908 sock_setsockopt(sock, level, optname, optval,1909 optlen);1910 else 939 case SO_ATTACH_BPF: 940 ret = -EINVAL; 941 if (optlen == sizeof(u32)) { 942 u32 ufd; 943 944 ret = -EFAULT; 945 if (copy_from_user(&ufd, optval, sizeof(ufd))) 946 break; 947 948 ret = sk_attach_bpf(ufd, sk); 949 } 950 break; 1570 int sk_attach_bpf(u32 ufd, struct sock *sk)1571 {1572 struct bpf_prog *prog = __get_bpf(ufd, sk);1573 int err;15741575 if (IS_ERR(prog))1576 return PTR_ERR(prog);15771578 err = __sk_attach_prog(prog, sk);1579 if (err < 0) {1580 bpf_prog_put(prog);1581 return err;1582 }15831584 return 0;1585 } 1176 static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,1177bool attach_drv)1178 {1179 struct fd f = fdget(ufd);1180 struct bpf_prog *prog;11811182 prog = ____bpf_prog_get(f);1183 if (IS_ERR(prog))1184 return prog;1185 if (!bpf_prog_get_ok(prog, attach_type, attach_drv)) {1186 prog = ERR_PTR(-EINVAL);1187 goto out;1188 }11891190 prog = bpf_prog_inc(prog);1191 out:1192 fdput(f);1193 return prog;1194 }

功能挂载点

已经将功能函数需要通过setsockopt实现和sock的关联,具体存储在sock什么对象上 ?

1430 static int __sk_attach_prog(struct bpf_prog *prog, struct sock *sk)1431 {1432 struct sk_filter *fp, *old_fp;14331434 fp = kmalloc(sizeof(*fp), GFP_KERNEL);1435 if (!fp)1436 return -ENOMEM;14371438 fp->prog = prog;14391440 if (!__sk_filter_charge(sk, fp)) {1441 kfree(fp);1442 return -ENOMEM;1443 }1444 refcount_set(&fp->refcnt, 1);14451446 old_fp = rcu_dereference_protected(sk->sk_filter,1447 lockdep_sock_is_held(sk));1448 rcu_assign_pointer(sk->sk_filter, fp);14491450 if (old_fp)1451 sk_filter_uncharge(sk, old_fp);14521453 return 0;1454 }

最终prog对象指向了sk->sk_filter->prog。

功能函数执行

到这里已经很明显了,直接在内核过滤sk_filter就能找到相关的代码了。

481 int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) 482 { 483 int err; 484 485 err = sk_filter(sk, skb); 486 if (err) 487 return err; 488 489 return __sock_queue_rcv_skb(sk, skb); 490 }

sk_filter就是BPF_PROG_TYPE_SOCKET_FILTER埋点函数。

raw_rcv -> raw_rcv_skb -> sock_queue_rcv_skb。

需要注意的是sk_filter看到的skb为拷贝后的副本。

  • 联通 大数据 公司(关于联通大数据公司)
  • 2024-09-29关于联通大数据公司文/王云辉9月25日,联通大数据公司在北京正式揭牌这是混改方案公布后,联通成立的第一家子公司,也是目前三大运营商成立的第一家专注于大数据的专业子公司而据联通副总经理姜正新表示,联通大数据公司正是中国联。
  • 富士康招应届毕业生(富士康招3747名应届大学生)
  • 2024-09-29富士康招3747名应届大学生【CNMO新闻】近日,富士康在公众号发布推文,称公司今年招聘应届大学毕业生3747人,其中深圳厂区1624人,外厂区2123人此外,本次招聘规模相较2021年提升了近50%,招聘的学生专业覆盖工业、机。
  • gta线上模式车被扣了没有图标(在线模式卡丁车对对碰)
  • 2024-09-29在线模式卡丁车对对碰另外,还有全新菲斯特嚎叫者、外贸出口清单双倍奖励及更多内容卡丁车是一项美妙的发明:它就如汽车一般,但体型娇小,安全规格也没那么严格例如,法律规则手册中并未明文禁止您在丁卡微托的前方安装机枪,用来向您的。
  • 东野圭吾的四大神作(东野圭吾的四大杰作是哪些)
  • 2024-09-29东野圭吾的四大杰作是哪些“东野圭吾的四大杰作是:《嫌疑犯X的献身》《白夜行》《恶意》《放学后》”1《嫌疑犯X的献身》我本人也比较喜欢看悬崖小说,也看过好多,当我读了《嫌疑犯X的献身》以后给我的感觉就是想不到的结局就是那种在没。
  • 十六种新职业有哪些(一图读懂13个新职业)
  • 2024-09-29一图读懂13个新职业新近期,人力资源社会保障部、市场监管总局、统计局正式向社会发布了人工智能工程技术人员等13个新职业信息这是自2015年版国家职业分类大典颁布以来发布的首批新职业,主要集中在高新技术领域那么,这13个新。
  • 双胞胎唯美名字起名(双胞胎唯美名字有哪些)
  • 2024-09-29双胞胎唯美名字有哪些星昊、云昊《诗经·大雅·云汉》“瞻昂昊天,云如何里!瞻昂昊天,有嘒其星”“星”指夜晚天空中有光亮的小星体,这句话是说满天星辰微光闪闪,形容男孩耀眼光芒“云”给人一种洁白柔软,又缥缈不定的感觉,形容男孩。
  • 女性贫血症状表现如何改善(女性贫血危害大)
  • 2024-09-29女性贫血危害大贫血是女性朋友日常生活中易患的病症,坊间常有“十女九贫”的说法女性贫血多是由于体内缺铁引起血红蛋白合成减少所致对于贫血,我们经常听到“吃一点好的就行了”的说法,这种说法固然有一定的道理,但却并非十分科。
  • 什么时候怀孩子是男孩呢(在什么状态下最容易怀男孩)
  • 2024-09-29在什么状态下最容易怀男孩美国航天航空医学研究中心,曾对148名职业运动员、64名战斗机驾驶员和25名宇航员的子女的性别做了调查,结果发现他们的子女有96%是女孩,主要是由于他们要消耗很多的能量,使肌肉和体液中积累了较多酸性代。
  • 幸福到万家剧情分集介绍(幸福到万家)
  • 2024-09-29幸福到万家#幸福到万家征文#电视剧《幸福到万家》由郑晓龙、刘雪松、姚远联合执导,赵丽颖、刘威、唐曾领衔主演,罗晋特邀出演曹征、张可盈、张喜前、迟蓬、林思意、刘衍辰、钱洁、马昕墨、宋元甫、辛鹏主演,冯雷特别出演,。
  • 十个可以室内提高控球能力的颠球练习 十个可以室内提高控球能力的颠球练习
  • 2024-09-29十个可以室内提高控球能力的颠球练习 十个可以室内提高控球能力的颠球练习大家好,今天我们分享十个室内提高控球能力的颠球练习,希望大家喜欢!封面今天给大家准备了10个颠球练习,让我们们在家里的就能练习提高第一脚触球能力,今天的练习从简单开始,逐步增加难度,整个训练我们只需要。