?????????????????IP??????ν???????????????????????????????UDPЭ?????????????

??????ip_rcv()?????п??????


        /*
  * Pass on the datagram to each protocol that wants it??
  * based on the datagram protocol.  We should really
  * check the protocol handler's return values here...
  */
  ipprot->handler(skb2?? dev?? opts_p ? &opt : 0?? iph->daddr??
    (ntohs(iph->tot_len) - (iph->ihl * 4))??
    iph->saddr?? 0?? ipprot);


??????????????Э???handler???????????UDPЭ?飬?ú???????? udp_protocol????


static struct inet_protocol udp_protocol = {
  udp_rcv??  /* UDP handler  */
  NULL??   /* Will be UDP fraglist handler */
  udp_err??  /* UDP error control */
  &tcp_protocol?? /* next   */
  IPPROTO_UDP??  /* protocol ID  */
  0??   /* copy   */
  NULL??   /* data   */
  "UDP"   /* name   */
};


???????UDPЭ??????????????????£?????

struct udphdr {
  unsigned short source;//????
  unsigned short dest;//?????
  unsigned short len;//?????????
  unsigned short check;//?????
};


?????????????udp_rcv()?????????????