⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_udp.c

📁 ucos+lwip用于AT91SAM7X256
💻 C
📖 第 1 页 / 共 5 页
字号:
                                                                /* See Note #5.                                         */
    pbuf_hdr = &pbuf->Hdr;
    if (pbuf_hdr->IP_OptPtr != (void *)0) {                     /* If IP opts rx'd,                 & ...               */
        if (pip_opts_buf    != (void *)0) {                     /* .. IP opts rx buf avail,         & ...               */
            if (ip_opts_buf_len >= pbuf_hdr->IP_HdrLen) {       /* .. IP opts rx buf size sufficient, ...               */
                pip_opts   = &pbuf->Data[pbuf_hdr->IP_HdrIx];
                ip_opt_len = (CPU_INT08U)pbuf_hdr->IP_HdrLen;
                Mem_Copy((void     *)pip_opts_buf,              /* .. copy IP opts into rx buf.                         */     
                         (void     *)pip_opts,
                         (CPU_SIZE_T) ip_opt_len);

               *pip_opts_len = ip_opt_len;
            }
        }
    }


                                                                /* ----------------- DEFRAME APP DATA ----------------- */
    pbuf_head        = (NET_BUF    *)pbuf;
    p_data           = (CPU_INT08U *)pdata_buf;
    data_len_buf_rem = (CPU_INT16U  )data_buf_len;
    data_len_tot     = (CPU_INT16U  )0;
    err_rtn          =  NET_APP_ERR_NONE;

    while ((pbuf != (NET_BUF *)0) &&                            /* Copy app data from every pkt buf.                    */
           (data_len_buf_rem > 0)) {

        pbuf_hdr  = &pbuf->Hdr;
        pbuf_next = (NET_BUF *)pbuf_hdr->NextBufPtr;

        if (data_len_buf_rem > pbuf_hdr->DataLen) {             /* If rem app data buf len > pkt buf data len, ...      */
            data_len_pkt =  pbuf_hdr->DataLen;                  /* ... copy all pkt buf data len.                       */
        } else {                                                /* Else limit copy to         ...                       */
            data_len_pkt = (NET_BUF_SIZE)data_len_buf_rem;      /* ... rem app data buf len & ...                       */
            err_rtn      =  NET_APP_ERR_INVALID_DATA_SIZE;      /* ... rtn err code (see Note #4b).                     */
        }

        NetBuf_DataRd((NET_BUF    *) pbuf,
                      (NET_BUF_SIZE) pbuf_hdr->DataIx,
                      (NET_BUF_SIZE) data_len_pkt,
                      (CPU_INT08U *) p_data,
                      (NET_ERR    *)&err);
        if (err != NET_BUF_ERR_NONE) {                          /* See Note #7a.                                        */
            NetUDP_RxPktDiscard(pbuf_head, perr);
            return (0);
        }
                                                                /* Update data ptr & lens.                              */
        p_data           +=             data_len_pkt;
        data_len_tot     += (CPU_INT16U)data_len_pkt;
        data_len_buf_rem -= (CPU_INT16U)data_len_pkt;

        pbuf              =  pbuf_next;
    }

                                                                /* ----------------- FREE UDP RX PKT ------------------ */
    NetUDP_RxPktFree(pbuf_head);


   *perr =  err_rtn;

    return (data_len_tot);
}
#endif


