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

📄 net_ip.c

📁 ucos的tcpip协议占
💻 C
📖 第 1 页 / 共 5 页
字号:
CPU_BOOLEAN  NetIP_IsValidAddrThisHost (NET_IP_ADDR  addr_host,
                                        NET_IP_ADDR  addr_subnet_mask)
{
    CPU_BOOLEAN  valid_host;
    CPU_BOOLEAN  valid_mask;
    CPU_BOOLEAN  valid;


    valid_host = NetIP_IsValidAddrHost(addr_host);
    valid_mask = NetIP_IsValidAddrSubnetMask(addr_subnet_mask);

    valid      = ((valid_host == DEF_YES) &&
                  (valid_mask == DEF_YES)) ? DEF_YES : DEF_NO;

    if (valid == DEF_YES) {
                                                                    /* Chk invalid subnet specified (see Note #1d).     */
        if ((addr_host & addr_subnet_mask) == NET_IP_ADDR_THIS_HOST) {
             valid = DEF_NO;
        }
                                                                    /* Chk invalid subnet broadcast (see Note #1f).     */
        if ((addr_host & addr_subnet_mask) == NET_IP_ADDR_BROADCAST) {
             valid = DEF_NO;
        }
    }


    return (valid);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                    NetIP_IsValidAddrSubnetMask()
*
* Description : (1) Validate an IP subnet mask :
*
*                   (a) RFC #1122, Section 3.2.1.3 states that ... :
*
*                       (1) "IP addresses are not permitted to have the value 0 or -1 for any of the ...
*                            <Subnet-number> fields" ...
*                       (2) "This implies that each of these fields will be at least two bits long."
*
*                   (b) RFC #950, Section 2.1 'Special Addresses' reiterates that "the values of all
*                       zeros and all ones in the subnet field should not be assigned to actual 
*                       (physical) subnets".
*
*                   (c) RFC #950, Section 2.1 also states that "the bits that identify the subnet ...
*                       need not be adjacent in the address.  However, we recommend that the subnet
*                       bits be contiguous and located as the most significant bits of the local
*                       address".
*
*                       See also 'net_ip.h  IP ADDRESS DEFINES  Note #3'.
*
* Argument(s) : addr_subnet_mask    IP subnet mask to validate.
*
* Return(s)   : DEF_YES, if IP subnet mask valid.
*
*               DEF_NO,  otherwise.
*
* Caller(s)   : NetIP_IsValidAddrThisHost().
*
*               This function is a network protocol suite application interface (API) function & MAY be 
*               called by application function(s).
*
* Note(s)     : none.
*********************************************************************************************************
*/

CPU_BOOLEAN  NetIP_IsValidAddrSubnetMask (NET_IP_ADDR  addr_subnet_mask)
{
    CPU_BOOLEAN  valid;
    NET_IP_ADDR  mask;
    CPU_INT08U   mask_size;
    CPU_INT08U   mask_nbr_one_bits;
    CPU_INT08U   mask_nbr_one_bits_min;
    CPU_INT08U   mask_nbr_one_bits_max;
    CPU_INT08U   i;

                                                                    /* ------------- VALIDATE SUBNET MASK ------------- */
                                                                    /* Chk invalid subnet class (see Note #1c).         */
    if ((addr_subnet_mask & NET_IP_ADDR_CLASS_SUBNET_MASK) == NET_IP_ADDR_NONE) {
        valid = DEF_NO;

    } else {                                                        /* Chk invalid subnet mask (see Notes #1a & #1b).   */
        mask_size         = sizeof(addr_subnet_mask) * DEF_OCTET_NBR_BITS;
        mask              = DEF_BIT_00;
        mask_nbr_one_bits = 0;
        for (i = 0; i < mask_size; i++) {                           /* Calc nbr subnet bits.                            */
            if (addr_subnet_mask & mask) {
                mask_nbr_one_bits++;
            }
            mask <<= 1;
        }

        mask_nbr_one_bits_min = 2;                                  /* See Note #1a2.                                   */
        mask_nbr_one_bits_max = mask_size - mask_nbr_one_bits_min;
                                                                    /* Chk invalid nbr subnet bits (see Note #1a2).     */
        if (mask_nbr_one_bits < mask_nbr_one_bits_min) {
            valid = DEF_NO;

        } else if (mask_nbr_one_bits > mask_nbr_one_bits_max) {
            valid = DEF_NO;

        } else {
            valid = DEF_YES;
        }
    }


    return (valid);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             NetIP_Rx()
*
* Description : (1) Process received datagrams & forward to network protocol layers :
*
*                   (a) Validate IP packet & options
*                   (b) Reassemble fragmented datagrams
*                   (c) Demultiplex datagram to higher-layer protocols
*                   (d) Update receive statistics
*
*               (2) Although IP data units are typically referred to as 'datagrams' (see RFC #791, Section 1.1), 
*                   the term 'IP packet' (see RFC #1983, 'packet') is used for IP Receive until the packet is 
*                   validated, & possibly reassembled, as an IP datagram.
*
*
* Argument(s) : pbuf        Pointer to network buffer that received IP packet.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IP_ERR_NONE                 IP datagram successfully received & processed.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*
*                                                               ----- RETURNED BY NetIP_RxPktDiscard() : -----
*                               NET_ERR_RX                      Receive error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_RxPktFrameDemux(),
*               NetIP_TxPktDatagram().
*
*               This function is a network protocol suite to network interface (IF) function & SHOULD be 
*               called only by appropriate network interface function(s).
*
* Note(s)     : (3) NetIP_Rx() blocked until network initialization completes; perform NO action.
*
*               (4) Since NetIP_RxPktFragReasm() may return a pointer to a different packet buffer (see
*                   'NetIP_RxPktFragReasm()  Return(s)', 'pbuf_hdr' MUST be reloaded.
*
*               (5) (a) For single packet buffer IP datagrams, the datagram length is equal to the IP
*                       Total Length minus the IP Header Length.
*
*                   (b) For multiple packet buffer, fragmented IP datagrams, the datagram length is
*                       equal to the previously calculated total fragment size.
*
*                       (1) IP datagram length is stored ONLY in the first packet buffer of any
*                           fragmented packet buffers.
*
*               (6) Network buffer already freed by higher layer; only increment error counter.
*********************************************************************************************************
*/
/*$PAGE*/
void  NetIP_Rx (NET_BUF  *pbuf,
                NET_ERR  *perr)
{
#if (((NET_CTR_CFG_STAT_EN     == DEF_ENABLED)                    || \
      (NET_CTR_CFG_ERR_EN      == DEF_ENABLED))                   && \
      (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR        cpu_sr;
#endif
    NET_BUF_HDR  *pbuf_hdr;
    NET_IP_HDR   *pip_hdr;


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


#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
                                                                /* ------------------- VALIDATE PTR ------------------- */
    if (pbuf == (NET_BUF *)0) {
        NetIP_RxPktDiscard(pbuf, perr);
        NET_CTR_ERR_INC(NetIP_ErrNullPtrCtr);
        return;
    }
#endif


    NET_CTR_STAT_INC(NetIP_StatRxPktCtr);


                                                                /* ------------------ VALIDATE IP PKT ----------------- */
    pbuf_hdr = &pbuf->Hdr;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    NetIP_RxPktValidateBuf(pbuf_hdr, perr);                     /* Validate rx'd buf.                                   */
    switch (*perr) {
        case NET_IP_ERR_NONE:
             break;


        case NET_ERR_INVALID_PROTOCOL:
        case NET_BUF_ERR_INVALID_IX:
        default:
             NetIP_RxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
#endif
    pip_hdr = (NET_IP_HDR *)&pbuf->Data[pbuf_hdr->IP_HdrIx];
    NetIP_RxPktValidate(pbuf, pbuf_hdr, pip_hdr, perr);         /* Validate rx'd pkt.                                   */


                                                                /* ------------------- REASM FRAGS -------------------- */
    switch (*perr) {
        case NET_IP_ERR_NONE:
             pbuf = NetIP_RxPktFragReasm(pbuf, pbuf_hdr, pip_hdr, perr);
             break;


        case NET_IP_ERR_INVALID_VER:
        case NET_IP_ERR_INVALID_LEN_HDR:
        case NET_IP_ERR_INVALID_LEN_TOT:
        case NET_IP_ERR_INVALID_LEN_DATA:
        case NET_IP_ERR_INVALID_FLAG:
        case NET_IP_ERR_INVALID_FRAG:
        case NET_IP_ERR_INVALID_PROTOCOL:
        case NET_IP_ERR_INVALID_CHK_SUM:
        case NET_IP_ERR_INVALID_ADDR_SRC:
        case NET_IP_ERR_INVALID_ADDR_DEST:
        case NET_IP_ERR_INVALID_OPT:
        case NET_IP_ERR_INVALID_OPT_LEN:
        case NET_IP_ERR_INVALID_OPT_NBR:
        case NET_IP_ERR_INVALID_OPT_END:
        case NET_IP_ERR_INVALID_OPT_FLAG:
        case NET_IP_ERR_RX_OPT_BUF_NONE_AVAIL:
        case NET_IP_ERR_RX_OPT_BUF_WR:
        default:
             NetIP_RxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }


/*$PAGE*/
                                                                        /* -------------- DEMUX DATAGRAM -------------- */
    switch (*perr) {                                                    /* Chk err from NetIP_RxPktFragReasm().         */
        case NET_IP_ERR_RX_FRAG_NONE:
        case NET_IP_ERR_RX_FRAG_COMPLETE:
             pbuf_hdr = &pbuf->Hdr;                                     /* Reload buf hdr ptr (see Note #4).            */
             if (*perr == NET_IP_ERR_RX_FRAG_NONE) {                    /* If pkt NOT frag'd, ...                       */
                 pbuf_hdr->IP_DatagramLen = pbuf_hdr->IP_TotLen         /* ... calc buf datagram len (see Note #5a).    */
                                          - pbuf_hdr->IP_HdrLen;
             } else {                                                   /* Else set tot frag size ...                   */
                 pbuf_hdr->IP_DatagramLen = pbuf_hdr->IP_FragSizeTot;   /* ...       as datagram len (see Note #5b).    */
             }
             NetIP_RxPktDemuxDatagram(pbuf, pbuf_hdr, perr);
             break;


        case NET_IP_ERR_RX_FRAG_REASM:                          /* Frag'd datagram in reasm.                            */
            *perr = NET_IP_ERR_NONE;
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_IP_ERR_RX_FRAG_OFFSET:
        case NET_IP_ERR_RX_FRAG_SIZE:
        case NET_IP_ERR_RX_FRAG_DISCARD:
        default:
             NetIP_RxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }


                                                                /* ----------------- UPDATE RX STATS ------------------ */
    switch (*perr) {                                            /* Chk err from NetIP_RxPktDemuxDatagram().             */
        case NET_ICMP_ERR_NONE:
        case NET_TCP_ERR_NONE:
        case NET_UDP_ERR_NONE:
             NET_CTR_STAT_INC(NetIP_StatRxDatagramProcessedCtr);
            *perr = NET_IP_ERR_NONE;
             break;


        case NET_ERR_INIT_INCOMPLETE:
        case NET_ERR_RX:
             NET_CTR_ERR_INC(NetIP_ErrRxPktDiscardedCtr);       /* See Note #6.                                         */
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
            

        case NET_ERR_INVALID_PROTOCOL:
        default:
             NetIP_RxPktDiscard(pbuf, perr);

⌨️ 快捷键说明

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