More accurate and trustworthy descriptions of the netmask exist.
Interested readers can quench their curiosity either with one of the Richard Stevens books (ISBN 9780201633467) or the Wikipedia page (http://en.wikipedia.org/wiki/Subnetwork). This commit was SVN r24680.
Этот коммит содержится в:
родитель
fb3fd8fd0e
Коммит
34abbce82c
122
opal/util/if.c
122
opal/util/if.c
@ -488,7 +488,7 @@ opal_ifislocal(const char *hostname)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t parse_dots(char *addr)
|
static uint32_t parse_dots(const char *addr)
|
||||||
{
|
{
|
||||||
char **tuple;
|
char **tuple;
|
||||||
uint32_t n[]={0,0,0,0};
|
uint32_t n[]={0,0,0,0};
|
||||||
@ -506,9 +506,8 @@ static uint32_t parse_dots(char *addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
|
opal_iftupletoaddr(const char *inaddr, uint32_t *net, uint32_t *mask)
|
||||||
{
|
{
|
||||||
char *addr;
|
|
||||||
char **tuple;
|
char **tuple;
|
||||||
int pval;
|
int pval;
|
||||||
char *msk, *ptr;
|
char *msk, *ptr;
|
||||||
@ -517,12 +516,10 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
|
|||||||
if (NULL != mask) {
|
if (NULL != mask) {
|
||||||
/* set default */
|
/* set default */
|
||||||
*mask = 0xFFFFFFFF;
|
*mask = 0xFFFFFFFF;
|
||||||
/* protect the input */
|
|
||||||
addr = strdup(inaddr);
|
|
||||||
|
|
||||||
/* if entry includes mask, split that off */
|
/* if entry includes mask, split that off */
|
||||||
msk = NULL;
|
msk = NULL;
|
||||||
if (NULL != (ptr = strchr(addr, '/'))) {
|
if (NULL != (ptr = strchr(inaddr, '/'))) {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
msk = ptr + 1;
|
msk = ptr + 1;
|
||||||
/* is the mask a tuple? */
|
/* is the mask a tuple? */
|
||||||
@ -530,113 +527,19 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
|
|||||||
/* yes - extract mask from it */
|
/* yes - extract mask from it */
|
||||||
*mask = parse_dots(msk);
|
*mask = parse_dots(msk);
|
||||||
} else {
|
} else {
|
||||||
/* no - must be an int telling us how
|
/* no - must be an int telling us how much of the addr to use: e.g., /16
|
||||||
* much of the addr to use: e.g., /16
|
* For more information please read http://en.wikipedia.org/wiki/Subnetwork.
|
||||||
*/
|
*/
|
||||||
pval = strtol(msk, NULL, 10);
|
pval = strtol(msk, NULL, 10);
|
||||||
switch(pval) {
|
if ((pval > 31) || (pval < 1)) {
|
||||||
case 30:
|
|
||||||
*mask = parse_dots("255.255.255.252");
|
|
||||||
break;
|
|
||||||
case 29:
|
|
||||||
*mask = parse_dots("255.255.255.248");
|
|
||||||
break;
|
|
||||||
case 28:
|
|
||||||
*mask = parse_dots("255.255.255.240");
|
|
||||||
break;
|
|
||||||
case 27:
|
|
||||||
*mask = parse_dots("255.255.255.224");
|
|
||||||
break;
|
|
||||||
case 26:
|
|
||||||
*mask = parse_dots("255.255.255.192");
|
|
||||||
break;
|
|
||||||
case 25:
|
|
||||||
*mask = parse_dots("255.255.255.128");
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
*mask = parse_dots("255.255.255.0");
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
*mask = parse_dots("255.255.254.0");
|
|
||||||
break;
|
|
||||||
case 22:
|
|
||||||
*mask = parse_dots("255.255.252.0");
|
|
||||||
break;
|
|
||||||
case 21:
|
|
||||||
*mask = parse_dots("255.255.248.0");
|
|
||||||
break;
|
|
||||||
case 20:
|
|
||||||
*mask = parse_dots("255.255.240.0");
|
|
||||||
break;
|
|
||||||
case 19:
|
|
||||||
*mask = parse_dots("255.255.224.0");
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
*mask = parse_dots("255.255.192.0");
|
|
||||||
break;
|
|
||||||
case 17:
|
|
||||||
*mask = parse_dots("255.255.128.0");
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
*mask = parse_dots("255.255.0.0");
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
*mask = parse_dots("255.254.0.0");
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
*mask = parse_dots("255.252.0.0");
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
*mask = parse_dots("255.248.0.0");
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
*mask = parse_dots("255.240.0.0");
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
*mask = parse_dots("255.224.0.0");
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
*mask = parse_dots("255.192.0.0");
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
*mask = parse_dots("255.128.0.0");
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
*mask = parse_dots("255.0.0.0");
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
*mask = parse_dots("254.0.0.0");
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
*mask = parse_dots("252.0.0.0");
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
*mask = parse_dots("248.0.0.0");
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
*mask = parse_dots("240.0.0.0");
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
*mask = parse_dots("224.0.0.0");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
*mask = parse_dots("192.0.0.0");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
*mask = parse_dots("128.0.0.0");
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
*mask = parse_dots("0.0.0.0");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
opal_output(0, "opal_iftupletoaddr: unknown mask");
|
opal_output(0, "opal_iftupletoaddr: unknown mask");
|
||||||
free(addr);
|
|
||||||
return OPAL_ERROR;
|
return OPAL_ERROR;
|
||||||
}
|
}
|
||||||
|
*mask = 0xFFFFFFFF << (32 - pval);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* use the number of dots to determine it */
|
/* use the number of dots to determine it */
|
||||||
tuple = opal_argv_split(addr, '.');
|
tuple = opal_argv_split(inaddr, '.');
|
||||||
pval = opal_argv_count(tuple);
|
pval = opal_argv_count(tuple);
|
||||||
/* if we have three dots, then we have four
|
/* if we have three dots, then we have four
|
||||||
* fields since it is a full address, so the
|
* fields since it is a full address, so the
|
||||||
@ -651,29 +554,24 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
|
|||||||
*mask = 0xFF000000;
|
*mask = 0xFF000000;
|
||||||
} else {
|
} else {
|
||||||
opal_output(0, "opal_iftupletoaddr: unknown mask");
|
opal_output(0, "opal_iftupletoaddr: unknown mask");
|
||||||
free(addr);
|
|
||||||
return OPAL_ERROR;
|
return OPAL_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
opal_argv_free(tuple);
|
opal_argv_free(tuple);
|
||||||
}
|
}
|
||||||
free(addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if network addr is desired... */
|
/* if network addr is desired... */
|
||||||
if (NULL != net) {
|
if (NULL != net) {
|
||||||
/* set default */
|
/* set default */
|
||||||
*net = 0;
|
*net = 0;
|
||||||
/* protect the input */
|
|
||||||
addr = strdup(inaddr);
|
|
||||||
|
|
||||||
/* if entry includes mask, split that off */
|
/* if entry includes mask, split that off */
|
||||||
if (NULL != (ptr = strchr(addr, '/'))) {
|
if (NULL != (ptr = strchr(inaddr, '/'))) {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
}
|
}
|
||||||
/* now assemble the address */
|
/* now assemble the address */
|
||||||
*net = parse_dots(addr);
|
*net = parse_dots(inaddr);
|
||||||
free(addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return OPAL_SUCCESS;
|
return OPAL_SUCCESS;
|
||||||
|
@ -179,7 +179,7 @@ OPAL_DECLSPEC bool opal_ifislocal(const char *hostname);
|
|||||||
* @return OPAL_SUCCESS if no problems encountered
|
* @return OPAL_SUCCESS if no problems encountered
|
||||||
* @return OPAL_ERROR if data could not be released
|
* @return OPAL_ERROR if data could not be released
|
||||||
*/
|
*/
|
||||||
OPAL_DECLSPEC int opal_iftupletoaddr(char *addr, uint32_t *net, uint32_t *mask);
|
OPAL_DECLSPEC int opal_iftupletoaddr(const char *addr, uint32_t *net, uint32_t *mask);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if given interface is loopback
|
* Determine if given interface is loopback
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user