&netdev_linux_class,
&netdev_tap_class,
};
-enum { N_NETDEV_CLASSES = ARRAY_SIZE(netdev_classes) };
+static int n_netdev_classes = ARRAY_SIZE(netdev_classes);
/* All open network devices. */
static struct list netdev_list = LIST_INITIALIZER(&netdev_list);
{
static int status = -1;
if (status < 0) {
- int i;
+ int i, j;
fatal_signal_add_hook(restore_all_flags, NULL, true);
status = 0;
- for (i = 0; i < N_NETDEV_CLASSES; i++) {
+ for (i = j = 0; i < n_netdev_classes; i++) {
const struct netdev_class *class = netdev_classes[i];
if (class->init) {
int retval = class->init();
- if (retval) {
+ if (!retval) {
+ netdev_classes[j++] = class;
+ } else {
VLOG_ERR("failed to initialize %s network device "
"class: %s", class->name, strerror(retval));
if (!status) {
}
}
}
+ n_netdev_classes = j;
}
return status;
}
netdev_run(void)
{
int i;
- for (i = 0; i < N_NETDEV_CLASSES; i++) {
+ for (i = 0; i < n_netdev_classes; i++) {
const struct netdev_class *class = netdev_classes[i];
if (class->run) {
class->run();
netdev_wait(void)
{
int i;
- for (i = 0; i < N_NETDEV_CLASSES; i++) {
+ for (i = 0; i < n_netdev_classes; i++) {
const struct netdev_class *class = netdev_classes[i];
if (class->wait) {
class->wait();
int error;
int i;
- error = netdev_initialize();
- if (error) {
- return error;
- }
-
+ netdev_initialize();
colon = strchr(name, ':');
if (colon) {
*colon = '\0';
suffix = name;
}
- for (i = 0; i < N_NETDEV_CLASSES; i++) {
+ for (i = 0; i < n_netdev_classes; i++) {
const struct netdev_class *class = netdev_classes[i];
if (!strcmp(prefix, class->prefix)) {
error = class->open(name_, suffix, ethertype, &netdev);
svec_init(svec);
- error = netdev_initialize();
- if (error) {
- return error;
- }
+ netdev_initialize();
error = 0;
- for (i = 0; i < N_NETDEV_CLASSES; i++) {
+ for (i = 0; i < n_netdev_classes; i++) {
const struct netdev_class *class = netdev_classes[i];
if (class->enumerate) {
int retval = class->enumerate(svec);