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

📄 net_util.c

📁 uCOS-II 2.8和uC-TCP/IP在ATMEL AT91SAM9261上移植
💻 C
📖 第 1 页 / 共 4 页
字号:
                                                                          (CPU_INT32U)size_rem_32);
        sum_32            += (CPU_INT32U)sum_val_32;
        size_rem          -= (CPU_INT32U)size_rem_32;

        pdata_08  = (CPU_INT08U *)pdata_16;
        pdata_08 +=               size_rem_32;                      /* MUST NOT cast ptr operand (see Note #7b).        */
        pdata_16  = (CPU_INT16U *)pdata_08;

#else
        pdata_32 = (CPU_INT32U *)pdata_16;
        while (size_rem >=  sizeof(CPU_INT32U)) {                   /* While pkt data aligned on 32-bit boundary; ...   */
            data_val_32  = (CPU_INT32U) *pdata_32++;                /* ... get sum data with 32-bit data words,   ...   */

            data_val_16  = (CPU_INT16U)((data_val_32 >> 16) & 0x0000FFFF);
            sum_val_32   = (CPU_INT32U)  NET_UTIL_HOST_TO_NET_16(data_val_16);  /* Conv to net-order (see Note #5b).    */
            sum_32      += (CPU_INT32U)  sum_val_32;                /* ... & calc sum with upper 16-bit data word ...   */

            data_val_16  = (CPU_INT16U) (data_val_32        & 0x0000FFFF);
            sum_val_32   = (CPU_INT32U)  NET_UTIL_HOST_TO_NET_16(data_val_16);  /* Conv to net-order (see Note #5b).    */
            sum_32      += (CPU_INT32U)  sum_val_32;                /* ...               & lower 16-bit data word.      */

            size_rem    -=  sizeof(CPU_INT32U);
        }
        pdata_16 = (CPU_INT16U *)pdata_32;
#endif
#endif

        while (size_rem >=  sizeof(CPU_INT16U)) {                   /* While pkt data aligned on 16-bit boundary; ..    */
            data_val_16  = (CPU_INT16U)*pdata_16++;
            sum_val_32   = (CPU_INT32U) NET_UTIL_HOST_TO_NET_16(data_val_16);   /* Conv to net-order (see Note #5b).    */
            sum_32      += (CPU_INT32U) sum_val_32;                 /* .. calc sum with 16-bit data words.              */
            size_rem    -=  sizeof(CPU_INT16U);
        }
        if (size_rem > 0) {
            sum_val_32   = (CPU_INT32U)(*((CPU_INT08U *)pdata_16));
        }

    } else {                                                        /* Else pkt data NOT aligned on 16-bit boundary, .. */
        while (size_rem >=  sizeof(CPU_INT16U)) {
            sum_val_32   = (CPU_INT32U)*pdata_08++;
            sum_val_32 <<=  DEF_OCTET_NBR_BITS;
            sum_val_32  += (CPU_INT32U)*pdata_08++;
            sum_32      += (CPU_INT32U) sum_val_32;                 /* .. calc sum with  8-bit data vals.               */
            size_rem    -=  sizeof(CPU_INT16U);
        }
        if (size_rem > 0) {
            sum_val_32   = (CPU_INT32U)*pdata_08;
        }
    }


