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

📄 net_udp.c

📁 ucos的tcpip协议占
💻 C
📖 第 1 页 / 共 5 页
字号:
#if (((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                    || \
      (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED))                   && \
      (NET_CTR_CFG_ERR_EN         == DEF_ENABLED)                    && \
      (CPU_CFG_CRITICAL_METHOD    == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR         cpu_sr;
#endif
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) || \
     (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED))
    CPU_INT16U     flag_mask;
    CPU_BOOLEAN    used;
#endif
    CPU_BOOLEAN    peek;
    NET_BUF       *pbuf_head;
    NET_BUF       *pbuf_next;
    NET_BUF_HDR   *pbuf_head_hdr;
    NET_BUF_HDR   *pbuf_hdr;
    NET_BUF_SIZE   data_len_pkt;
    CPU_INT16U     data_len_buf_rem;
    CPU_INT16U     data_len_tot;
    CPU_INT08U    *p_data;
    CPU_INT08U    *pip_opts;
    CPU_INT08U     ip_opt_len;
    NET_ERR        err;
    NET_ERR        err_rtn;

                                                                
    if (pip_opts_len != (CPU_INT08U *)0) {                      /* Init len for err (see Note #7).                      */
       *pip_opts_len  =  0;
    }


#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) || \
     (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED))
    if (Net_InitDone != DEF_YES) {                              /* If init NOT complete, exit rx (see Notes #3 & #9b).  */
       *perr =  NET_ERR_INIT_INCOMPLETE;
        return (0);
    }

                                                                /* --------------- VALIDATE RX PKT BUFS --------------- */
    if (pbuf == (NET_BUF *)0) {
       *perr =  NET_UDP_ERR_NULL_PTR;                           /* See Note #9b.                                        */
        return (0);
    }

    used = NetBuf_IsUsed(pbuf);
    if (used != DEF_YES) {
        NET_CTR_ERR_INC(NetUDP_ErrRxPktDiscardedCtr);
       *perr =  NET_ERR_RX;                                     /* See Note #9b.                                        */
        return (0);
    }

                                                                /* --------------- VALIDATE RX DATA BUF --------------- */
    if (pdata_buf == (CPU_INT08U *)0) {
       *perr =  NET_UDP_ERR_NULL_PTR;                           /* See Note #9b.                                        */
        return (0);
    }
    if (data_buf_len < 1) {
       *perr =  NET_UDP_ERR_INVALID_DATA_SIZE;                  /* See Note #9b.                                        */
        return (0);
    }

                                                                /* ---------------- VALIDATE RX FLAGS ----------------- */
    flag_mask = NET_UDP_FLAG_NONE        |
                NET_UDP_FLAG_RX_DATA_PEEK; 

    if ((flags & ~flag_mask) != NET_UDP_FLAG_NONE) {            /* If any invalid flags req'd, rtn err (see Note #5).   */
        NET_CTR_ERR_INC(NetUDP_ErrInvalidFlagsCtr);
       *perr =  NET_UDP_ERR_INVALID_FLAG;                       /* See Note #9b.                                        */
        return (0);
    }
#endif


/*$PAGE*/
                                                                /* ----------------- GET RX'D IP OPTS ----------------- */
                                                                /* See Note #6.                                         */
    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 UDP APP RX DATA -------------- */
    pbuf_head        = (NET_BUF     *) pbuf;
    pbuf_head_hdr    = (NET_BUF_HDR *)&pbuf_head->Hdr;
    p_data           = (CPU_INT08U  *) pdata_buf;
    data_len_buf_rem = (CPU_INT16U   ) data_buf_len;
    data_len_tot     = (CPU_INT16U   ) 0;
    err_rtn          =  NET_UDP_ERR_NONE;

    while ((pbuf != (NET_BUF *)0) &&                            /* Copy app rx data from avail pkt buf(s).              */
           (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 data buf len > pkt buf data len, ...          */
            data_len_pkt =  pbuf_hdr->DataLen;                  /* ... copy all pkt buf data len.                       */
        } else {
            data_len_pkt = (NET_BUF_SIZE)data_len_buf_rem;      /* Else limit copy to rem data buf len ...              */
            err_rtn      =  NET_UDP_ERR_INVALID_DATA_SIZE;      /* ... & rtn data size 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 #9a.                                        */
            NetUDP_RxPktDiscard(pbuf_head, perr);
            return (0);
        }
                                                                /* Update data ptr & lens.                              */
        p_data           +=             data_len_pkt;           /* MUST NOT cast ptr operand (see Note #8b).            */
        data_len_tot     += (CPU_INT16U)data_len_pkt;
        data_len_buf_rem -= (CPU_INT16U)data_len_pkt;

        pbuf              =  pbuf_next;
    }


                                                                /* ----------------- FREE UDP RX PKTS ----------------- */
    peek = DEF_BIT_IS_SET(flags, NET_UDP_FLAG_RX_DATA_PEEK);
    if (peek != DEF_YES) {                                      /* If peek opt NOT req'd, pkt buf(s) consumed; ...      */
        pbuf_head_hdr->NextPrimListPtr = (void *)0;             /* ... unlink from any other pkt bufs/chains   ...      */
        NetUDP_RxPktFree(pbuf_head);                            /* ... & free pkt buf(s).                               */
    }


   *perr =  err_rtn;

    return (data_len_tot);
}


/*$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 #6].
*
*               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 (see Note #4); bit-field flags logically OR'd :
*
*                               NET_UDP_FLAG_NONE               No transmit flags selected.
*                               NET_UDP_FLAG_TX_CHK_SUM_DIS     DISABLE transmit check-sums.
*                               NET_UDP_FLAG_TX_BLOCK           Transmit UDP application data with blocking,
*                                                                   if flag set; without blocking, if clear
*                                                                   (see Note #4a).
*
*               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 #5) :
*
*                               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 Notes #6b & #6a2B).
*
*                                                               ----------- 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_LEN_DATA    Invalid protocol/data length.
*                               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.
*$PAGE*
* Return(s)   : Number of data octets transmitted, if NO errors.
*
*               0,                                 otherwise.
*
* Caller(s)   : NetSock_TxDataHandlerDatagram(),
*               Application.
*
*               This function is a network protocol suite application interface (API) function & MAY be 
*               called by application function(s).
*
* Note(s)     : (2) NetUDP_TxAppData() MUST be called with the global network lock already acquired.
*
*               (3) NetUDP_TxAppData() blocked until network initialization completes; perform NO action.
*
*               (4) #### Some UDP transmit flag options NOT yet implemented :
*
*                   (a) NET_UDP_FLAG_TX_BLOCK
*
*                   See also 'NetUDP_TxPktValidate()  Note #2b'.
*
*               (5) #### 'popts' configuration should be provided via appropriate IP layer API.
*
*               (6) (a) (1) Datagram transmission & reception MUST 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) (A) IEEE Std 1003.1, 2004 Edition, Section 'send() : DESCRIPTION' states that

⌨️ 快捷键说明

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