Commit bd733e40 authored by Stephen Hemminger's avatar Stephen Hemminger

Merge branch 'master' into net-next

Conflicts:
	man/man8/ip-route.8.in
parents 194e9b85 a89d5329
......@@ -16,7 +16,8 @@ struct db_names {
int max;
};
struct db_names *db_names_alloc(const char *path);
struct db_names *db_names_alloc(void);
int db_names_load(struct db_names *db, const char *path);
void db_names_free(struct db_names *db);
char *id_to_name(struct db_names *db, int id, char *name);
......
......@@ -11,8 +11,10 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "names.h"
#include "utils.h"
#define MAX_ENTRIES 256
#define NAME_MAX_LEN 512
......@@ -48,48 +50,65 @@ static int read_id_name(FILE *fp, int *id, char *name)
return 0;
}
struct db_names *db_names_alloc(const char *path)
struct db_names *db_names_alloc(void)
{
struct db_names *db;
struct db_entry *entry;
FILE *fp;
int id;
char namebuf[NAME_MAX_LEN] = {0};
int ret;
fp = fopen(path, "r");
if (!fp) {
fprintf(stderr, "Can't open file: %s\n", path);
db = malloc(sizeof(*db));
if (!db)
return NULL;
}
db = malloc(sizeof(*db));
memset(db, 0, sizeof(*db));
db->size = MAX_ENTRIES;
db->hash = malloc(sizeof(struct db_entry *) * db->size);
memset(db->hash, 0, sizeof(struct db_entry *) * db->size);
return db;
}
int db_names_load(struct db_names *db, const char *path)
{
struct db_entry *entry;
FILE *fp;
int id;
char namebuf[NAME_MAX_LEN] = {0};
int ret = -1;
fp = fopen(path, "r");
if (!fp)
return -ENOENT;
while ((ret = read_id_name(fp, &id, &namebuf[0]))) {
if (ret == -1) {
fprintf(stderr, "Database %s is corrupted at %s\n",
path, namebuf);
fclose(fp);
return NULL;
goto Exit;
}
ret = -1;
if (id < 0)
continue;
entry = malloc(sizeof(*entry));
entry->id = id;
if (!entry)
goto Exit;
entry->name = strdup(namebuf);
if (!entry->name) {
free(entry);
goto Exit;
}
entry->id = id;
entry->next = db->hash[id & (db->size - 1)];
db->hash[id & (db->size - 1)] = entry;
}
ret = 0;
Exit:
fclose(fp);
return db;
return ret;
}
void db_names_free(struct db_names *db)
......@@ -117,8 +136,12 @@ void db_names_free(struct db_names *db)
char *id_to_name(struct db_names *db, int id, char *name)
{
struct db_entry *entry = db->hash[id & (db->size - 1)];
struct db_entry *entry;
if (!db)
return NULL;
entry = db->hash[id & (db->size - 1)];
while (entry && entry->id != id)
entry = entry->next;
......@@ -136,6 +159,9 @@ int name_to_id(struct db_names *db, int *id, const char *name)
struct db_entry *entry;
int i;
if (!db)
return -1;
if (db->cached && strcmp(db->cached->name, name) == 0) {
*id = db->cached->id;
return 0;
......@@ -145,6 +171,7 @@ int name_to_id(struct db_names *db, int *id, const char *name)
entry = db->hash[i];
while (entry && strcmp(entry->name, name))
entry = entry->next;
if (entry) {
db->cached = entry;
*id = entry->id;
......
......@@ -72,7 +72,10 @@ ip-link \- network device configuration
.BR gre " |"
.BR gretap " |"
.BR ip6gre " |"
.BR ip6gretap " ]"
.BR ip6gretap " |"
.BR vti " |"
.BR nlmon " |"
.BR ipvlan " ]"
.ti -8
.BI "ip link delete " DEVICE
......@@ -228,6 +231,15 @@ Link types:
.sp
.BR ip6gretap
- Virtual L2 tunnel interface GRE over IPv6
.sp
.BR vti
- Virtual tunnel interface
.sp
.BR nlmon
- Netlink monitoring device
.sp
.BR ipvlan
- Interface for L3 (IPv6/IPv4) based VLANs
.in -8
.TP
......
......@@ -116,12 +116,18 @@ $ ip netns exec net0 SOME_PROCESS_IN_BACKGROUND
$ ip netns del net0
.RE
.RS
and eth0 will appear in the default netns only after SOME_PROCESS_IN_BACKGROUND
will exit or will be killed. To prevent this the processes running in net0
should be killed before deleting the netns:
$ ip netns pids net0 | xargs kill
$ ip netns del net0
.RE
.RS 10
$ ip netns pids net0 | xargs kill
.RE
.RS 10
$ ip netns del net0
.RE
.TP
.B ip netns set NAME NETNSID - assign an id to a peer network namespace
......
......@@ -21,6 +21,7 @@
#include <arpa/inet.h>
#include <string.h>
#include <math.h>
#include <errno.h>
#include "utils.h"
#include "names.h"
......@@ -33,15 +34,25 @@
static struct db_names *cls_names = NULL;
#define NAMES_DB "/etc/iproute2/cls_names"
#define NAMES_DB "/etc/iproute2/tc_cls"
int cls_names_init(char *path)
{
cls_names = db_names_alloc(path ?: NAMES_DB);
if (!cls_names) {
fprintf(stderr, "Error while opening class names file\n");
int ret;
cls_names = db_names_alloc();
if (!cls_names)
return -1;
ret = db_names_load(cls_names, path ?: NAMES_DB);
if (ret == -ENOENT && path) {
fprintf(stderr, "Can't open class names file: %s\n", path);
return -1;
}
if (ret) {
db_names_free(cls_names);
cls_names = NULL;
}
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment