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

📄 net_ascii.c

📁 ucos的tcpip协议占
💻 C
📖 第 1 页 / 共 3 页
字号:


                     default:                                           /* See Note #1a1.                               */
                          Mem_Clr((void     *)paddr_mac,                /* Clr rtn addr on err (see Note #2c).          */
                                  (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
                         *perr = NET_ASCII_ERR_INVALID_CHAR;
                          return;                                       /* Prevent 'break NOT reachable' warning.       */
                 }
                                                                        /* Merge ASCII char into hex val.               */
                 addr_octet_val *= 16;
                 addr_octet_val += addr_octet_val_dig;
                 break;

/*$PAGE*/
            case ':':
                 if (pchar_prev == (CPU_CHAR *)0) {                     /* If NO prev char      (see Note #1a2B); ...   */
                     Mem_Clr((void     *)paddr_mac,                     /* ... clr rtn addr     (see Note #2c)    ...   */
                             (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
                    *perr = NET_ASCII_ERR_INVALID_CHAR_SEQ;             /* ... & rtn err.                               */
                     return;
                 }

                 if (*pchar_prev == (CPU_CHAR)':') {                    /* If prev char a colon (see Note #1a2B); ...   */
                     Mem_Clr((void     *)paddr_mac,                     /* ... clr rtn addr     (see Note #2c)    ...   */
                             (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
                    *perr = NET_ASCII_ERR_INVALID_CHAR_SEQ;             /* ... & rtn err.                               */
                     return;
                 }

                 addr_nbr_octet++;
                 if (addr_nbr_octet >= NET_ASCII_NBR_OCTET_ADDR_MAC) {  /* If nbr octets > max  (see Note #1a2A); ...   */
                     Mem_Clr((void     *)paddr_mac,                     /* ... clr rtn addr     (see Note #2c)    ...   */
                             (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
                    *perr = NET_ASCII_ERR_INVALID_LEN;                  /* ... & rtn err.                               */
                     return;
                 }

                                                                        /* Merge hex octet val into MAC addr.           */
                *paddr_cur++        = (CPU_INT08U)addr_octet_val;
                 addr_octet_val     =  0x0000;
                 addr_nbr_octet_dig =  0;
                 break;


            default:                                                    /* See Note #1a1.                               */
                 Mem_Clr((void     *)paddr_mac,                         /* Clr rtn addr on err (see Note #2c).          */
                         (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
                *perr = NET_ASCII_ERR_INVALID_CHAR;
                 return;                                                /* Prevent 'break NOT reachable' warning.       */
        }

        pchar_prev = pchar_cur;
        pchar_cur++;    
    }

    if (pchar_cur == (CPU_CHAR *)0) {                                   /* If ANY NULL ptr in ASCII str;  ..            */
        Mem_Clr((void     *)paddr_mac,                                  /* .. clr rtn addr (see Note #2c) ..            */
                (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
       *perr = NET_ASCII_ERR_NULL_PTR;                                  /* .. & rtn err.                                */
        return;
    }

    if (*pchar_prev == (CPU_CHAR)':') {                                 /* If last char a colon (see Note #1a2B); ..    */
        Mem_Clr((void     *)paddr_mac,                                  /* .. clr rtn addr     (see Note #2c)     ..    */
                (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
       *perr = NET_ASCII_ERR_INVALID_CHAR_SEQ;                          /* .. & rtn err.                                */
        return;
    }

    addr_nbr_octet++;
    if (addr_nbr_octet != NET_ASCII_NBR_OCTET_ADDR_MAC) {               /* If != nbr MAC addr octets (see Note #1a2A);  */
        Mem_Clr((void     *)paddr_mac,                                  /* .. clr rtn addr           (see Note #2c)  .. */
                (CPU_SIZE_T)NET_ASCII_NBR_OCTET_ADDR_MAC);
       *perr = NET_ASCII_ERR_INVALID_LEN;                               /* .. & rtn err.                                */
        return;
    }

                                                                        /* Merge hex octet val into final MAC addr.     */
   *paddr_cur = (CPU_INT08U)addr_octet_val;

   *perr      =  NET_ASCII_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetASCII_MAC_to_Str()
*
* Description : Convert a MAC address into a MAC address ASCII string.
*
* Argument(s) : paddr_mac           Pointer to a memory buffer that contains the MAC address (see Note #2).
*
*               paddr_mac_ascii     Pointer to an ASCII character array that will receive the return ASCII 
*                                       string from this function (see Note #1).
*
*               hex_lower_case      Format alphabetic hexadecimal characters in lower case :
*
*                                       DEF_NO      Format alphabetic hexadecimal characters in upper case.
*                                       DEF_YES     Format alphabetic hexadecimal characters in lower case.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_ASCII_ERR_NONE                  ASCII string successfully formatted.
*                               NET_ASCII_ERR_NULL_PTR              Argument 'paddr_mac'/'paddr_mac_ascii'
*                                                                       passed a NULL pointer.
*
* Return(s)   : none.
*
* Caller(s)   : Application.
*
*               This function is a network protocol suite application interface (API) function & MAY be 
*               called by application function(s).
*
* Note(s)     : (1) (a) (1) The return MAC address ASCII string ...
*
*                           (A) Formats EXACTLY six hexadecimal values ...
*                           (B) ... separated ...
*                           (C) ... by  EXACTLY five colon characters.
*
*                       (2) The size of the ASCII character array that will receive the returned ASCII 
*                           string MUST be greater than or equal to NET_ASCII_LEN_MAX_ADDR_MAC.
*
*                   (b) In other words, the MAC address ASCII string separates six hexadecimal octet 
*                       values by the colon character (':').  Each hexadecimal value represents one 
*                       octet of the MAC address starting with the most significant octet in network
*                       order.
*
*                           MAC Address Examples :
*
*                                 MAC ADDRESS ASCII STRING     HEXADECIMAL EQUIVALENT
*
*                                   "00:1A:07:AC:22:09"     =     0x001A07AC2209
*                                   "76:4E:01:D2:8C:0B"     =     0x764E01D28C0B
*                                   "80:Db:fE:0b:34:52"     =     0X80DBFE0B3452
*                                    --             --              --        --
*                                    ^               ^              ^          ^
*                                    |               |              |          |
*                                   MSO             LSO            MSO        LSO
*
*                               where
*
*                                   MSO             Most  Significant Octet in MAC Address
*                                   LSO             Least Significant Octet in MAC Address
*
*
*               (2) (a) The size of the memory buffer that contains the MAC address MUST be greater than
*                       or equal to NET_ASCII_NBR_OCTET_ADDR_MAC.
*
*                   (b) MAC address accessed by octets in memory buffer array.
*********************************************************************************************************
*/
/*$PAGE*/
void  NetASCII_MAC_to_Str (CPU_INT08U   *paddr_mac,
                           CPU_CHAR     *paddr_mac_ascii,
                           CPU_BOOLEAN   hex_lower_case,
                           NET_ERR      *perr)
{
    CPU_CHAR    *pchar;
    CPU_INT08U  *paddr;
    CPU_INT08U   addr_octet_nbr_shifts;
    CPU_INT08U   addr_octet_val;
    CPU_INT08U   addr_octet_dig_val;
    CPU_INT08U   i;
    CPU_INT08U   j;


                                                                        /* -------------- VALIDATE PTRS --------------- */
    if (paddr_mac == (CPU_INT08U *)0) {
       *perr = NET_ASCII_ERR_NULL_PTR;
        return;
    }
    if (paddr_mac_ascii == (CPU_CHAR *)0) {
       *perr = NET_ASCII_ERR_NULL_PTR;
        return;
    }


    paddr = paddr_mac;
    pchar = paddr_mac_ascii;

    for (i = NET_ASCII_NBR_OCTET_ADDR_MAC; i > 0; i--) {                /* Parse ALL addr octets.                       */

        addr_octet_val = *paddr;

        for (j = NET_ASCII_CHAR_MAX_OCTET_ADDR_MAC; j > 0; j--) {       /* Parse ALL octet's hex digs.                  */
                                                                        /* Calc  cur octet's hex dig val.               */
            addr_octet_nbr_shifts = (j - 1) * DEF_NIBBLE_NBR_BITS;
            addr_octet_dig_val    = (addr_octet_val >> addr_octet_nbr_shifts) & DEF_NIBBLE_MASK;
                                                                        /* Insert octet hex val ASCII dig.              */
            if (addr_octet_dig_val < 10) {
               *pchar++ = (CPU_CHAR)(addr_octet_dig_val + '0');
                
            } else {
                if (hex_lower_case != DEF_YES) {
                   *pchar++ = (CPU_CHAR)(addr_octet_dig_val - 10 + 'A');
                } else {
                   *pchar++ = (CPU_CHAR)(addr_octet_dig_val - 10 + 'a');
                }
            }
        }

        if (i > 1) {                                                    /* If NOT on last octet, append a colon char.   */
           *pchar++ = ':';
        }

        paddr++;
    }

   *pchar = (CPU_CHAR)0;                                                /* Append NULL char.                            */

   *perr  =  NET_ASCII_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetASCII_Str_to_IP()
*
* Description : Convert an IPv4 address in ASCII dotted-decimal notation to a network protocol IPv4 address
*                   in host-order.
*
* Argument(s) : paddr_ip_ascii      Pointer to an ASCII string that contains a dotted-decimal IPv4 address
*                                       (see Note #2).
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_ASCII_ERR_NONE                  IPv4 address successfully converted.
*                               NET_ASCII_ERR_NULL_PTR              Argument 'paddr_ip_ascii' passed a
*                                                                       NULL pointer.
*                               NET_ASCII_ERR_INVALID_LEN           Invalid ASCII string length.
*                               NET_ASCII_ERR_INVALID_CHAR          Invalid ASCII character.
*                               NET_ASCII_ERR_INVALID_CHAR_LEN      Invalid ASCII character length.
*                               NET_ASCII_ERR_INVALID_CHAR_VAL      Invalid ASCII character value.
*                               NET_ASCII_ERR_INVALID_CHAR_SEQ      Invalid ASCII character sequence.
*
* Return(s)   : Host-order IPv4 address represented by ASCII string, if NO errors.
*
*               NET_IP_ADDR_NONE,                                    otherwise.
*
* Caller(s)   : Application.
*
*               This function is a network protocol suite application interface (API) function & MAY be 
*               called by application function(s).
*
* Note(s)     : (1) RFC #1983 states that "dotted decimal notation ... refers [to] IP addresses of the
*                   form A.B.C.D; where each letter represents, in decimal, one byte of a four byte IP
*                   address".
*
*                   In other words, the dotted-decimal notation separates four decimal octet values by
*                   the dot, or period, character ('.').  Each decimal value represents one octet of 
*                   the IP address starting with the most significant octet in network order.
*
*                       IP Address Examples :
*
*                              DOTTED DECIMAL NOTATION     HEXADECIMAL EQUIVALENT
*
*                                   127.0.0.1           =       0x7F000001
*                                   192.168.1.64        =       0xC0A80140
*                                   255.255.255.0       =       0xFFFFFF00
*                                   ---         -                 --    --
*                                    ^          ^                 ^      ^
*                                    |          |                 |      |
*                                   MSO        LSO               MSO    LSO
*
*                           where
*
*                               MSO             Most  Significant Octet in Dotted Decimal IP Address
*                               LSO             Least Significant Octet in Dotted Decimal IP Address
*
*
*               (2) The dotted-decimal ASCII string MUST :
*
*                   (a) Include ONLY decimal values & the dot, or period, character ('.') ; ALL other

⌨️ 快捷键说明

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