/*$PAGE*/
/*
*********************************************************************************************************
*                                         NetUDP_TxAppData()
*
* Description : (1) Prepare & transmit data from Application layer(s) via UDP layer :
*
*                   (a) Validate application data
*                   (b) Transmit application data via UDP Transmit :
*                       (1) Calculate/validate application data buffer size
*                       (2) Get buffer(s) for application data
*                       (3) Copy application data into UDP packet buffer(s)
*                       (4) Initialize UDP packet buffer controls
*                       (5) Free UDP packet buffer(s)
*
*
* Argument(s) : p_data      Pointer to application data.
*
*               data_len    Length  of application data (in octets) [see Note #5].
*
*               src_addr    Source      IP  address.
*
*               src_port    Source      UDP port.
*
*               dest_addr   Destination IP  address.
*
*               dest_port   Destination UDP port.
*
*               TOS         Specific TOS to transmit UDP/IP packet
*                               (see 'net_ip.h  IP HEADER TYPE OF SERVICE (TOS) DEFINES').
*
*               TTL         Specific TTL to transmit UDP/IP packet (see RFC #1122, Section 3.2.1.7) :
*
*                               NET_IP_HDR_TTL_MIN        1     minimum TTL transmit value
*                               NET_IP_HDR_TTL_MAX      255     maximum TTL transmit value
*                               NET_IP_HDR_TTL_DFLT             default TTL transmit value
*                               NET_IP_HDR_TTL_NONE       0     replace with default TTL
*
*               flags_udp   Flags to select UDP transmit options; bit-field flags logically OR'd :
*
*                               NET_UDP_FLAG_NONE               No transmit flags selected.
*                               NET_UDP_FLAG_CHK_SUM_TX_DIS     DISABLE transmit check-sums.
*
*               flags_ip    Flags to select IP  transmit options; bit-field flags logically OR'd :
*
*                               NET_IP_FLAG_NONE                No transmit flags selected.
*                               NET_IP_FLAG_TX_DONT_FRAG        Set IP 'Don't Frag' flag.
*
*               popts_ip    Pointer to one or more IP options configuration data structures (see Note #4) :
*
*                               NULL                            NO IP transmit options configuration.
*                               NET_IP_OPT_CFG_ROUTE_TS         Route &/or Internet Timestamp options configuration.
*                               NET_IP_OPT_CFG_SECURITY         Security options configuration
*                                                                   (see 'net_ip.c  Note #1f').
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_UDP_ERR_NONE                Application data successfully prepared & 
*                                                                   transmitted via UDP layer.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*                               NET_UDP_ERR_NULL_PTR            Argument 'p_data'   passed a NULL pointer.
*                               NET_UDP_ERR_INVALID_DATA_SIZE   Argument 'data_len' passed an invalid size
*                                                                   (see Note #5).
*
*                                                               ----------- RETURNED BY NetBuf_Get() : -----------
*                               NET_BUF_ERR_INVALID_SIZE        Requested size is greater then the maximum buffer 
*                                                                   size available.
*                               NET_BUF_ERR_INVALID_LEN         Requested size & start index calculation overflows 
*                                                                   buffer's DATA area.
*                               NET_BUF_ERR_INVALID_TYPE        Invalid buffer type.
*                               NET_BUF_ERR_NONE_AVAIL          NO available buffers to allocate.
*
*                                                               --------- RETURNED BY NetBuf_DataWr() : ----------
*                               NET_BUF_ERR_NULL_PTR            Argument(s) passed a NULL pointer.
*                               NET_BUF_ERR_INVALID_IX          Invalid buffer index.
*
*                                                               ----------- RETURNED BY NetUDP_Tx() : ------------
*                               NET_ERR_INVALID_PROTOCOL        Invalid/unknown protocol type.
*                               NET_UDP_ERR_INVALID_PORT_NBR    Invalid UDP port number.
*                               NET_UDP_ERR_INVALID_FLAG        Invalid UDP flag(s).
*                               NET_UTIL_ERR_NULL_PTR           Check-sum passed a NULL pointer.
*                               NET_UTIL_ERR_NULL_SIZE          Check-sum passed a zero size.
*                               NET_UTIL_ERR_INVALID_PROTOCOL   Invalid data packet protocol.
*                               NET_ERR_TX                      Transmit error; packet(s) discarded.
*
* Return(s)   : Number of data octets transmitted, if NO errors.
*
*               0,                                 otherwise.
*
* Caller(s)   : NetSock_TxDataHandlerDatagram(),
*               Application.
*$PAGE*
* Note(s)     : (2) NetUDP_TxAppData() MUST be called with the global network lock already acquired.
*
*                   #### Developer required to encapsulate function call within global network lock?
*
*               (3) NetUDP_TxAppData() blocked until network initialization completes; perform NO action.
*
*               (4) #### 'popts' configuration should be provided via appropriate IP layer API.
*
*               (5) (a) (1) Datagram transmission & reception SHOULD be atomic -- i.e. every single, 
*                           complete datagram transmitted SHOULD be received as a single, complete
*                           datagram.  Thus, each call to transmit data MUST be transmitted in a 
*                           single, complete datagram.
*
*                       (2) Since IP transmit fragmentation is NOT currently supported (see 'net_ip.h  
*                           Note #1e'), if requested datagram transmit data length is greater than MTU,
*                           then the maximum number of octets up to MTU is transmitted but the remaining
*                           data octets are silently discarded & NET_UDP_ERR_INVALID_DATA_SIZE error is
*                           returned.
*
*                   (b) (1) 'data_len' of 0 octets allowed.
*
*                       (2) 'data_len' argument check NOT required unless data_len's native data type 
*                           'CPU_INT16U' is incorrectly configured as a signed integer in 'cpu.h'.
*
*               (6) On ANY transmit error, any remaining application data transmit is immediately aborted.
*
*               (7) Network buffer already freed by lower layer; only increment error counter.
*********************************************************************************************************
*/

