?? net_ascii.c
字號:
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 + -