【问题标题】:Functions for getting packet headers available in sk_buff用于获取 sk_buff 中可用数据包头的函数
【发布时间】:2021-09-29 13:47:20
【问题描述】:

Linux 中有获取以太网头、IP 头和 UDP 头之类的函数

udp_hdr(skb)
ip_hdr
skb_push(skb, ETH_HLEN)

但是我找不到任何函数来获取有效负载,例如数据包的主体,例如包含主体的数据包,因此我可以编写 HTTP 或其他协议数据。在 Linux Device Driver book 或搜索后找不到它。那么问题是如何在内核中用以太网、IP、UDP 标头和有效负载组成 UDP 数据包?

【问题讨论】:

  • skb 是套接字缓冲区的对象
  • 你没看到skb->data吗?
  • @user253751 所以我只需要使用 skb->data 作为有效载荷? = 左侧的变量将是什么数据类型,例如 char *payloadhtml=skb->data 会起作用吗?

标签: c linux networking linux-kernel udp


【解决方案1】:

任何用于获取数据包主体等有效负载的函数

您可以根据下次要执行的操作以不同方式访问有效负载。例如:

struct iphdr *iph = ip_hdr(skb);

if (iph->protocol == IPPROTO_UDP) {
    struct udphdr *udph = udp_hdr(skb);
    // E.g. check for UDP port
    struct myl7_header *l7h = (struct myl7_header *)(udph + sizeof(struct udphdr));
    // ...
}

或者,如果您想进一步重构封装或者不再需要它们(粗略示例,未进行所有可能的健全性检查),您可以提取网络和传输标头:

struct iphdr *iph = ip_hdr(skb);

if (iph->protocol == IPPROTO_UDP) {
    struct udphdr *udph = udp_hdr(skb);
    struct myl7_header *l7h;
    // E.g. check for UDP port
    skb_pull(skb, sizeof(struct iphdr));
    skb_pull(skb, sizeof(struct udphdr));
    l7h = (struct myl7_header *)skb->data;
    // tansport protocol payload's length:
    // skb->len or skb_tail_pointer(skb) - skb->data
}

我真的不知道你所说的payloadhtml 是什么意思,L7 协议不是内核特定的东西,所以一般来说我们谈论的是传输协议的有效负载。

注意:ip_hdr()udp_hdr() 函数暗示使用非分页(线性)skb。

相关:What's the correct way to process all the payload of a sk_buff packet in Linux

【讨论】:

  • 而不是像 struct myl7_header *l7h = (struct myl7_header *)(udph + sizeof(struct udphdr)) 这样的示例中的结构。 char *my100_header = (char *)(udph + sizeof(struct udphdr)) 这也有用吗?如果我想从char *myl7_header 中读取 100 个字符?
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2015-08-06
  • 1970-01-01
  • 2012-10-26
  • 2020-05-26
  • 2020-03-19
相关资源
最近更新 更多