sk_buff 里的len, data_len, skb_headlen

本文解析了skb数据结构中skb->len、skb->data_len及skb_headlen等字段的意义,明确了这些字段分别代表data长度、paged data长度及unpaged data长度,并解释了skb_push操作增加len的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://vger.kernel.org/~davem/skb_data.html

struct sk_buff *skb;

skb->len 是data 长度

skb->data_len 是paged data长度

skb_headlen skb->len - skb->data_len 是unpaged data长度

所以skb_headlen函数不是head的长度,而是unpaged data长度

搞清楚了skb->len的意义,就明白了为啥skb_push操作会增加len了

 

根据提供的 `hci_event.txt` 文档内容,在 `read_enc_key_size_complete` 函数中添加打印 `skb->len` 值的日志语句。以下是修改后的代码片段: ```c static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status, u16 opcode, struct sk_buff *skb) { const struct hci_rp_read_enc_key_size *rp; struct hci_conn *conn; u16 handle; BT_DBG("%s status 0x%02x skb->len %zu", hdev->name, status, skb ? skb->len : 0); if (!skb || skb->len < sizeof(*rp)) { bt_dev_err(hdev, "invalid read key size response"); return; } rp = (void *)skb->data; handle = le16_to_cpu(rp->handle); hci_dev_lock(hdev); conn = hci_conn_hash_lookup_handle(hdev, handle); if (!conn) goto unlock; /* If we fail to read the encryption key size, assume maximum * (which is the same we do also when this HCI command isn't * supported. */ if (rp->status) { bt_dev_err(hdev, "failed to read key size for handle %u", handle); conn->enc_key_size = HCI_LINK_KEY_SIZE; } else { conn->enc_key_size = rp->key_size; } if (conn->state == BT_CONFIG) { conn->state = BT_CONNECTED; hci_connect_cfm(conn, 0); hci_conn_drop(conn); } else { u8 encrypt; if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags)) encrypt = 0x00; else if (test_bit(HCI_CONN_AES_CCM, &conn->flags)) encrypt = 0x02; else encrypt = 0x01; hci_encrypt_cfm(conn, 0, encrypt); } unlock: hci_dev_unlock(hdev); } ``` 在这个修改版本中,我在函数开始部分添加了一行日志输出语句来打印 `skb->len` 的值。这将有助于调试和确认接收到的数据包长度是否符合预期。注意这也处理了 `skb` 可能为空的情况,以避免潜在的空指针引用错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值