CPU_INT16U  NetUDP_TxAppData (void              *p_data,
                              CPU_INT16U         data_len,
                              NET_IP_ADDR        src_addr,
                              NET_UDP_PORT_NBR   src_port,
                              NET_IP_ADDR        dest_addr,
                              NET_UDP_PORT_NBR   dest_port,
                              NET_IP_TOS         TOS,
                              NET_IP_TTL         TTL,
                              CPU_INT16U         flags_udp,
                              CPU_INT16U         flags_ip,
                              void              *popts_ip,
                              NET_ERR           *perr)
{
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                    && \
     (NET_CTR_CFG_ERR_EN         == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD    == CPU_CRITICAL_METHOD_STATUS_LOCAL))
#if 0                                                           /* See Note #5b2.                                       */
    CPU_SR         cpu_sr;
#endif
#endif
    NET_BUF       *pbuf;
    NET_BUF_HDR   *pbuf_hdr;
    NET_BUF_SIZE   buf_size_max;
    NET_BUF_SIZE   buf_size_max_data;
    NET_BUF_SIZE   data_ix_pkt;
    NET_BUF_SIZE   data_len_pkt;
    CPU_INT16U     data_len_tot;
    CPU_INT08U    *p_data_pkt;
    NET_ERR        err_rtn;


#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    if (Net_InitDone != DEF_YES) {                              /* If init NOT complete, exit tx (see Note #3).         */
       *perr =  NET_ERR_INIT_INCOMPLETE;
        return (0);
    }


                                                                /* ---------------- VALIDATE APP DATA ----------------- */
    if (p_data == (void *)0) {
        if (data_len > 0) {
           *perr =  NET_UDP_ERR_NULL_PTR;
            return (0);
        }
    }
#if 0                                                           /* See Note #5b2.                                       */
    if (data_len < 0) {
        NET_CTR_ERR_INC(NetUDP_ErrTxInvalidSizeCtr);
       *perr =  NET_UDP_ERR_INVALID_DATA_SIZE;
        return (0);
    }
#endif
#endif

/*$PAGE*/
                                                                /* ------------------- TX APP DATA -------------------- */
                                                                /* Calc buf max data size.                              */
    data_ix_pkt       = NET_BUF_DATA_TX_IX;
    buf_size_max      = NetBuf_GetMaxSize((NET_BUF    *)0,
                                          (NET_BUF_SIZE)data_ix_pkt);
    buf_size_max_data = DEF_MIN(buf_size_max, NET_UDP_MTU);

    if (data_len > buf_size_max_data) {                         /* If data len > max data size, ...                     */
        data_len_pkt      = (NET_BUF_SIZE)buf_size_max_data;    /* ...  limit pkt data len to max data size.            */
        err_rtn           =  NET_UDP_ERR_INVALID_DATA_SIZE;     /* ... (see Note #5a2).                                 */
    } else {                                                    
        data_len_pkt      = (NET_BUF_SIZE)data_len;             /* Else limit pkt data len to data len.                 */
        err_rtn           =  NET_UDP_ERR_NONE;
    }

                                                                
    data_len_tot =  0;
    p_data_pkt   = (CPU_INT08U *)p_data;

    pbuf = NetBuf_Get((NET_BUF_SIZE)data_len_pkt,               /* Get app data tx buf.                                 */
                      (NET_BUF_SIZE)data_ix_pkt,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -