你知道Uboot中的net是怎样的?

  //net读
  //api/api.c
  static cfp_t calls_table[API_MAXCALL]={NULL,};
  void api_init(void)
  {
  ...https://www.weixiu3721.com

  calls_table[API_RSVD]=NULL;
  calls_table[API_GETC]=&API_getc;
  calls_table[API_PUTC]=&API_putc;
  calls_table[API_TSTC]=&API_tstc;
  calls_table[API_PUTS]=&API_puts;
  calls_table[API_RESET]=&API_reset;
  calls_table[API_GET_SYS_INFO]=&API_get_sys_info;
  calls_table[API_UDELAY]=&API_udelay;
  calls_table[API_GET_TIMER]=&API_get_TImer;
  calls_table[API_DEV_ENUM]=&API_dev_enum;
  calls_table[API_DEV_OPEN]=&API_dev_open;
  calls_table[API_DEV_CLOSE]=&API_dev_close;
  calls_table[API_DEV_READ]=&API_dev_read;
  calls_table[API_DEV_WRITE]=&API_dev_write;
  calls_table[API_ENV_GET]=&API_env_get;
  calls_table[API_ENV_SET]=&API_env_set;
  calls_table[API_ENV_ENUM]=&API_env_enum;
  calls_no=API_MAXCALL;
  ...
  }
  staTIc int API_dev_read(va_list ap)
  {
  ...
  else if(di->type&DEV_TYP_NET)
  {
  len_net=(int*)va_arg(ap,u_int32_t);
  if(!len_net)
  return API_EINVAL;
  if(*len_net<=0)
  return API_EINVAL;
  act_len_net=(int*)va_arg(ap,u_int32_t);
  if(!act_len_net)
  return API_EINVAL;
  *act_len_net=dev_read_net(di->cookie,buf,*len_net);
  }
  ...
  }
  //api/api_net.c
  int dev_read_net(void*cookie,void*buf,int len)
  {
  return eth_receive(buf,len);
  }
  //net/eth.c
  int eth_receive(volaTIle void*packet,int length)
  {
  if(eth_rcv_current==eth_rcv_last)
  {
  ...
  push_packet=eth_save_packet;
  eth_rx();
  push_packet=pp;
  if(eth_rcv_current==eth_rcv_last)
  return-1;
  ...
  }
  //drivers\net\higmacv300\Higmac.c
  int eth_rx(void)
  {
  ...
  NetReceive(NetRxPackets[0],len);
  ...
  }
  //net/net.chttps://www.weixiu3721.com
  void NetReceive(volatile uchar*inpkt,int len)
  {
  ...
  x=ntohs(vet->vet_type);
  ...
  switch(x)
  {
  case PROT_ARP:
  ...
  switch(ntohs(arp->ar_op))
  {
  ...
  case ARPOP_REQUEST:
  ...
  case ARPOP_REPLY:
  ...
  tmp=NetReadIP(&arp->ar_data[6]);
  if(tmp==NetArpWaitReplyIP)
  {
  ...
  (*packetHandler)(0,0,0,0);
  ...
  }
  case PROT_RARP:
  ...
  case PROT_IP:
  ...
  if(ip->ip_p==IPPROTO_ICMP)
  {
  ...
  switch(icmph->type)
  {
  case ICMP_REDIRECT:
  ...
  case ICMP_ECHO_REPLY:
  ...
  case ICMP_ECHO_REQUEST:
  ...
  }
  }
  }
  }
  }
  static rxhand_f*packetHandler;/*Current RX packet handler*/
  void NetSetHandler(rxhand_f*f)
  {
  packetHandler=f;
  }
  //net/net.h
  typedef void rxhand_f(uchar*,unsigned,unsigned,unsigned);
  举例tftp通讯
  //net/tftp.c
  void TftpStart(void)
  {
  ...
  NetSetHandler(TftpHandler);
  ...
  }
  static void TftpHandler(uchar*pkt,unsigned dest,unsigned src,unsigned len)
  {
  ...
  s=(ushort*)pkt;
  proto=*s++;
  ...
  switch(ntohs(proto))
  {
  case TFTP_RRQ:
  case TFTP_WRQ:
  break;
  case TFTP_ACK:
  }
  }

上一篇:第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-监视栈


下一篇:mac os x显示进程产生的Mach与BSD系统调用的数量