Merge branch 'master' into net-next
Conflicts: man/man8/ip-route.8.in
This commit is contained in:
commit
bd733e4088
|
|
@ -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);
|
||||||
|
|
|
||||||
61
lib/names.c
61
lib/names.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
.RE
|
||||||
|
.RS 10
|
||||||
$ ip netns pids net0 | xargs kill
|
$ ip netns pids net0 | xargs kill
|
||||||
|
.RE
|
||||||
|
.RS 10
|
||||||
$ ip netns del net0
|
$ 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
|
||||||
|
|
|
||||||
19
tc/tc_util.c
19
tc/tc_util.c
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue