skb->dev =dev;skb_reset_mac_header(skb);eth= (struct ethhdr *)skb->data;skb_pull_inline(skb, ETH_HLEN);if(unlikely(!ether_addr_equal_64bits(eth->h_dest, dev->dev_addr))) {if(unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {if(ether_addr_equal_64bits(eth->h_dest,...
skb_reset_network_header()的原型为 static inline void skb_reset_network_header(struct sk_buff *skb){ skb->network_header = skb->data - skb->head;} 这个一般是在skb_pull/skb_push后做的,重新复位sk_buf网络头部地址。
skb_reset_mac_header(skb); /* 发射 */ dev_queue_xmit(skb); 解封装的过程和封装的过程相反,解封装的过程是协议栈栈帧逐层pop的过程,但是Linux协议栈并没有用栈的术语来定义接口名字,而是使用了push的反义词,即pull来定义的,skb_pull就是核心接口,和skb_push严格相对。我就不再一一画图了。
//skb_reset_mac_header(nskb); //skb_reset_network_header(nskb); nskb->data = skb_mac_header(nskb); nskb->len += ETH_HLEN; nskb->pkt_type = PACKET_OUTGOING; //OUTGOING; nskb->dev = (struct net_device *)in; #if 0
当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做...
skb_reset_tail_pointer(skb); skb->end = skb->tail + size; kmemcheck_annotate_bitfield(skb, flags1); kmemcheck_annotate_bitfield(skb, flags2); #ifdef NET_SKBUFF_DATA_USES_OFFSET skb->mac_header = ~0U; #endif /* make sure we initialize shinfo sequentially */ ...
Explore Why GitHub All features Documentation GitHub Skills Blog Solutions By company size Enterprises Small and medium teams Startups Nonprofits By use case DevSecOps DevOps CI/CD View all use cases By industry Healthcare Financial services Manufacturing Government View all industries ...
That's all I need it to do, but __skb_vlan_pop() has more logic, which will become incompatible with the future revert of commit 6d1ccff ("net: reset mac header in dev_start_xmit()"). Namely, it performs a sanity check on skb_mac_header(), which will stop being set after ...
mac处理是通过eth_type_trans函数进行处理: __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) { unsigned short _service_access_point; const unsigned short *sap; const struct ethhdr *eth; skb->dev = dev; /* 校正skb中mac头的指针 */ skb_reset_mac_header(skb); eth =...
典型的就是“如何让skb记住IP层协议头,传输层协议头,mac头的位置”,接口是: skb_reset_mac_header skb_reset_network_header skb_reset_transport_header 调用时机为skb_push返回的当时。曾几何时,我按照下面的方式设置了协议头的位置: 构造IP头 p = skb_push(skb, sizeof(struct iphdr)); iphdr = (struct...