Merge branch 'master' into net-next

Conflicts:
	man/man8/ip-route.8.in
This commit is contained in:
Stephen Hemminger 2015-04-07 08:56:14 -07:00
commit bd733e4088
32 changed files with 237 additions and 180 deletions

View File

@ -16,7 +16,8 @@ struct db_names {
int max; 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); void db_names_free(struct db_names *db);
char *id_to_name(struct db_names *db, int id, char *name); char *id_to_name(struct db_names *db, int id, char *name);

View File

@ -11,8 +11,10 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h>
#include "names.h" #include "names.h"
#include "utils.h"
#define MAX_ENTRIES 256 #define MAX_ENTRIES 256
#define NAME_MAX_LEN 512 #define NAME_MAX_LEN 512
@ -48,48 +50,65 @@ static int read_id_name(FILE *fp, int *id, char *name)
return 0; return 0;
} }
struct db_names *db_names_alloc(const char *path) struct db_names *db_names_alloc(void)
{ {
struct db_names *db; 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);
return NULL;
}
db = malloc(sizeof(*db)); db = malloc(sizeof(*db));
if (!db)
return NULL;
memset(db, 0, sizeof(*db)); memset(db, 0, sizeof(*db));
db->size = MAX_ENTRIES; db->size = MAX_ENTRIES;
db->hash = malloc(sizeof(struct db_entry *) * db->size); db->hash = malloc(sizeof(struct db_entry *) * db->size);
memset(db->hash, 0, 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]))) { while ((ret = read_id_name(fp, &id, &namebuf[0]))) {
if (ret == -1) { if (ret == -1) {
fprintf(stderr, "Database %s is corrupted at %s\n", fprintf(stderr, "Database %s is corrupted at %s\n",
path, namebuf); path, namebuf);
fclose(fp); goto Exit;
return NULL;
} }
ret = -1;
if (id < 0) if (id < 0)
continue; continue;
entry = malloc(sizeof(*entry)); entry = malloc(sizeof(*entry));
entry->id = id; if (!entry)
goto Exit;
entry->name = strdup(namebuf); entry->name = strdup(namebuf);
if (!entry->name) {
free(entry);
goto Exit;
}
entry->id = id;
entry->next = db->hash[id & (db->size - 1)]; entry->next = db->hash[id & (db->size - 1)];
db->hash[id & (db->size - 1)] = entry; db->hash[id & (db->size - 1)] = entry;
} }
ret = 0;
Exit:
fclose(fp); fclose(fp);
return db; return ret;
} }
void db_names_free(struct db_names *db) 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) 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) while (entry && entry->id != id)
entry = entry->next; entry = entry->next;
@ -136,6 +159,9 @@ int name_to_id(struct db_names *db, int *id, const char *name)
struct db_entry *entry; struct db_entry *entry;
int i; int i;
if (!db)
return -1;
if (db->cached && strcmp(db->cached->name, name) == 0) { if (db->cached && strcmp(db->cached->name, name) == 0) {
*id = db->cached->id; *id = db->cached->id;
return 0; return 0;
@ -145,6 +171,7 @@ int name_to_id(struct db_names *db, int *id, const char *name)
entry = db->hash[i]; entry = db->hash[i];
while (entry && strcmp(entry->name, name)) while (entry && strcmp(entry->name, name))
entry = entry->next; entry = entry->next;
if (entry) { if (entry) {
db->cached = entry; db->cached = entry;
*id = entry->id; *id = entry->id;

View File

@ -72,7 +72,10 @@ ip-link \- network device configuration
.BR gre " |" .BR gre " |"
.BR gretap " |" .BR gretap " |"
.BR ip6gre " |" .BR ip6gre " |"
.BR ip6gretap " ]" .BR ip6gretap " |"
.BR vti " |"
.BR nlmon " |"
.BR ipvlan " ]"
.ti -8 .ti -8
.BI "ip link delete " DEVICE .BI "ip link delete " DEVICE
@ -228,6 +231,15 @@ Link types:
.sp .sp
.BR ip6gretap .BR ip6gretap
- Virtual L2 tunnel interface GRE over IPv6 - 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 .in -8
.TP .TP

View File

@ -116,12 +116,18 @@ $ ip netns exec net0 SOME_PROCESS_IN_BACKGROUND
$ ip netns del net0 $ ip netns del net0
.RE .RE
.RS
and eth0 will appear in the default netns only after SOME_PROCESS_IN_BACKGROUND 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 will exit or will be killed. To prevent this the processes running in net0
should be killed before deleting the netns: should be killed before deleting the netns:
$ ip netns pids net0 | xargs kill .RE
$ ip netns del net0 .RS 10
$ ip netns pids net0 | xargs kill
.RE
.RS 10
$ ip netns del net0
.RE
.TP .TP
.B ip netns set NAME NETNSID - assign an id to a peer network namespace .B ip netns set NAME NETNSID - assign an id to a peer network namespace

View File

@ -21,6 +21,7 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <errno.h>
#include "utils.h" #include "utils.h"
#include "names.h" #include "names.h"
@ -33,14 +34,24 @@
static struct db_names *cls_names = NULL; 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) int cls_names_init(char *path)
{ {
cls_names = db_names_alloc(path ?: NAMES_DB); int ret;
if (!cls_names) {
fprintf(stderr, "Error while opening class names file\n"); cls_names = db_names_alloc();
if (!cls_names)
return -1; 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; return 0;