1
1
openmpi/opal/mca/if/windows/opal_if_windows.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;
}