/*$PAGE*/
    if (size_rem > 0) {
        if (last_pkt_buf !=  DEF_NO) {                              /* If last pkt buf, ...                             */
            sum_val_32  <<=  DEF_OCTET_NBR_BITS;                    /* ... pad odd-len pkt len (see Note #8).           */
            sum_32       += (CPU_INT32U)sum_val_32;
        } else {
           *poctet_last   = (CPU_INT08U)sum_val_32;                 /* Else rtn last octet.                             */
            DEF_BIT_SET(*psum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
        }
    }


    return (sum_32);                                                /* Rtn 16-bit sum (see Note #5c1).                  */
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                  NetUtil_16BitOnesCplSumDataCalc()
*
* Description : Calculate 16-bit one's-complement sum on packet data.
*
*               (1) Calculates the 16-bit one's-complement sum of packet data encapsulated in :
*
*                   (a) One or more network buffers             Support non-fragmented & fragmented packets
*                   (b) Transport layer pseudo-header           See RFC #768, Section 'Fields : Checksum' &
*                                                                   RFC #793, Section 3.1 'Header Format :
*                                                                       Checksum'.
*
* Argument(s) : pdata_buf           Pointer to packet data network buffer(s) (see Notes #1a & #2).
*
*               ppseudo_hdr         Pointer to transport layer pseudo-header (see Note #1b).
*
*               pseudo_hdr_size     Size    of transport layer pseudo-header.
*
*               perr                Pointer to variable that will receive the return error code from this function :
*
*                                       NET_UTIL_ERR_NONE               16-bit one's-complement sum calculated;
*                                                                           check return value.
*                                       NET_UTIL_ERR_NULL_PTR           Argument 'pdata_buf' passed a NULL pointer.
*                                       NET_UTIL_ERR_NULL_SIZE          Packet data is a zero size.
*                                       NET_UTIL_ERR_INVALID_PROTOCOL   Invalid data packet protocol.
*                                       NET_BUF_ERR_INVALID_IX          Invalid buffer index.
*
* Return(s)   : 16-bit one's-complement sum, if NO errors.
*
*               0,                           otherwise.
*
* Caller(s)   : NetUtil_16BitOnesCplChkSumDataCalc(),
*               NetUtil_16BitOnesCplChkSumDataVerify().
*
* Note(s)     : (2) Pointer to network buffer packet NOT validated as a network buffer.  However, no memory
*                   corruption occurs since no write operations are performed.
*
*               (3) Default case already invalidated in earlier functions.  However, the default case is
*                   included as an extra precaution in case 'ProtocolHdrType' is incorrectly modified.
*
*               (4) (a) Since the 16-bit sum calculations are returned as 32-bit network-order values 
*                       (see 'NetUtil_16BitSumDataCalc()  Note #5c1'), ...
*
*                   (b) ... the one's-complement sum MUST be converted to host-order but MUST NOT be re-
*                       converted back to network-order (see 'NetUtil_16BitSumDataCalc()  Note #5c3').
*********************************************************************************************************
*/
/*$PAGE*/
static  CPU_INT16U  NetUtil_16BitOnesCplSumDataCalc (void        *pdata_buf,
                                                     void        *ppseudo_hdr,
                                                     CPU_INT16U   pseudo_hdr_size,
                                                     NET_ERR     *perr)
{
    NET_BUF      *pbuf;
    NET_BUF      *pbuf_next;
    NET_BUF_HDR  *pbuf_hdr;
    void         *p_data;
    CPU_INT32U    sum;
    CPU_INT32U    sum_val;
    CPU_INT16U    sum_ones_cpl;
    CPU_INT16U    sum_ones_cpl_host;
    CPU_INT16U    data_ix;
    CPU_INT16U    data_len;
    CPU_INT08U    sum_err;
    CPU_INT08U    octet_prev;
    CPU_INT08U    octet_last;
    CPU_BOOLEAN   octet_prev_valid;
    CPU_BOOLEAN   octet_last_valid;
    CPU_BOOLEAN   mem_buf_last;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    CPU_BOOLEAN   mem_buf_first;
    CPU_BOOLEAN   mem_buf_null_size;
#endif


#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)                     /* ----------------- VALIDATE PTR ----------------- */
    if (pdata_buf == (void *)0) {
       *perr =  NET_UTIL_ERR_NULL_PTR;
        return (0);
    }
#endif


                                                                    /* ------ CALC PKT DATA 16-BIT ONE'S-CPL SUM ------ */
    pbuf             = (NET_BUF *)pdata_buf;
    sum              =  0;
    octet_prev       =  0;
    octet_last       =  0;
    octet_prev_valid =  DEF_NO;
    octet_last_valid =  DEF_NO;
    mem_buf_last     =  DEF_NO;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    mem_buf_first    =  DEF_YES;
#endif

    if (ppseudo_hdr != (void *)0) {                                 /* Calc pkt's pseudo-hdr 16-bit sum (see Note #1b). */
        sum_val  = NetUtil_16BitSumDataCalc((void       *) ppseudo_hdr,
                                            (CPU_INT16U  ) pseudo_hdr_size, 
                                            (CPU_INT08U *)&octet_prev,
                                            (CPU_INT08U *)&octet_last,
                                            (CPU_BOOLEAN ) octet_prev_valid,
                                            (CPU_BOOLEAN ) mem_buf_last,
                                            (CPU_INT08U *)&sum_err);
        sum     += sum_val;

        octet_last_valid = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
        if (octet_last_valid == DEF_YES) {                          /* If last octet from pseudo-hdr avail, ...         */
            octet_prev        = octet_last;                         /* ... prepend last octet to first pkt buf.         */
            octet_prev_valid  = DEF_YES;
        } else {
            octet_prev        = 0;
            octet_prev_valid  = DEF_NO;
        }
    }

/*$PAGE*/
    while (pbuf  != (NET_BUF *)0) {                                 /* Calc ALL data pkts' 16-bit sum (see Note #1a).   */
        pbuf_hdr  = &pbuf->Hdr;
        switch (pbuf_hdr->ProtocolHdrType) {                        /* Demux pkt buf's protocol ix & len.               */
            case NET_PROTOCOL_TYPE_ICMP:
                 data_ix  = pbuf_hdr->ICMP_MsgIx;
                 data_len = pbuf_hdr->ICMP_HdrLen    + (CPU_INT16U)pbuf_hdr->DataLen;
                 break;


            case NET_PROTOCOL_TYPE_UDP:
            case NET_PROTOCOL_TYPE_TCP:
                 data_ix  = pbuf_hdr->TCP_UDP_HdrDataIx;
                 data_len = pbuf_hdr->TCP_UDP_HdrLen + (CPU_INT16U)pbuf_hdr->DataLen;
                 break;


            default:                                                /* See Note #3.                                     */
                *perr =  NET_UTIL_ERR_INVALID_PROTOCOL;
                 return (0);                                        /* Prevent 'break NOT reachable' compiler warning.  */
        }

#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
        if (data_ix == NET_BUF_IX_NONE) {
           *perr =  NET_BUF_ERR_INVALID_IX;
            return (0);
        }
#endif
        p_data       = (void    *)&pbuf->Data[data_ix];
        pbuf_next    = (NET_BUF *) pbuf_hdr->NextBufPtr;
        mem_buf_last = (pbuf_next == (NET_BUF *)0) ? DEF_YES : DEF_NO;
                                                                    /* Calc pkt buf's 16-bit sum.                       */
        sum_val      =  NetUtil_16BitSumDataCalc((void       *) p_data,
                                                 (CPU_INT16U  ) data_len, 
                                                 (CPU_INT08U *)&octet_prev,
                                                 (CPU_INT08U *)&octet_last,
                                                 (CPU_BOOLEAN ) octet_prev_valid,
                                                 (CPU_BOOLEAN ) mem_buf_last,
                                                 (CPU_INT08U *)&sum_err);

#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
        if (mem_buf_first == DEF_YES) {
            mem_buf_first  = DEF_NO;
            if (mem_buf_last == DEF_YES) {
                mem_buf_null_size = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_NULL_SIZE);
                if (mem_buf_null_size != DEF_NO) {                  /* If ONLY mem buf & null size, rtn err.            */
                   *perr =  NET_UTIL_ERR_NULL_SIZE;
                    return (0);
                }
            }
        }
#endif

        if (mem_buf_last != DEF_YES) {                              /* If NOT on last pkt buf &                     ... */
            octet_last_valid = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
            if (octet_last_valid == DEF_YES) {                      /* ...         last octet from cur  pkt buf avail,  */
                octet_prev        = octet_last;                     /* ... prepend last octet to   next pkt buf.        */
                octet_prev_valid  = DEF_YES;
            } else {
                octet_prev        = 0;
                octet_prev_valid  = DEF_NO;
            }
        }

        sum  += sum_val;
        pbuf  = pbuf_next;
    }


    while (sum >> 16) {                                             /* While 16-bit sum ovf's, ...                      */
        sum = (sum & 0x0000FFFF) + (sum >> 16);                     /* ... sum ovf bits back into 16-bit one's-cpl sum. */
    }

    sum_ones_cpl      = (CPU_INT16U)sum;
    sum_ones_cpl_host =  NET_UTIL_NET_TO_HOST_16(sum_ones_cpl);     /* Conv back to host-order  (see Note #4b).         */
   *perr              =  NET_UTIL_ERR_NONE;


    return (sum_ones_cpl_host);                                     /* Rtn 16-bit one's-cpl sum (see Note #1).          */
}

⌨️ 快捷键说明

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