下面看一下UDP读取数据包的关键函数: struct sk_buff*__skb_recv_datagram(struct sock*sk,unsigned flags, int*peeked,int*err) { struct sk_buff*skb; long timeo; /* *Callerisallowednottocheck sk->sk_err before skb_recv_datagram() */ interror=sock_error(sk); if(error) goto no_packet; /...
对于刚刚通过alloc_skb() 方法申请出来的skb,head,tail,data 三个指针都指向同一位置,而tail 和end 之间有一段根据alloc_skb(len, flag) 方法的参数申请出来的空间。 为了给协议头预留空间,可以使用skb_reserve(skb, head_len)方法,该方法会根据参数将data 指针后移,扩展headroom. 可以通过skb_put(skb, data_...
unsigned char dgram[256]; /* Plenty for a PING datagram */ unsigned char recvbuff[256]; struct ip *iphead = (struct ip *)dgram; struct icmp *icmphead = (struct icmp *)(dgram + sizeof(struct ip)); struct sockaddr_in src; struct sockaddr_in addr; struct in_addr my_addr; struct ...
sys_recvfromsock_recvmsgsock->ops->recvmsg(sock_common_recvmsg)sock_common_recvmsgsk->sk_prot->recvmsg(udp_recvmsg)udp_recvmsgskb_recv_datagramwait_for_packetstaticint wait_for_packet(structsock *sk, int *err, long *timeo_p){…DEFINE_WAIT(wait);prepare_to_wait_exclusive(sk->sk_sleep,&wai...
{unsigned char dgram[256]; /* Plenty for a PING datagram */unsigned char recvbuff[256];struct ip *iphead = (struct ip *)dgram;struct icmp *icmphead = (struct icmp *)(dgram + sizeof(struct ip));struct sockaddr_in src;struct sockaddr_in addr;...