zoukankan      html  css  js  c++  java
  • Uboot之net

    //net读

    //api/api.c

    static cfp_t calls_table[API_MAXCALL] = { NULL, };

    void api_init(void)

    {

      ...

      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 ethigmacv300Higmac.c

    int eth_rx(void)

    {

      ...

      NetReceive(NetRxPackets[0], len);

      ...

    }

    //net/net.c

    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:

        

      }

    }

  • 相关阅读:
    Python高效编程技巧
    Python使用Flask框架,结合Highchart,自定义图表样式主题
    Python使用Flask框架,结合Highchart,自定义基本上算是最全的导出菜单了
    Python使用Flask框架,结合Highchart,自定义导出菜单项目及顺序
    Python使用Flask框架,结合Highchart,搭配数据功能模块,加载 HTML 表格数据
    Python使用Flask框架,结合Highchart,搭配数据功能模块处理csv数据
    Python使用Flask框架,结合Highchart处理jsonl数据
    Python使用Flask框架,结合Highchart处理xml数据
    Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)
    使用Python的Flask框架,结合Highchart,动态渲染图表(Ajax 请求数据接口)
  • 原文地址:https://www.cnblogs.com/pokerface/p/7069859.html
Copyright © 2011-2022 走看看