int RetVal;\r
EFI_STATUS Status;\r
socklen_t LengthInBytes;\r
- struct sockaddr_in LocalAddress;\r
- struct sockaddr_in RemoteAddress;\r
+ struct sockaddr_in6 LocalAddress;\r
+ struct sockaddr_in6 RemoteAddress;\r
\r
DBG_ENTER ( );\r
\r
LengthInBytes = sizeof ( LocalAddress );\r
RetVal = getsockname ( SocketFD, (struct sockaddr *)&LocalAddress, &LengthInBytes );\r
if ( 0 == RetVal ) {\r
+ LengthInBytes = sizeof ( LocalAddress );\r
RetVal = getpeername ( SocketFD, (struct sockaddr *)&RemoteAddress, &LengthInBytes );\r
if ( 0 == RetVal ) {\r
//\r
// Seperate the body from the trailer\r
//\r
- Status = HttpSendAnsiString ( SocketFD, pPort, " <hr>\r\n" );\r
+ Status = HttpSendAnsiString ( SocketFD, pPort, " <hr>\r\n<code>" );\r
if ( EFI_ERROR ( Status )) {\r
break;\r
}\r
if ( EFI_ERROR ( Status )) {\r
break;\r
}\r
- Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" );\r
+ Status = HttpSendAnsiString ( SocketFD, pPort, "</code>\r\n" );\r
if ( EFI_ERROR ( Status )) {\r
break;\r
}\r
//\r
Digit = (UINT32)(( Value >> Shift ) & 0xf );\r
if ( 10 <= Digit ) {\r
- Digit += 'A' - '0' - 10;\r
+ Digit += 'a' - '0' - 10;\r
}\r
\r
//\r
//\r
Digit = (UINT32)(( Value >> Shift ) & 0xf );\r
if ( 10 <= Digit ) {\r
- Digit += 'A' - '0' - 10;\r
+ Digit += 'a' - '0' - 10;\r
}\r
\r
//\r
}\r
\r
\r
+/**\r
+ Output an IP6 address value to the HTML page\r
+\r
+ @param [in] SocketFD Socket file descriptor\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Value Value to display\r
+ @param [in] bFirstValue TRUE if first value\r
+ @param [in] bLastValue TRUE if last value\r
+ @param [in] bZeroSuppression TRUE while zeros are being suppressed\r
+ @param [in] pbZeroSuppression Address to receive TRUE when zero suppression\r
+ has started, use NULL if next colon value not\r
+ needed.\r
+\r
+ @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendIp6Value (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN UINT16 Value,\r
+ IN BOOLEAN bFirstValue,\r
+ IN BOOLEAN bLastValue,\r
+ IN BOOLEAN bZeroSuppression,\r
+ IN BOOLEAN * pbZeroSuppression\r
+ )\r
+{\r
+ BOOLEAN bZeroSuppressionStarting;\r
+ UINT32 Digit;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Use break instead of goto\r
+ //\r
+ bZeroSuppressionStarting = FALSE;\r
+ Status = EFI_SUCCESS;\r
+ for ( ; ; ) {\r
+ //\r
+ // Display the leading colon if necessary\r
+ //\r
+ if ( bZeroSuppression && ( bLastValue || ( 0 != Value ))) {\r
+ Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Skip over a series of zero values\r
+ //\r
+ bZeroSuppressionStarting = (BOOLEAN)( 0 == Value );\r
+ if ( !bZeroSuppressionStarting ) {\r
+ //\r
+ // Display the value\r
+ //\r
+ Digit = ( Value >> 4 ) & 0xf;\r
+ Status = HttpSendHexValue ( SocketFD,\r
+ pPort,\r
+ Digit );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Digit = Value & 0xf;\r
+ Status = HttpSendHexValue ( SocketFD,\r
+ pPort,\r
+ Digit );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Digit = ( Value >> 12 ) & 0xf;\r
+ Status = HttpSendHexValue ( SocketFD,\r
+ pPort,\r
+ Digit );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Digit = ( Value >> 8 ) & 0xf;\r
+ Status = HttpSendHexValue ( SocketFD,\r
+ pPort,\r
+ Digit );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Display the trailing colon if necessary\r
+ //\r
+ if (( !bLastValue ) && ( bFirstValue || ( 0 != Value ))) {\r
+ Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+ }\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Return the next colon display\r
+ if ( NULL != pbZeroSuppression ) {\r
+ *pbZeroSuppression = bZeroSuppressionStarting;\r
+ }\r
+\r
+ //\r
+ // Return the operation status\r
+ //\r
+ return Status;\r
+}\r
+\r
+\r
/**\r
Output an IP address to the HTML page\r
\r
HttpSendIpAddress (\r
IN int SocketFD,\r
IN WSDT_PORT * pPort,\r
- IN struct sockaddr_in * pAddress\r
+ IN struct sockaddr_in6 * pAddress\r
)\r
{\r
+ BOOLEAN bZeroSuppression;\r
+ UINT32 Index;\r
+ struct sockaddr_in * pIpv4;\r
+ struct sockaddr_in6 * pIpv6;\r
+ UINT16 PortNumber;\r
EFI_STATUS Status;\r
\r
//\r
- // Output the IPv4 address\r
+ // Use break instead of goto\r
//\r
- Status = HttpSendValue ( SocketFD, pPort, (UINT8)pAddress->sin_addr.s_addr );\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendByte ( SocketFD, pPort, '.' );\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 8 ));\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendByte ( SocketFD, pPort, '.' );\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 16 ));\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendByte ( SocketFD, pPort, '.' );\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 24 ));\r
- if ( !EFI_ERROR ( Status )) {\r
- //\r
- // Output the port number\r
- //\r
- Status = HttpSendByte ( SocketFD, pPort, ':' );\r
- if ( !EFI_ERROR ( Status )) {\r
- Status = HttpSendValue ( SocketFD, pPort, htons ( pAddress->sin_port ));\r
- }\r
- }\r
- }\r
- }\r
+ for ( ; ; ) {\r
+ //\r
+ // Determine the type of address\r
+ //\r
+ if ( AF_INET6 == pAddress->sin6_family ) {\r
+ pIpv6 = pAddress;\r
+\r
+ //\r
+ // Display the address in RFC2732 format\r
+ //\r
+ bZeroSuppression = FALSE;\r
+ Status = HttpSendByte ( SocketFD, pPort, '[' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ for ( Index = 0; 8 > Index; Index++ ) {\r
+ Status = HttpSendIp6Value ( SocketFD,\r
+ pPort,\r
+ pIpv6->sin6_addr.__u6_addr.__u6_addr16[ Index ],\r
+ (BOOLEAN)( 0 == Index ),\r
+ (BOOLEAN)( 7 == Index ),\r
+ bZeroSuppression,\r
+ &bZeroSuppression );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
}\r
}\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Separate the port number\r
+ //\r
+ Status = HttpSendByte ( SocketFD, pPort, ']' );\r
+\r
+ //\r
+ // Get the port number\r
+ //\r
+ PortNumber = pIpv6->sin6_port;\r
}\r
+ else {\r
+ //\r
+ // Output the IPv4 address\r
+ //\r
+ pIpv4 = (struct sockaddr_in *)pAddress;\r
+ Status = HttpSendValue ( SocketFD, pPort, (UINT8)pIpv4->sin_addr.s_addr );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 8 ));\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 16 ));\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 24 ));\r
+\r
+ //\r
+ // Get the port number\r
+ //\r
+ PortNumber = pIpv4->sin_port;\r
+ }\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the port number\r
+ //\r
+ Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = HttpSendValue ( SocketFD, pPort, htons ( PortNumber ));\r
+ break;\r
}\r
\r
//\r