int netlink_unicast(struct sock *ssk, struct sk_buff *skb, u32 pid, int nonblock) 参数说明: (1) ssk:为函数 netlink_kernel_create()返回的socket。 (2) skb:存放消息,它的data字段指向要发送的netlink消息结构,而 skb的控制块保存了消息的地址信息,宏NETLINK_CB(skb)就用于方便设置该控制块。 (...
TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); TCP_SKB_CB(skb)->when = 0; TCP_SKB_CB(skb)->flags = skb->nh.iph->tos; TCP_SKB_CB(skb)->sacked = 0; ... ... ... } 如果想要了解cb中的参数是如何被取出的,可以查看net/ipv4/tcp_output.c中的tcp_transmit_skb函数。这个函数...
inet=inet_sk(sk);tcb=TCP_SKB_CB(skb);memset(&opts,0,sizeof(opts));if(unlikely(tcb->tcp_flags&TCPHDR_SYN)){tcp_options_size=tcp_syn_options(sk,skb,&opts,&md5);}else{tcp_options_size=tcp_established_options(sk,skb,&opts,&md5);/* Force a PSH flag on all (GSO) packets to exp...
TCP_SKB_CB(skb)->seq = ntohl(th->seq); TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + skb->len - th->doff * 4); TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); TCP_SKB_CB(skb)->when = 0; TCP_SKB_CB(skb)->flags = iph->tos; ...
下面这个宏被TCP代码用来访问cb变量。在这个宏里面,有一个简单的类型转换: #define TCP_SKB_CB(__skb) ((struct tcp_skb_cb *)&((__skb)->cb[0])) 下面的例子是TCP子系统在收到一个分段时填充相关数据结构的代码: int tcp_v4_rcv(struct sk_buff *skb) ...
int udp_rcv(struct sk_buff *skb) { return __udp4_lib_rcv(skb, &udp_table, IPPROTO_UDP); } @skb: 输入数据包 @udptable:已绑定端口的UDP传输控制块,将从该哈希表查找给skb属于哪个套接字 @proto:L4协议号,到这里可能是IPPROTO_UDP或者IPPROTO_UDPLITE ...
skb_set_network_header(skb, skb_gro_offset(skb));//设置network header,驱动调用napi_gro_receive前需要把报文移到network header skb_reset_mac_len(skb);//设置mac长度 NAPI_GRO_CB(skb)->same_flow =0; NAPI_GRO_CB(skb)->flush =0;
NETLINK_CB(skb).dst_group = 1; 复制代码 字段pid表示消息发送者进程ID,也即源地址,对于内核,它为 0, dst_pid 表示消息接收者进程 ID,也即目标地址,如果目标为组或内核,它设置为 0,否则 dst_group 表示目标组地址,如果它目标为某一进程或内核,dst_group 应当设置为 0。
if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) { printk(KERN_CRIT "inet_proto_init: panic/n"); return -EINVAL; } /* * Tell SOCKET that we are alive... 注册socket,告诉socket inet类型的地址族已经准备好了 */ (void) sock_register(&inet_family_ops); ...
skb_set_network_header(skb, skb_gro_offset(skb));//设置network header,驱动调用napi_gro_receive前需要把报文移到network header skb_reset_mac_len(skb);//设置mac长度 NAPI_GRO_CB(skb)->same_flow =0; NAPI_GRO_CB(skb)->flush =0;