131 строка
4.2 KiB
C
131 строка
4.2 KiB
C
/*
|
|
* Copyright (c) 2004-2007 The Trustees of the University of Tennessee.
|
|
* All rights reserved.
|
|
* Copyright (c) 2009 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "opal_config.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "opal/mca/if/if.h"
|
|
#include "opal/constants.h"
|
|
|
|
static int if_windows_open(void);
|
|
|
|
opal_if_base_component_t mca_if_windows_component = {
|
|
/* First, the mca_component_t struct containing meta information
|
|
about the component itself */
|
|
{
|
|
OPAL_IF_BASE_VERSION_2_0_0,
|
|
|
|
/* Component name and version */
|
|
"windows",
|
|
OPAL_MAJOR_VERSION,
|
|
OPAL_MINOR_VERSION,
|
|
OPAL_RELEASE_VERSION,
|
|
|
|
/* Component open and close functions */
|
|
if_windows_open,
|
|
NULL
|
|
},
|
|
{
|
|
/* This component is checkpointable */
|
|
MCA_BASE_METADATA_PARAM_CHECKPOINT
|
|
},
|
|
};
|
|
|
|
/*
|
|
1. check if the interface info list is already populated. If so, return
|
|
2. get the interface information which is required using WSAIoctl
|
|
3. construct opal_if_list and populate it with the list of interfaces we have
|
|
CAVEAT: Does not support the following options which are supported in SIOCGIFCONF
|
|
- kernel table index
|
|
- interface name
|
|
*/
|
|
|
|
#define MAX_INTERFACES 10 /* Anju: for now assume there are no more than this */
|
|
|
|
static int if_windows_open(void)
|
|
{
|
|
SOCKET sd;
|
|
INTERFACE_INFO if_list[MAX_INTERFACES];
|
|
int num_interfaces;
|
|
unsigned long num_bytes_returned;
|
|
int i;
|
|
unsigned int interface_counter = 0;
|
|
opal_if_t *intf;
|
|
|
|
/* create a socket */
|
|
sd = WSASocket (AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
|
|
if (sd == SOCKET_ERROR) {
|
|
opal_output(0, "opal_ifinit: WSASocket failed with errno=%d\n",WSAGetLastError());
|
|
return OPAL_ERROR;
|
|
}
|
|
|
|
/* get the information about the interfaces */
|
|
if (SOCKET_ERROR == WSAIoctl (sd,
|
|
SIO_GET_INTERFACE_LIST,
|
|
NULL,
|
|
0,
|
|
&if_list,
|
|
sizeof (if_list),
|
|
&num_bytes_returned,
|
|
0,
|
|
0)) {
|
|
opal_output(0, "opal_ifinit: WSAIoctl failed with errno=%d\n",WSAGetLastError());
|
|
return OPAL_ERROR;
|
|
}
|
|
|
|
/* loop through all the interfaces and create the list */
|
|
num_interfaces = num_bytes_returned / sizeof (INTERFACE_INFO);
|
|
for (i = 0; i < num_interfaces; ++i) {
|
|
/* do all this only if the interface is up, and skip loopback interface */
|
|
if (0 != (if_list[i].iiFlags & IFF_UP)
|
|
&& (!opal_if_retain_loopback && 0 == (if_list[i].iiFlags & IFF_LOOPBACK))) {
|
|
|
|
intf = OBJ_NEW(opal_if_t);
|
|
if (NULL == intf) {
|
|
opal_output (0,"opal_ifinit: Unable to malloc %d bytes",sizeof(opal_list_t));
|
|
return OPAL_ERR_OUT_OF_RESOURCE;
|
|
}
|
|
|
|
/* fill in the interface address */
|
|
memcpy(&intf->if_addr, &(if_list[i].iiAddress),
|
|
sizeof(intf->if_addr));
|
|
|
|
/* fill in the netmask information */
|
|
memcpy(&intf->if_mask, &(if_list[i].iiNetmask),
|
|
sizeof(intf->if_mask));
|
|
|
|
/* fill in the bcast address */
|
|
memcpy(&intf->if_bcast, &(if_list[i].iiBroadcastAddress),
|
|
sizeof(intf->if_bcast));
|
|
|
|
/* fill in the flags */
|
|
intf->if_flags = if_list[i].iiFlags;
|
|
|
|
/* fill in the index in the table */
|
|
intf->if_index = opal_list_get_size(&opal_if_list)+1;
|
|
|
|
/* fill in the kernel index */
|
|
intf->if_kernel_index = intf->if_index;
|
|
|
|
/* generate the interface name, e.g. eth0, eth1, ..... */
|
|
sprintf(intf->if_name, "eth%u", interface_counter++);
|
|
|
|
/* copy all this into a persistent form and store it in the list */
|
|
opal_list_append(&opal_if_list, &(intf->super));
|
|
}
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|