Merge branch 'master' into net-next
This commit is contained in:
commit
ac75d5cd36
4
Makefile
4
Makefile
|
|
@ -34,8 +34,8 @@ ADDLIB+=ipx_ntop.o ipx_pton.o
|
|||
#options for mpls
|
||||
ADDLIB+=mpls_ntop.o mpls_pton.o
|
||||
|
||||
CC = gcc
|
||||
HOSTCC = gcc
|
||||
CC := gcc
|
||||
HOSTCC ?= $(CC)
|
||||
DEFINES += -D_GNU_SOURCE
|
||||
# Turn on transparent support for LFS
|
||||
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
|
|
|
|||
|
|
@ -23,4 +23,5 @@ extern int show_stats;
|
|||
extern int show_details;
|
||||
extern int timestamp;
|
||||
extern int compress_vlans;
|
||||
extern int json_output;
|
||||
extern struct rtnl_handle rth;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ int oneline;
|
|||
int show_stats;
|
||||
int show_details;
|
||||
int compress_vlans;
|
||||
int json_output;
|
||||
int timestamp;
|
||||
char *batch_file;
|
||||
int force;
|
||||
|
|
@ -38,7 +39,7 @@ static void usage(void)
|
|||
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
||||
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
||||
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
|
||||
" -c[ompressvlans] }\n");
|
||||
" -c[ompressvlans] -j{son} }\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
|
@ -173,6 +174,8 @@ main(int argc, char **argv)
|
|||
++compress_vlans;
|
||||
} else if (matches(opt, "-force") == 0) {
|
||||
++force;
|
||||
} else if (matches(opt, "-json") == 0) {
|
||||
++json_output;
|
||||
} else if (matches(opt, "-batch") == 0) {
|
||||
argc--;
|
||||
argv++;
|
||||
|
|
|
|||
233
bridge/fdb.c
233
bridge/fdb.c
|
|
@ -21,6 +21,8 @@
|
|||
#include <linux/neighbour.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <json_writer.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "libnetlink.h"
|
||||
#include "br_common.h"
|
||||
|
|
@ -29,6 +31,8 @@
|
|||
|
||||
static unsigned int filter_index, filter_vlan;
|
||||
|
||||
json_writer_t *jw_global;
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: bridge fdb { add | append | del | replace } ADDR dev DEV\n"
|
||||
|
|
@ -59,6 +63,15 @@ static const char *state_n2a(unsigned int s)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static void start_json_fdb_flags_array(bool *fdb_flags)
|
||||
{
|
||||
if (*fdb_flags)
|
||||
return;
|
||||
jsonw_name(jw_global, "flags");
|
||||
jsonw_start_array(jw_global);
|
||||
*fdb_flags = true;
|
||||
}
|
||||
|
||||
int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
||||
{
|
||||
FILE *fp = arg;
|
||||
|
|
@ -66,11 +79,12 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
int len = n->nlmsg_len;
|
||||
struct rtattr *tb[NDA_MAX+1];
|
||||
__u16 vid = 0;
|
||||
bool fdb_flags = false;
|
||||
const char *state_s;
|
||||
|
||||
if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH) {
|
||||
fprintf(stderr, "Not RTM_NEWNEIGH: %08x %08x %08x\n",
|
||||
n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -86,6 +100,11 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
if (filter_index && filter_index != r->ndm_ifindex)
|
||||
return 0;
|
||||
|
||||
if (jw_global) {
|
||||
jsonw_pretty(jw_global, 1);
|
||||
jsonw_start_object(jw_global);
|
||||
}
|
||||
|
||||
parse_rtattr(tb, NDA_MAX, NDA_RTA(r),
|
||||
n->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
|
||||
|
||||
|
|
@ -95,40 +114,75 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
if (filter_vlan && filter_vlan != vid)
|
||||
return 0;
|
||||
|
||||
if (n->nlmsg_type == RTM_DELNEIGH)
|
||||
fprintf(fp, "Deleted ");
|
||||
if (n->nlmsg_type == RTM_DELNEIGH) {
|
||||
if (jw_global)
|
||||
jsonw_string_field(jw_global, "opCode", "deleted");
|
||||
else
|
||||
fprintf(fp, "Deleted ");
|
||||
}
|
||||
|
||||
if (tb[NDA_LLADDR]) {
|
||||
SPRINT_BUF(b1);
|
||||
fprintf(fp, "%s ",
|
||||
ll_addr_n2a(RTA_DATA(tb[NDA_LLADDR]),
|
||||
RTA_PAYLOAD(tb[NDA_LLADDR]),
|
||||
ll_index_to_type(r->ndm_ifindex),
|
||||
b1, sizeof(b1)));
|
||||
ll_addr_n2a(RTA_DATA(tb[NDA_LLADDR]),
|
||||
RTA_PAYLOAD(tb[NDA_LLADDR]),
|
||||
ll_index_to_type(r->ndm_ifindex),
|
||||
b1, sizeof(b1));
|
||||
if (jw_global)
|
||||
jsonw_string_field(jw_global, "mac", b1);
|
||||
else
|
||||
fprintf(fp, "%s ", b1);
|
||||
}
|
||||
|
||||
if (!filter_index && r->ndm_ifindex)
|
||||
fprintf(fp, "dev %s ", ll_index_to_name(r->ndm_ifindex));
|
||||
if (!filter_index && r->ndm_ifindex) {
|
||||
if (jw_global)
|
||||
jsonw_string_field(jw_global, "dev",
|
||||
ll_index_to_name(r->ndm_ifindex));
|
||||
else
|
||||
fprintf(fp, "dev %s ",
|
||||
ll_index_to_name(r->ndm_ifindex));
|
||||
}
|
||||
|
||||
if (tb[NDA_DST]) {
|
||||
int family = AF_INET;
|
||||
const char *abuf_s;
|
||||
|
||||
if (RTA_PAYLOAD(tb[NDA_DST]) == sizeof(struct in6_addr))
|
||||
family = AF_INET6;
|
||||
|
||||
fprintf(fp, "dst %s ",
|
||||
format_host(family,
|
||||
RTA_PAYLOAD(tb[NDA_DST]),
|
||||
RTA_DATA(tb[NDA_DST])));
|
||||
abuf_s = format_host(family,
|
||||
RTA_PAYLOAD(tb[NDA_DST]),
|
||||
RTA_DATA(tb[NDA_DST]));
|
||||
if (jw_global)
|
||||
jsonw_string_field(jw_global, "dst", abuf_s);
|
||||
else
|
||||
fprintf(fp, "dst %s ", abuf_s);
|
||||
}
|
||||
|
||||
if (vid)
|
||||
fprintf(fp, "vlan %hu ", vid);
|
||||
if (vid) {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "vlan", vid);
|
||||
else
|
||||
fprintf(fp, "vlan %hu ", vid);
|
||||
}
|
||||
|
||||
if (tb[NDA_PORT]) {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "port",
|
||||
ntohs(rta_getattr_u16(tb[NDA_PORT])));
|
||||
else
|
||||
fprintf(fp, "port %d ",
|
||||
ntohs(rta_getattr_u16(tb[NDA_PORT])));
|
||||
}
|
||||
|
||||
if (tb[NDA_VNI]) {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "vni",
|
||||
rta_getattr_u32(tb[NDA_VNI]));
|
||||
else
|
||||
fprintf(fp, "vni %d ",
|
||||
rta_getattr_u32(tb[NDA_VNI]));
|
||||
}
|
||||
|
||||
if (tb[NDA_PORT])
|
||||
fprintf(fp, "port %d ", ntohs(rta_getattr_u16(tb[NDA_PORT])));
|
||||
if (tb[NDA_VNI])
|
||||
fprintf(fp, "vni %d ", rta_getattr_u32(tb[NDA_VNI]));
|
||||
if (tb[NDA_IFINDEX]) {
|
||||
unsigned int ifindex = rta_getattr_u32(tb[NDA_IFINDEX]);
|
||||
|
||||
|
|
@ -136,37 +190,95 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
char ifname[IF_NAMESIZE];
|
||||
|
||||
if (!tb[NDA_LINK_NETNSID] &&
|
||||
if_indextoname(ifindex, ifname))
|
||||
fprintf(fp, "via %s ", ifname);
|
||||
else
|
||||
fprintf(fp, "via ifindex %u ", ifindex);
|
||||
if_indextoname(ifindex, ifname)) {
|
||||
if (jw_global)
|
||||
jsonw_string_field(jw_global, "viaIf",
|
||||
ifname);
|
||||
else
|
||||
fprintf(fp, "via %s ", ifname);
|
||||
} else {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "viaIfIndex",
|
||||
ifindex);
|
||||
else
|
||||
fprintf(fp, "via ifindex %u ", ifindex);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tb[NDA_LINK_NETNSID])
|
||||
fprintf(fp, "link-netnsid %d ",
|
||||
rta_getattr_u32(tb[NDA_LINK_NETNSID]));
|
||||
|
||||
if (tb[NDA_LINK_NETNSID]) {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "linkNetNsId",
|
||||
rta_getattr_u32(tb[NDA_LINK_NETNSID]));
|
||||
else
|
||||
fprintf(fp, "link-netnsid %d ",
|
||||
rta_getattr_u32(tb[NDA_LINK_NETNSID]));
|
||||
}
|
||||
|
||||
if (show_stats && tb[NDA_CACHEINFO]) {
|
||||
struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]);
|
||||
int hz = get_user_hz();
|
||||
|
||||
fprintf(fp, "used %d/%d ", ci->ndm_used/hz,
|
||||
ci->ndm_updated/hz);
|
||||
if (jw_global) {
|
||||
jsonw_uint_field(jw_global, "used",
|
||||
ci->ndm_used/hz);
|
||||
jsonw_uint_field(jw_global, "updated",
|
||||
ci->ndm_updated/hz);
|
||||
} else {
|
||||
fprintf(fp, "used %d/%d ", ci->ndm_used/hz,
|
||||
ci->ndm_updated/hz);
|
||||
}
|
||||
}
|
||||
if (r->ndm_flags & NTF_SELF)
|
||||
fprintf(fp, "self ");
|
||||
if (tb[NDA_MASTER])
|
||||
fprintf(fp, "master %s ",
|
||||
ll_index_to_name(rta_getattr_u32(tb[NDA_MASTER])));
|
||||
else if (r->ndm_flags & NTF_MASTER)
|
||||
fprintf(fp, "master ");
|
||||
if (r->ndm_flags & NTF_ROUTER)
|
||||
fprintf(fp, "router ");
|
||||
if (r->ndm_flags & NTF_EXT_LEARNED)
|
||||
fprintf(fp, "offload ");
|
||||
|
||||
fprintf(fp, "%s\n", state_n2a(r->ndm_state));
|
||||
fflush(fp);
|
||||
if (jw_global) {
|
||||
if (r->ndm_flags & NTF_SELF) {
|
||||
start_json_fdb_flags_array(&fdb_flags);
|
||||
jsonw_string(jw_global, "self");
|
||||
}
|
||||
if (r->ndm_flags & NTF_ROUTER) {
|
||||
start_json_fdb_flags_array(&fdb_flags);
|
||||
jsonw_string(jw_global, "router");
|
||||
}
|
||||
if (r->ndm_flags & NTF_EXT_LEARNED) {
|
||||
start_json_fdb_flags_array(&fdb_flags);
|
||||
jsonw_string(jw_global, "offload");
|
||||
}
|
||||
if (r->ndm_flags & NTF_MASTER)
|
||||
jsonw_string(jw_global, "master");
|
||||
if (fdb_flags)
|
||||
jsonw_end_array(jw_global);
|
||||
|
||||
if (tb[NDA_MASTER])
|
||||
jsonw_string_field(jw_global,
|
||||
"master",
|
||||
ll_index_to_name(rta_getattr_u32(tb[NDA_MASTER])));
|
||||
|
||||
} else {
|
||||
if (r->ndm_flags & NTF_SELF)
|
||||
fprintf(fp, "self ");
|
||||
if (r->ndm_flags & NTF_ROUTER)
|
||||
fprintf(fp, "router ");
|
||||
if (r->ndm_flags & NTF_EXT_LEARNED)
|
||||
fprintf(fp, "offload ");
|
||||
if (tb[NDA_MASTER]) {
|
||||
fprintf(fp, "master %s ",
|
||||
ll_index_to_name(rta_getattr_u32(tb[NDA_MASTER])));
|
||||
} else if (r->ndm_flags & NTF_MASTER) {
|
||||
fprintf(fp, "master ");
|
||||
}
|
||||
}
|
||||
|
||||
state_s = state_n2a(r->ndm_state);
|
||||
if (jw_global) {
|
||||
if (state_s[0])
|
||||
jsonw_string_field(jw_global, "state", state_s);
|
||||
|
||||
jsonw_end_object(jw_global);
|
||||
} else {
|
||||
fprintf(fp, "%s\n", state_s);
|
||||
|
||||
fflush(fp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -177,16 +289,15 @@ static int fdb_show(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ifinfomsg ifm;
|
||||
char buf[256];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.ifm.ifi_family = PF_BRIDGE,
|
||||
};
|
||||
|
||||
char *filter_dev = NULL;
|
||||
char *br = NULL;
|
||||
int msg_size = sizeof(struct ifinfomsg);
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.ifm.ifi_family = PF_BRIDGE;
|
||||
|
||||
while (argc > 0) {
|
||||
if ((strcmp(*argv, "brport") == 0) || strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
@ -233,10 +344,22 @@ static int fdb_show(int argc, char **argv)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
if (json_output) {
|
||||
jw_global = jsonw_new(stdout);
|
||||
if (!jw_global) {
|
||||
fprintf(stderr, "Error allocation json object\n");
|
||||
exit(1);
|
||||
}
|
||||
jsonw_start_array(jw_global);
|
||||
}
|
||||
if (rtnl_dump_filter(&rth, print_fdb, stdout) < 0) {
|
||||
fprintf(stderr, "Dump terminated\n");
|
||||
exit(1);
|
||||
}
|
||||
if (jw_global) {
|
||||
jsonw_end_array(jw_global);
|
||||
jsonw_destroy(&jw_global);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -247,7 +370,13 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ndmsg ndm;
|
||||
char buf[256];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.ndm.ndm_family = PF_BRIDGE,
|
||||
.ndm.ndm_state = NUD_NOARP,
|
||||
};
|
||||
char *addr = NULL;
|
||||
char *d = NULL;
|
||||
char abuf[ETH_ALEN];
|
||||
|
|
@ -259,14 +388,6 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
|
|||
char *endptr;
|
||||
short vid = -1;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.ndm.ndm_family = PF_BRIDGE;
|
||||
req.ndm.ndm_state = NUD_NOARP;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -255,7 +255,12 @@ static int brlink_modify(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ifinfomsg ifm;
|
||||
char buf[512];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_SETLINK,
|
||||
.ifm.ifi_family = PF_BRIDGE,
|
||||
};
|
||||
char *d = NULL;
|
||||
__s8 learning = -1;
|
||||
__s8 learning_sync = -1;
|
||||
|
|
@ -271,13 +276,6 @@ static int brlink_modify(int argc, char **argv)
|
|||
__u16 flags = 0;
|
||||
struct rtattr *nest;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_SETLINK;
|
||||
req.ifm.ifi_family = PF_BRIDGE;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
17
bridge/mdb.c
17
bridge/mdb.c
|
|
@ -234,19 +234,16 @@ static int mdb_modify(int cmd, int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct br_port_msg bpm;
|
||||
char buf[1024];
|
||||
} req;
|
||||
struct br_mdb_entry entry;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct br_port_msg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.bpm.family = PF_BRIDGE,
|
||||
};
|
||||
struct br_mdb_entry entry = {};
|
||||
char *d = NULL, *p = NULL, *grp = NULL;
|
||||
short vid = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&entry, 0, sizeof(entry));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct br_port_msg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.bpm.family = PF_BRIDGE;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
125
bridge/vlan.c
125
bridge/vlan.c
|
|
@ -7,6 +7,7 @@
|
|||
#include <netinet/in.h>
|
||||
#include <linux/if_bridge.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <json_writer.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libnetlink.h"
|
||||
|
|
@ -15,6 +16,8 @@
|
|||
|
||||
static unsigned int filter_index, filter_vlan;
|
||||
|
||||
json_writer_t *jw_global = NULL;
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: bridge vlan { add | del } vid VLAN_ID dev DEV [ pvid] [ untagged ]\n");
|
||||
|
|
@ -29,22 +32,19 @@ static int vlan_modify(int cmd, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ifinfomsg ifm;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = cmd,
|
||||
.ifm.ifi_family = PF_BRIDGE,
|
||||
};
|
||||
char *d = NULL;
|
||||
short vid = -1;
|
||||
short vid_end = -1;
|
||||
struct rtattr *afspec;
|
||||
struct bridge_vlan_info vinfo;
|
||||
struct bridge_vlan_info vinfo = {};
|
||||
unsigned short flags = 0;
|
||||
|
||||
memset(&vinfo, 0, sizeof(vinfo));
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.ifm.ifi_family = PF_BRIDGE;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
@ -158,6 +158,28 @@ static int filter_vlan_check(struct bridge_vlan_info *vinfo)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void print_vlan_port(FILE *fp, int ifi_index)
|
||||
{
|
||||
if (jw_global) {
|
||||
jsonw_pretty(jw_global, 1);
|
||||
jsonw_name(jw_global,
|
||||
ll_index_to_name(ifi_index));
|
||||
jsonw_start_array(jw_global);
|
||||
} else {
|
||||
fprintf(fp, "%s",
|
||||
ll_index_to_name(ifi_index));
|
||||
}
|
||||
}
|
||||
|
||||
static void start_json_vlan_flags_array(bool *vlan_flags)
|
||||
{
|
||||
if (*vlan_flags)
|
||||
return;
|
||||
jsonw_name(jw_global, "flags");
|
||||
jsonw_start_array(jw_global);
|
||||
*vlan_flags = true;
|
||||
}
|
||||
|
||||
static int print_vlan(const struct sockaddr_nl *who,
|
||||
struct nlmsghdr *n,
|
||||
void *arg)
|
||||
|
|
@ -166,6 +188,7 @@ static int print_vlan(const struct sockaddr_nl *who,
|
|||
struct ifinfomsg *ifm = NLMSG_DATA(n);
|
||||
int len = n->nlmsg_len;
|
||||
struct rtattr *tb[IFLA_MAX+1];
|
||||
bool vlan_flags;
|
||||
|
||||
if (n->nlmsg_type != RTM_NEWLINK) {
|
||||
fprintf(stderr, "Not RTM_NEWLINK: %08x %08x %08x\n",
|
||||
|
|
@ -199,7 +222,8 @@ static int print_vlan(const struct sockaddr_nl *who,
|
|||
__u16 last_vid_start = 0;
|
||||
|
||||
if (!filter_vlan)
|
||||
fprintf(fp, "%s", ll_index_to_name(ifm->ifi_index));
|
||||
print_vlan_port(fp, ifm->ifi_index);
|
||||
|
||||
for (i = RTA_DATA(list); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
|
||||
struct bridge_vlan_info *vinfo;
|
||||
int vcheck_ret;
|
||||
|
|
@ -218,20 +242,58 @@ static int print_vlan(const struct sockaddr_nl *who,
|
|||
continue;
|
||||
|
||||
if (filter_vlan)
|
||||
fprintf(fp, "%s",
|
||||
ll_index_to_name(ifm->ifi_index));
|
||||
fprintf(fp, "\t %hu", last_vid_start);
|
||||
if (last_vid_start != vinfo->vid)
|
||||
fprintf(fp, "-%hu", vinfo->vid);
|
||||
if (vinfo->flags & BRIDGE_VLAN_INFO_PVID)
|
||||
fprintf(fp, " PVID");
|
||||
if (vinfo->flags & BRIDGE_VLAN_INFO_UNTAGGED)
|
||||
fprintf(fp, " Egress Untagged");
|
||||
fprintf(fp, "\n");
|
||||
print_vlan_port(fp, ifm->ifi_index);
|
||||
if (jw_global) {
|
||||
jsonw_start_object(jw_global);
|
||||
jsonw_uint_field(jw_global, "vlan",
|
||||
last_vid_start);
|
||||
if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN)
|
||||
continue;
|
||||
} else {
|
||||
fprintf(fp, "\t %hu", last_vid_start);
|
||||
}
|
||||
if (last_vid_start != vinfo->vid) {
|
||||
if (jw_global)
|
||||
jsonw_uint_field(jw_global, "vlanEnd",
|
||||
vinfo->vid);
|
||||
else
|
||||
fprintf(fp, "-%hu", vinfo->vid);
|
||||
}
|
||||
if (vinfo->flags & BRIDGE_VLAN_INFO_PVID) {
|
||||
if (jw_global) {
|
||||
start_json_vlan_flags_array(&vlan_flags);
|
||||
jsonw_string(jw_global, "PVID");
|
||||
} else {
|
||||
fprintf(fp, " PVID");
|
||||
}
|
||||
}
|
||||
if (vinfo->flags & BRIDGE_VLAN_INFO_UNTAGGED) {
|
||||
if (jw_global) {
|
||||
start_json_vlan_flags_array(&vlan_flags);
|
||||
jsonw_string(jw_global,
|
||||
"Egress Untagged");
|
||||
} else {
|
||||
fprintf(fp, " Egress Untagged");
|
||||
}
|
||||
}
|
||||
if (vlan_flags) {
|
||||
jsonw_end_array(jw_global);
|
||||
vlan_flags = false;
|
||||
}
|
||||
|
||||
if (jw_global)
|
||||
jsonw_end_object(jw_global);
|
||||
else
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
if (!filter_vlan)
|
||||
fprintf(fp, "\n");
|
||||
if (!filter_vlan) {
|
||||
if (jw_global)
|
||||
jsonw_end_array(jw_global);
|
||||
else
|
||||
fprintf(fp, "\n");
|
||||
|
||||
}
|
||||
fflush(fp);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -271,12 +333,27 @@ static int vlan_show(int argc, char **argv)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
printf("port\tvlan ids\n");
|
||||
if (json_output) {
|
||||
jw_global = jsonw_new(stdout);
|
||||
if (!jw_global) {
|
||||
fprintf(stderr, "Error allocation json object\n");
|
||||
exit(1);
|
||||
}
|
||||
jsonw_start_object(jw_global);
|
||||
} else {
|
||||
printf("port\tvlan ids\n");
|
||||
}
|
||||
|
||||
if (rtnl_dump_filter(&rth, print_vlan, stdout) < 0) {
|
||||
fprintf(stderr, "Dump ternminated\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (jw_global) {
|
||||
jsonw_end_object(jw_global);
|
||||
jsonw_destroy(&jw_global);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
44
genl/ctrl.c
44
genl/ctrl.c
|
|
@ -42,23 +42,19 @@ static int usage(void)
|
|||
int genl_ctrl_resolve_family(const char *family)
|
||||
{
|
||||
struct rtnl_handle rth;
|
||||
struct nlmsghdr *nlh;
|
||||
struct genlmsghdr *ghdr;
|
||||
int ret = 0;
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct genlmsghdr g;
|
||||
char buf[4096];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
nlh = &req.n;
|
||||
nlh->nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);
|
||||
nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
|
||||
nlh->nlmsg_type = GENL_ID_CTRL;
|
||||
|
||||
ghdr = NLMSG_DATA(&req.n);
|
||||
ghdr->cmd = CTRL_CMD_GETFAMILY;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK,
|
||||
.n.nlmsg_type = GENL_ID_CTRL,
|
||||
.g.cmd = CTRL_CMD_GETFAMILY,
|
||||
};
|
||||
struct nlmsghdr *nlh = &req.n;
|
||||
struct genlmsghdr *ghdr = &req.g;
|
||||
|
||||
if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
|
||||
fprintf(stderr, "Cannot open generic netlink socket\n");
|
||||
|
|
@ -74,7 +70,6 @@ int genl_ctrl_resolve_family(const char *family)
|
|||
|
||||
{
|
||||
struct rtattr *tb[CTRL_ATTR_MAX + 1];
|
||||
struct genlmsghdr *ghdr = NLMSG_DATA(nlh);
|
||||
int len = nlh->nlmsg_len;
|
||||
struct rtattr *attrs;
|
||||
|
||||
|
|
@ -291,24 +286,19 @@ static int print_ctrl2(const struct sockaddr_nl *who,
|
|||
static int ctrl_list(int cmd, int argc, char **argv)
|
||||
{
|
||||
struct rtnl_handle rth;
|
||||
struct nlmsghdr *nlh;
|
||||
struct genlmsghdr *ghdr;
|
||||
int ret = -1;
|
||||
char d[GENL_NAMSIZ];
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct genlmsghdr g;
|
||||
char buf[4096];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
nlh = &req.n;
|
||||
nlh->nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);
|
||||
nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
|
||||
nlh->nlmsg_type = GENL_ID_CTRL;
|
||||
|
||||
ghdr = NLMSG_DATA(&req.n);
|
||||
ghdr->cmd = CTRL_CMD_GETFAMILY;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK,
|
||||
.n.nlmsg_type = GENL_ID_CTRL,
|
||||
.g.cmd = CTRL_CMD_GETFAMILY,
|
||||
};
|
||||
struct nlmsghdr *nlh = &req.n;
|
||||
|
||||
if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
|
||||
fprintf(stderr, "Cannot open generic netlink socket\n");
|
||||
|
|
|
|||
|
|
@ -86,9 +86,8 @@ reg:
|
|||
return f;
|
||||
|
||||
noexist:
|
||||
f = malloc(sizeof(*f));
|
||||
f = calloc(1, sizeof(*f));
|
||||
if (f) {
|
||||
memset(f, 0, sizeof(*f));
|
||||
strncpy(f->name, str, 15);
|
||||
f->parse_genlopt = parse_nofopt;
|
||||
f->print_genlopt = print_nofopt;
|
||||
|
|
|
|||
|
|
@ -135,9 +135,7 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
|
|||
static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
||||
{
|
||||
int count = 0;
|
||||
char medium[IFNAMSIZ];
|
||||
|
||||
memset(medium, 0, sizeof(medium));
|
||||
char medium[IFNAMSIZ] = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "mode") == 0) {
|
||||
|
|
@ -276,9 +274,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
|||
duparg2("name", *argv);
|
||||
strncpy(p->name, *argv, IFNAMSIZ - 1);
|
||||
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
||||
struct ip6_tnl_parm2 old_p;
|
||||
struct ip6_tnl_parm2 old_p = {};
|
||||
|
||||
memset(&old_p, 0, sizeof(old_p));
|
||||
if (tnl_get_ioctl(*argv, &old_p))
|
||||
return -1;
|
||||
*p = old_p;
|
||||
|
|
@ -351,7 +348,7 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p)
|
|||
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||
char name[IFNAMSIZ];
|
||||
int index, type;
|
||||
struct ip6_tnl_parm2 p1;
|
||||
struct ip6_tnl_parm2 p1 = {};
|
||||
char *ptr;
|
||||
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
|
@ -372,7 +369,6 @@ static int do_tunnels_list(struct ip6_tnl_parm2 *p)
|
|||
}
|
||||
if (type != ARPHRD_TUNNEL6 && type != ARPHRD_IP6GRE)
|
||||
continue;
|
||||
memset(&p1, 0, sizeof(p1));
|
||||
ip6_tnl_parm_init(&p1, 0);
|
||||
if (type == ARPHRD_IP6GRE)
|
||||
p1.proto = IPPROTO_GRE;
|
||||
|
|
|
|||
|
|
@ -173,13 +173,12 @@ static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1])
|
|||
if (tb[IFLA_TXQLEN])
|
||||
qlen = *(int *)RTA_DATA(tb[IFLA_TXQLEN]);
|
||||
else {
|
||||
struct ifreq ifr;
|
||||
struct ifreq ifr = {};
|
||||
int s = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
if (s < 0)
|
||||
return;
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
strcpy(ifr.ifr_name, rta_getattr_str(tb[IFLA_IFNAME]));
|
||||
if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) {
|
||||
fprintf(f, "ioctl(SIOCGIFTXQLEN) failed: %s\n", strerror(errno));
|
||||
|
|
@ -450,7 +449,7 @@ static void print_num(FILE *fp, unsigned int width, uint64_t count)
|
|||
|
||||
static void print_vf_stats64(FILE *fp, struct rtattr *vfstats)
|
||||
{
|
||||
struct rtattr *vf[IFLA_VF_STATS_MAX + 1] = {};
|
||||
struct rtattr *vf[IFLA_VF_STATS_MAX + 1];
|
||||
|
||||
if (vfstats->rta_type != IFLA_VF_STATS) {
|
||||
fprintf(stderr, "BUG: rta type is %d\n", vfstats->rta_type);
|
||||
|
|
@ -1037,10 +1036,8 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
|
|||
}
|
||||
if (filter.pfx.family) {
|
||||
if (rta_tb[IFA_LOCAL]) {
|
||||
inet_prefix dst;
|
||||
inet_prefix dst = { .family = ifa->ifa_family };
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
dst.family = ifa->ifa_family;
|
||||
memcpy(&dst.data, RTA_DATA(rta_tb[IFA_LOCAL]), RTA_PAYLOAD(rta_tb[IFA_LOCAL]));
|
||||
if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen))
|
||||
return 0;
|
||||
|
|
@ -1396,10 +1393,10 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo)
|
|||
tb[IFA_LOCAL] = tb[IFA_ADDRESS];
|
||||
|
||||
if (filter.pfx.family && tb[IFA_LOCAL]) {
|
||||
inet_prefix dst;
|
||||
inet_prefix dst = {
|
||||
.family = ifa->ifa_family
|
||||
};
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
dst.family = ifa->ifa_family;
|
||||
memcpy(&dst.data, RTA_DATA(tb[IFA_LOCAL]), RTA_PAYLOAD(tb[IFA_LOCAL]));
|
||||
if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen))
|
||||
continue;
|
||||
|
|
@ -1845,7 +1842,12 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ifaddrmsg ifa;
|
||||
char buf[256];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.ifa.ifa_family = preferred_family,
|
||||
};
|
||||
char *d = NULL;
|
||||
char *l = NULL;
|
||||
char *lcl_arg = NULL;
|
||||
|
|
@ -1860,16 +1862,8 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
|
|||
int scoped = 0;
|
||||
__u32 preferred_lft = INFINITY_LIFE_TIME;
|
||||
__u32 valid_lft = INFINITY_LIFE_TIME;
|
||||
struct ifa_cacheinfo cinfo;
|
||||
unsigned int ifa_flags = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST | flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.ifa.ifa_family = preferred_family;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "peer") == 0 ||
|
||||
strcmp(*argv, "remote") == 0) {
|
||||
|
|
@ -2026,6 +2020,8 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
|
|||
}
|
||||
|
||||
if (valid_lftp || preferred_lftp) {
|
||||
struct ifa_cacheinfo cinfo = {};
|
||||
|
||||
if (!valid_lft) {
|
||||
fprintf(stderr, "valid_lft is zero\n");
|
||||
return -1;
|
||||
|
|
@ -2035,7 +2031,6 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&cinfo, 0, sizeof(cinfo));
|
||||
cinfo.ifa_prefered = preferred_lft;
|
||||
cinfo.ifa_valid = valid_lft;
|
||||
addattr_l(&req.n, sizeof(req), IFA_CACHEINFO, &cinfo,
|
||||
|
|
|
|||
|
|
@ -127,23 +127,18 @@ static int ipaddrlabel_modify(int cmd, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ifaddrlblmsg ifal;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_type = cmd,
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrlblmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.ifal.ifal_family = preferred_family,
|
||||
};
|
||||
|
||||
inet_prefix prefix;
|
||||
inet_prefix prefix = {};
|
||||
uint32_t label = 0xffffffffUL;
|
||||
char *p = NULL;
|
||||
char *l = NULL;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&prefix, 0, sizeof(prefix));
|
||||
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrlblmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.ifal.ifal_family = preferred_family;
|
||||
req.ifal.ifal_prefixlen = 0;
|
||||
req.ifal.ifal_index = 0;
|
||||
|
||||
if (cmd == RTM_NEWADDRLABEL) {
|
||||
req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
|
||||
}
|
||||
|
|
|
|||
65
ip/iplink.c
65
ip/iplink.c
|
|
@ -55,7 +55,9 @@ void iplink_usage(void)
|
|||
fprintf(stderr, " type TYPE [ ARGS ]\n");
|
||||
fprintf(stderr, " ip link delete { DEVICE | dev DEVICE | group DEVGROUP } type TYPE [ ARGS ]\n");
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, " ip link set { DEVICE | dev DEVICE | group DEVGROUP } [ { up | down } ]\n");
|
||||
fprintf(stderr, " ip link set { DEVICE | dev DEVICE | group DEVGROUP }\n");
|
||||
fprintf(stderr, " [ { up | down } ]\n");
|
||||
fprintf(stderr, " [ type TYPE ARGS ]\n");
|
||||
} else
|
||||
fprintf(stderr, "Usage: ip link set DEVICE [ { up | down } ]\n");
|
||||
|
||||
|
|
@ -206,16 +208,14 @@ static int iplink_have_newlink(void)
|
|||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK,
|
||||
.n.nlmsg_type = RTM_NEWLINK,
|
||||
.i.ifi_family = AF_UNSPEC,
|
||||
};
|
||||
|
||||
if (have_rtnl_newlink < 0) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
|
||||
req.n.nlmsg_type = RTM_NEWLINK;
|
||||
req.i.ifi_family = AF_UNSPEC;
|
||||
|
||||
if (rtnl_send(&rth, &req.n, req.n.nlmsg_len) < 0) {
|
||||
perror("request send failed");
|
||||
exit(1);
|
||||
|
|
@ -781,16 +781,14 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
int index = -1;
|
||||
int group;
|
||||
struct link_util *lu = NULL;
|
||||
struct iplink_req req;
|
||||
struct iplink_req req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.i.ifi_family = preferred_family,
|
||||
};
|
||||
int ret;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.i.ifi_family = preferred_family;
|
||||
|
||||
ret = iplink_parse(argc, argv,
|
||||
&req, &name, &type, &link, &dev, &group, &index);
|
||||
if (ret < 0)
|
||||
|
|
@ -923,19 +921,17 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
||||
{
|
||||
int len;
|
||||
struct iplink_req req;
|
||||
struct iplink_req req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
};
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
char buf[16384];
|
||||
} answer;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
|
||||
if (name) {
|
||||
len = strlen(name) + 1;
|
||||
if (len == 1)
|
||||
|
|
@ -1029,16 +1025,14 @@ static int do_changename(const char *dev, const char *newdev)
|
|||
|
||||
static int set_qlen(const char *dev, int qlen)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
struct ifreq ifr = { .ifr_qlen = qlen };
|
||||
int s;
|
||||
|
||||
s = get_ctl_fd();
|
||||
if (s < 0)
|
||||
return -1;
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
|
||||
ifr.ifr_qlen = qlen;
|
||||
if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) {
|
||||
perror("SIOCSIFXQLEN");
|
||||
close(s);
|
||||
|
|
@ -1051,16 +1045,14 @@ static int set_qlen(const char *dev, int qlen)
|
|||
|
||||
static int set_mtu(const char *dev, int mtu)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
struct ifreq ifr = { .ifr_mtu = mtu };
|
||||
int s;
|
||||
|
||||
s = get_ctl_fd();
|
||||
if (s < 0)
|
||||
return -1;
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
|
||||
ifr.ifr_mtu = mtu;
|
||||
if (ioctl(s, SIOCSIFMTU, &ifr) < 0) {
|
||||
perror("SIOCSIFMTU");
|
||||
close(s);
|
||||
|
|
@ -1073,8 +1065,11 @@ static int set_mtu(const char *dev, int mtu)
|
|||
|
||||
static int get_address(const char *dev, int *htype)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
struct sockaddr_ll me;
|
||||
struct ifreq ifr = {};
|
||||
struct sockaddr_ll me = {
|
||||
.sll_family = AF_PACKET,
|
||||
.sll_protocol = htons(ETH_P_LOOP),
|
||||
};
|
||||
socklen_t alen;
|
||||
int s;
|
||||
|
||||
|
|
@ -1084,7 +1079,6 @@ static int get_address(const char *dev, int *htype)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
|
||||
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
|
||||
perror("SIOCGIFINDEX");
|
||||
|
|
@ -1092,10 +1086,7 @@ static int get_address(const char *dev, int *htype)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&me, 0, sizeof(me));
|
||||
me.sll_family = AF_PACKET;
|
||||
me.sll_ifindex = ifr.ifr_ifindex;
|
||||
me.sll_protocol = htons(ETH_P_LOOP);
|
||||
if (bind(s, (struct sockaddr *)&me, sizeof(me)) == -1) {
|
||||
perror("bind");
|
||||
close(s);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,16 @@
|
|||
#include "utils.h"
|
||||
#include "ip_common.h"
|
||||
|
||||
static void print_explain(FILE *f)
|
||||
{
|
||||
fprintf(f, "Usage: ... bond_slave [ queue_id ID ]\n");
|
||||
}
|
||||
|
||||
static void explain(void)
|
||||
{
|
||||
print_explain(stderr);
|
||||
}
|
||||
|
||||
static const char *slave_states[] = {
|
||||
[BOND_STATE_ACTIVE] = "ACTIVE",
|
||||
[BOND_STATE_BACKUP] = "BACKUP",
|
||||
|
|
@ -99,6 +109,13 @@ static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
if (get_u16(&queue_id, *argv, 0))
|
||||
invarg("queue_id is invalid", *argv);
|
||||
addattr16(n, 1024, IFLA_BOND_SLAVE_QUEUE_ID, queue_id);
|
||||
} else {
|
||||
if (matches(*argv, "help") != 0)
|
||||
fprintf(stderr,
|
||||
"bond_slave: unknown option \"%s\"?\n",
|
||||
*argv);
|
||||
explain();
|
||||
return -1;
|
||||
}
|
||||
argc--, argv++;
|
||||
}
|
||||
|
|
@ -106,10 +123,17 @@ static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bond_slave_print_help(struct link_util *lu, int argc, char **argv,
|
||||
FILE *f)
|
||||
{
|
||||
print_explain(f);
|
||||
}
|
||||
|
||||
struct link_util bond_slave_link_util = {
|
||||
.id = "bond",
|
||||
.maxattr = IFLA_BOND_SLAVE_MAX,
|
||||
.print_opt = bond_slave_print_opt,
|
||||
.parse_opt = bond_slave_parse_opt,
|
||||
.print_help = bond_slave_print_help,
|
||||
.slave = true,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -110,11 +110,9 @@ static void print_ctrlmode(FILE *f, __u32 cm)
|
|||
static int can_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct can_bittiming bt, dbt;
|
||||
struct can_bittiming bt = {}, dbt = {};
|
||||
struct can_ctrlmode cm = {0, 0};
|
||||
|
||||
memset(&bt, 0, sizeof(bt));
|
||||
memset(&dbt, 0, sizeof(dbt));
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "bitrate") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
25
ip/ipmaddr.c
25
ip/ipmaddr.c
|
|
@ -93,18 +93,15 @@ static void read_dev_mcast(struct ma_info **result_p)
|
|||
|
||||
while (fgets(buf, sizeof(buf), fp)) {
|
||||
char hexa[256];
|
||||
struct ma_info m;
|
||||
struct ma_info m = { .addr.family = AF_PACKET };
|
||||
int len;
|
||||
int st;
|
||||
|
||||
memset(&m, 0, sizeof(m));
|
||||
sscanf(buf, "%d%s%d%d%s", &m.index, m.name, &m.users, &st,
|
||||
hexa);
|
||||
if (filter.dev && strcmp(filter.dev, m.name))
|
||||
continue;
|
||||
|
||||
m.addr.family = AF_PACKET;
|
||||
|
||||
len = parse_hex(hexa, (unsigned char *)&m.addr.data, sizeof(m.addr.data));
|
||||
if (len >= 0) {
|
||||
struct ma_info *ma = malloc(sizeof(m));
|
||||
|
|
@ -122,22 +119,21 @@ static void read_dev_mcast(struct ma_info **result_p)
|
|||
|
||||
static void read_igmp(struct ma_info **result_p)
|
||||
{
|
||||
struct ma_info m;
|
||||
struct ma_info m = {
|
||||
.addr.family = AF_INET,
|
||||
.addr.bitlen = 32,
|
||||
.addr.bytelen = 4,
|
||||
};
|
||||
char buf[256];
|
||||
FILE *fp = fopen("/proc/net/igmp", "r");
|
||||
|
||||
if (!fp)
|
||||
return;
|
||||
memset(&m, 0, sizeof(m));
|
||||
if (!fgets(buf, sizeof(buf), fp)) {
|
||||
fclose(fp);
|
||||
return;
|
||||
}
|
||||
|
||||
m.addr.family = AF_INET;
|
||||
m.addr.bitlen = 32;
|
||||
m.addr.bytelen = 4;
|
||||
|
||||
while (fgets(buf, sizeof(buf), fp)) {
|
||||
struct ma_info *ma;
|
||||
|
||||
|
|
@ -169,17 +165,14 @@ static void read_igmp6(struct ma_info **result_p)
|
|||
|
||||
while (fgets(buf, sizeof(buf), fp)) {
|
||||
char hexa[256];
|
||||
struct ma_info m;
|
||||
struct ma_info m = { .addr.family = AF_INET6 };
|
||||
int len;
|
||||
|
||||
memset(&m, 0, sizeof(m));
|
||||
sscanf(buf, "%d%s%s%d", &m.index, m.name, hexa, &m.users);
|
||||
|
||||
if (filter.dev && strcmp(filter.dev, m.name))
|
||||
continue;
|
||||
|
||||
m.addr.family = AF_INET6;
|
||||
|
||||
len = parse_hex(hexa, (unsigned char *)&m.addr.data, sizeof(m.addr.data));
|
||||
if (len >= 0) {
|
||||
struct ma_info *ma = malloc(sizeof(m));
|
||||
|
|
@ -274,11 +267,9 @@ static int multiaddr_list(int argc, char **argv)
|
|||
|
||||
static int multiaddr_modify(int cmd, int argc, char **argv)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
struct ifreq ifr = {};
|
||||
int fd;
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
|
||||
if (cmd == RTM_NEWADDR)
|
||||
cmd = SIOCADDMULTI;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -97,20 +97,16 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
return 0;
|
||||
|
||||
if (tb[RTA_DST] && filter.mdst.bitlen > 0) {
|
||||
inet_prefix dst;
|
||||
inet_prefix dst = { .family = r->rtm_family };
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
dst.family = r->rtm_family;
|
||||
memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), RTA_PAYLOAD(tb[RTA_DST]));
|
||||
if (inet_addr_match(&dst, &filter.mdst, filter.mdst.bitlen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tb[RTA_SRC] && filter.msrc.bitlen > 0) {
|
||||
inet_prefix src;
|
||||
inet_prefix src = { .family = r->rtm_family };
|
||||
|
||||
memset(&src, 0, sizeof(src));
|
||||
src.family = r->rtm_family;
|
||||
memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), RTA_PAYLOAD(tb[RTA_SRC]));
|
||||
if (inet_addr_match(&src, &filter.msrc, filter.msrc.bitlen))
|
||||
return 0;
|
||||
|
|
|
|||
30
ip/ipneigh.c
30
ip/ipneigh.c
|
|
@ -101,7 +101,13 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ndmsg ndm;
|
||||
char buf[256];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.ndm.ndm_family = preferred_family,
|
||||
.ndm.ndm_state = NUD_PERMANENT,
|
||||
};
|
||||
char *dev = NULL;
|
||||
int dst_ok = 0;
|
||||
int dev_ok = 0;
|
||||
|
|
@ -109,14 +115,6 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
|
|||
char *lla = NULL;
|
||||
inet_prefix dst;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.ndm.ndm_family = preferred_family;
|
||||
req.ndm.ndm_state = NUD_PERMANENT;
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "lladdr") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
@ -239,10 +237,8 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|||
|
||||
if (tb[NDA_DST]) {
|
||||
if (filter.pfx.family) {
|
||||
inet_prefix dst;
|
||||
inet_prefix dst = { .family = r->ndm_family };
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
dst.family = r->ndm_family;
|
||||
memcpy(&dst.data, RTA_DATA(tb[NDA_DST]), RTA_PAYLOAD(tb[NDA_DST]));
|
||||
if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen))
|
||||
return 0;
|
||||
|
|
@ -348,15 +344,13 @@ static int do_show_or_flush(int argc, char **argv, int flush)
|
|||
struct nlmsghdr n;
|
||||
struct ndmsg ndm;
|
||||
char buf[256];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_type = RTM_GETNEIGH,
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)),
|
||||
};
|
||||
char *filter_dev = NULL;
|
||||
int state_given = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_type = RTM_GETNEIGH;
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
|
||||
|
||||
ipneigh_reset_filter(0);
|
||||
|
||||
if (!filter.family)
|
||||
|
|
|
|||
|
|
@ -154,7 +154,11 @@ static int do_show(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct netconfmsg ncm;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct netconfmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK,
|
||||
.n.nlmsg_type = RTM_GETNETCONF,
|
||||
};
|
||||
|
||||
ipnetconf_reset_filter(0);
|
||||
filter.family = preferred_family;
|
||||
|
|
@ -176,10 +180,6 @@ static int do_show(int argc, char **argv)
|
|||
|
||||
ll_init_map(&rth);
|
||||
if (filter.ifindex) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct netconfmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
|
||||
req.n.nlmsg_type = RTM_GETNETCONF;
|
||||
req.ncm.ncm_family = filter.family;
|
||||
if (filter.ifindex)
|
||||
addattr_l(&req.n, sizeof(req), NETCONFA_IFINDEX,
|
||||
|
|
|
|||
39
ip/ipnetns.c
39
ip/ipnetns.c
|
|
@ -61,16 +61,15 @@ static int ipnetns_have_nsid(void)
|
|||
struct nlmsghdr n;
|
||||
struct rtgenmsg g;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETNSID,
|
||||
.g.rtgen_family = AF_UNSPEC,
|
||||
};
|
||||
int fd;
|
||||
|
||||
if (have_rtnl_getnsid < 0) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETNSID;
|
||||
req.g.rtgen_family = AF_UNSPEC;
|
||||
|
||||
fd = open("/proc/self/ns/net", O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror("open(\"/proc/self/ns/net\")");
|
||||
|
|
@ -96,17 +95,16 @@ static int get_netnsid_from_name(const char *name)
|
|||
struct nlmsghdr n;
|
||||
struct rtgenmsg g;
|
||||
char buf[1024];
|
||||
} req, answer;
|
||||
} answer, req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETNSID,
|
||||
.g.rtgen_family = AF_UNSPEC,
|
||||
};
|
||||
struct rtattr *tb[NETNSA_MAX + 1];
|
||||
struct rtgenmsg *rthdr;
|
||||
int len, fd;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETNSID;
|
||||
req.g.rtgen_family = AF_UNSPEC;
|
||||
|
||||
fd = netns_get_fd(name);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
|
@ -685,15 +683,14 @@ static int set_netnsid_from_name(const char *name, int nsid)
|
|||
struct nlmsghdr n;
|
||||
struct rtgenmsg g;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_NEWNSID,
|
||||
.g.rtgen_family = AF_UNSPEC,
|
||||
};
|
||||
int fd, err = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_NEWNSID;
|
||||
req.g.rtgen_family = AF_UNSPEC;
|
||||
|
||||
fd = netns_get_fd(name);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
|
|
|||
|
|
@ -66,26 +66,19 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct ndtmsg ndtm;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndtmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.ndtm.ndtm_family = preferred_family,
|
||||
};
|
||||
char *namep = NULL;
|
||||
char *threshsp = NULL;
|
||||
char *gc_intp = NULL;
|
||||
char parms_buf[1024];
|
||||
char parms_buf[1024] = {};
|
||||
struct rtattr *parms_rta = (struct rtattr *)parms_buf;
|
||||
int parms_change = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndtmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
|
||||
req.ndtm.ndtm_family = preferred_family;
|
||||
req.ndtm.ndtm_pad1 = 0;
|
||||
req.ndtm.ndtm_pad2 = 0;
|
||||
|
||||
memset(&parms_buf, 0, sizeof(parms_buf));
|
||||
|
||||
parms_rta->rta_type = NDTA_PARMS;
|
||||
parms_rta->rta_len = RTA_LENGTH(0);
|
||||
|
||||
|
|
@ -322,15 +315,13 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv)
|
|||
static const char *ntable_strtime_delta(__u32 msec)
|
||||
{
|
||||
static char str[32];
|
||||
struct timeval now;
|
||||
struct timeval now = {};
|
||||
time_t t;
|
||||
struct tm *tp;
|
||||
|
||||
if (msec == 0)
|
||||
goto error;
|
||||
|
||||
memset(&now, 0, sizeof(now));
|
||||
|
||||
if (gettimeofday(&now, NULL) < 0) {
|
||||
perror("gettimeofday");
|
||||
goto error;
|
||||
|
|
|
|||
78
ip/iproute.c
78
ip/iproute.c
|
|
@ -140,10 +140,10 @@ static int flush_update(void)
|
|||
static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
|
||||
{
|
||||
struct rtmsg *r = NLMSG_DATA(n);
|
||||
inet_prefix dst;
|
||||
inet_prefix src;
|
||||
inet_prefix via;
|
||||
inet_prefix prefsrc;
|
||||
inet_prefix dst = { .family = r->rtm_family };
|
||||
inet_prefix src = { .family = r->rtm_family };
|
||||
inet_prefix via = { .family = r->rtm_family };
|
||||
inet_prefix prefsrc = { .family = r->rtm_family };
|
||||
__u32 table;
|
||||
static int ip6_multiple_tables;
|
||||
|
||||
|
|
@ -211,19 +211,13 @@ static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
|
|||
if (filter.rprefsrc.family && r->rtm_family != filter.rprefsrc.family)
|
||||
return 0;
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
dst.family = r->rtm_family;
|
||||
if (tb[RTA_DST])
|
||||
memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8);
|
||||
if (filter.rsrc.family || filter.msrc.family) {
|
||||
memset(&src, 0, sizeof(src));
|
||||
src.family = r->rtm_family;
|
||||
if (tb[RTA_SRC])
|
||||
memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), (r->rtm_src_len+7)/8);
|
||||
}
|
||||
if (filter.rvia.bitlen > 0) {
|
||||
memset(&via, 0, sizeof(via));
|
||||
via.family = r->rtm_family;
|
||||
if (tb[RTA_GATEWAY])
|
||||
memcpy(&via.data, RTA_DATA(tb[RTA_GATEWAY]), host_len/8);
|
||||
if (tb[RTA_VIA]) {
|
||||
|
|
@ -235,8 +229,6 @@ static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
|
|||
}
|
||||
}
|
||||
if (filter.rprefsrc.bitlen > 0) {
|
||||
memset(&prefsrc, 0, sizeof(prefsrc));
|
||||
prefsrc.family = r->rtm_family;
|
||||
if (tb[RTA_PREFSRC])
|
||||
memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), host_len/8);
|
||||
}
|
||||
|
|
@ -829,7 +821,14 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct rtmsg r;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.r.rtm_family = preferred_family,
|
||||
.r.rtm_table = RT_TABLE_MAIN,
|
||||
.r.rtm_scope = RT_SCOPE_NOWHERE,
|
||||
};
|
||||
char mxbuf[256];
|
||||
struct rtattr *mxrta = (void *)mxbuf;
|
||||
unsigned int mxlock = 0;
|
||||
|
|
@ -842,15 +841,6 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
int raw = 0;
|
||||
int type_ok = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.r.rtm_family = preferred_family;
|
||||
req.r.rtm_table = RT_TABLE_MAIN;
|
||||
req.r.rtm_scope = RT_SCOPE_NOWHERE;
|
||||
|
||||
if (cmd != RTM_DELROUTE) {
|
||||
req.r.rtm_protocol = RTPROT_BOOT;
|
||||
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
|
||||
|
|
@ -1277,20 +1267,15 @@ static int rtnl_rtcache_request(struct rtnl_handle *rth, int family)
|
|||
struct {
|
||||
struct nlmsghdr nlh;
|
||||
struct rtmsg rtm;
|
||||
} req;
|
||||
struct sockaddr_nl nladdr;
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
memset(&req, 0, sizeof(req));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
|
||||
req.nlh.nlmsg_len = sizeof(req);
|
||||
req.nlh.nlmsg_type = RTM_GETROUTE;
|
||||
req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_REQUEST;
|
||||
req.nlh.nlmsg_pid = 0;
|
||||
req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
|
||||
req.rtm.rtm_family = family;
|
||||
req.rtm.rtm_flags |= RTM_F_CLONED;
|
||||
} req = {
|
||||
.nlh.nlmsg_len = sizeof(req),
|
||||
.nlh.nlmsg_type = RTM_GETROUTE,
|
||||
.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST,
|
||||
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
|
||||
.rtm.rtm_family = family,
|
||||
.rtm.rtm_flags = RTM_F_CLONED,
|
||||
};
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
|
||||
return sendto(rth->fd, (void *)&req, sizeof(req), 0, (struct sockaddr *)&nladdr, sizeof(nladdr));
|
||||
}
|
||||
|
|
@ -1641,30 +1626,21 @@ static int iproute_get(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct rtmsg r;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETROUTE,
|
||||
.r.rtm_family = preferred_family,
|
||||
};
|
||||
char *idev = NULL;
|
||||
char *odev = NULL;
|
||||
int connected = 0;
|
||||
int from_ok = 0;
|
||||
unsigned int mark = 0;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
iproute_reset_filter(0);
|
||||
filter.cloned = 2;
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETROUTE;
|
||||
req.r.rtm_family = preferred_family;
|
||||
req.r.rtm_table = 0;
|
||||
req.r.rtm_protocol = 0;
|
||||
req.r.rtm_scope = 0;
|
||||
req.r.rtm_type = 0;
|
||||
req.r.rtm_src_len = 0;
|
||||
req.r.rtm_dst_len = 0;
|
||||
req.r.rtm_tos = 0;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "tos") == 0 ||
|
||||
matches(*argv, "dsfield") == 0) {
|
||||
|
|
|
|||
22
ip/iprule.c
22
ip/iprule.c
|
|
@ -331,19 +331,15 @@ static int iprule_modify(int cmd, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct rtmsg r;
|
||||
char buf[1024];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.r.rtm_family = preferred_family;
|
||||
req.r.rtm_protocol = RTPROT_BOOT;
|
||||
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
|
||||
req.r.rtm_table = 0;
|
||||
req.r.rtm_type = RTN_UNSPEC;
|
||||
req.r.rtm_flags = 0;
|
||||
} req = {
|
||||
.n.nlmsg_type = cmd,
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.r.rtm_family = preferred_family,
|
||||
.r.rtm_protocol = RTPROT_BOOT,
|
||||
.r.rtm_scope = RT_SCOPE_UNIVERSE,
|
||||
.r.rtm_type = RTN_UNSPEC,
|
||||
};
|
||||
|
||||
if (cmd == RTM_NEWRULE) {
|
||||
req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
|
||||
|
|
|
|||
19
ip/iptoken.c
19
ip/iptoken.c
|
|
@ -89,10 +89,7 @@ static int print_token(const struct sockaddr_nl *who, struct nlmsghdr *n, void *
|
|||
static int iptoken_list(int argc, char **argv)
|
||||
{
|
||||
int af = AF_INET6;
|
||||
struct rtnl_dump_args da;
|
||||
|
||||
memset(&da, 0, sizeof(da));
|
||||
da.fp = stdout;
|
||||
struct rtnl_dump_args da = { .fp = stdout };
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
|
|
@ -123,18 +120,16 @@ static int iptoken_set(int argc, char **argv, bool delete)
|
|||
struct nlmsghdr n;
|
||||
struct ifinfomsg ifi;
|
||||
char buf[512];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_SETLINK,
|
||||
.ifi.ifi_family = AF_INET6,
|
||||
};
|
||||
struct rtattr *afs, *afs6;
|
||||
bool have_token = delete, have_dev = false;
|
||||
inet_prefix addr = { .bytelen = 16, };
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_SETLINK;
|
||||
req.ifi.ifi_family = AF_INET6;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -60,12 +60,10 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto)
|
|||
static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
||||
{
|
||||
int count = 0;
|
||||
char medium[IFNAMSIZ];
|
||||
char medium[IFNAMSIZ] = {};
|
||||
int isatap = 0;
|
||||
|
||||
memset(p, 0, sizeof(*p));
|
||||
memset(&medium, 0, sizeof(medium));
|
||||
|
||||
p->iph.version = 4;
|
||||
p->iph.ihl = 5;
|
||||
#ifndef IP_DF
|
||||
|
|
@ -182,9 +180,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
|||
duparg2("name", *argv);
|
||||
strncpy(p->name, *argv, IFNAMSIZ - 1);
|
||||
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
||||
struct ip_tunnel_parm old_p;
|
||||
struct ip_tunnel_parm old_p = {};
|
||||
|
||||
memset(&old_p, 0, sizeof(old_p));
|
||||
if (tnl_get_ioctl(*argv, &old_p))
|
||||
return -1;
|
||||
*p = old_p;
|
||||
|
|
@ -296,12 +293,10 @@ static int do_del(int argc, char **argv)
|
|||
|
||||
static void print_tunnel(struct ip_tunnel_parm *p)
|
||||
{
|
||||
struct ip_tunnel_6rd ip6rd;
|
||||
struct ip_tunnel_6rd ip6rd = {};
|
||||
char s1[1024];
|
||||
char s2[1024];
|
||||
|
||||
memset(&ip6rd, 0, sizeof(ip6rd));
|
||||
|
||||
/* Do not use format_host() for local addr,
|
||||
* symbolic name will not be useful.
|
||||
*/
|
||||
|
|
@ -312,10 +307,9 @@ static void print_tunnel(struct ip_tunnel_parm *p)
|
|||
p->iph.saddr ? rt_addr_n2a_r(AF_INET, 4, &p->iph.saddr, s2, sizeof(s2)) : "any");
|
||||
|
||||
if (p->iph.protocol == IPPROTO_IPV6 && (p->i_flags & SIT_ISATAP)) {
|
||||
struct ip_tunnel_prl prl[16];
|
||||
struct ip_tunnel_prl prl[16] = {};
|
||||
int i;
|
||||
|
||||
memset(prl, 0, sizeof(prl));
|
||||
prl[0].datalen = sizeof(prl) - sizeof(prl[0]);
|
||||
prl[0].addr = htonl(INADDR_ANY);
|
||||
|
||||
|
|
@ -405,7 +399,7 @@ static int do_tunnels_list(struct ip_tunnel_parm *p)
|
|||
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||
char name[IFNAMSIZ];
|
||||
int index, type;
|
||||
struct ip_tunnel_parm p1;
|
||||
struct ip_tunnel_parm p1 = {};
|
||||
char *ptr;
|
||||
|
||||
buf[sizeof(buf) - 1] = 0;
|
||||
|
|
@ -427,7 +421,6 @@ static int do_tunnels_list(struct ip_tunnel_parm *p)
|
|||
}
|
||||
if (type != ARPHRD_TUNNEL && type != ARPHRD_IPGRE && type != ARPHRD_SIT)
|
||||
continue;
|
||||
memset(&p1, 0, sizeof(p1));
|
||||
if (tnl_get_ioctl(name, &p1))
|
||||
continue;
|
||||
if ((p->link && p1.link != p->link) ||
|
||||
|
|
@ -470,14 +463,11 @@ static int do_show(int argc, char **argv)
|
|||
|
||||
static int do_prl(int argc, char **argv)
|
||||
{
|
||||
struct ip_tunnel_prl p;
|
||||
struct ip_tunnel_prl p = {};
|
||||
int count = 0;
|
||||
int devname = 0;
|
||||
int cmd = 0;
|
||||
char medium[IFNAMSIZ];
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
memset(&medium, 0, sizeof(medium));
|
||||
char medium[IFNAMSIZ] = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "prl-default") == 0) {
|
||||
|
|
@ -522,15 +512,12 @@ static int do_prl(int argc, char **argv)
|
|||
|
||||
static int do_6rd(int argc, char **argv)
|
||||
{
|
||||
struct ip_tunnel_6rd ip6rd;
|
||||
struct ip_tunnel_6rd ip6rd = {};
|
||||
int devname = 0;
|
||||
int cmd = 0;
|
||||
char medium[IFNAMSIZ];
|
||||
char medium[IFNAMSIZ] = {};
|
||||
inet_prefix prefix;
|
||||
|
||||
memset(&ip6rd, 0, sizeof(ip6rd));
|
||||
memset(&medium, 0, sizeof(medium));
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "6rd-prefix") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
26
ip/ipxfrm.c
26
ip/ipxfrm.c
|
|
@ -867,9 +867,7 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
|
|||
|
||||
static int xfrm_selector_iszero(struct xfrm_selector *s)
|
||||
{
|
||||
struct xfrm_selector s0;
|
||||
|
||||
memset(&s0, 0, sizeof(s0));
|
||||
struct xfrm_selector s0 = {};
|
||||
|
||||
return (memcmp(&s0, s, sizeof(s0)) == 0);
|
||||
}
|
||||
|
|
@ -878,11 +876,9 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
|
|||
struct rtattr *tb[], FILE *fp, const char *prefix,
|
||||
const char *title)
|
||||
{
|
||||
char buf[STRBUF_SIZE];
|
||||
char buf[STRBUF_SIZE] = {};
|
||||
int force_spi = xfrm_xfrmproto_is_ipsec(xsinfo->id.proto);
|
||||
|
||||
memset(buf, '\0', sizeof(buf));
|
||||
|
||||
xfrm_id_info_print(&xsinfo->saddr, &xsinfo->id, xsinfo->mode,
|
||||
xsinfo->reqid, xsinfo->family, force_spi, fp,
|
||||
prefix, title);
|
||||
|
|
@ -959,9 +955,7 @@ void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo,
|
|||
struct rtattr *tb[], FILE *fp, const char *prefix,
|
||||
const char *title)
|
||||
{
|
||||
char buf[STRBUF_SIZE];
|
||||
|
||||
memset(buf, '\0', sizeof(buf));
|
||||
char buf[STRBUF_SIZE] = {};
|
||||
|
||||
xfrm_selector_print(&xpinfo->sel, preferred_family, fp, title);
|
||||
|
||||
|
|
@ -1062,11 +1056,8 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
|
|||
{
|
||||
int argc = *argcp;
|
||||
char **argv = *argvp;
|
||||
inet_prefix dst;
|
||||
inet_prefix src;
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
memset(&src, 0, sizeof(src));
|
||||
inet_prefix dst = {};
|
||||
inet_prefix src = {};
|
||||
|
||||
while (1) {
|
||||
if (strcmp(*argv, "src") == 0) {
|
||||
|
|
@ -1371,13 +1362,10 @@ int xfrm_selector_parse(struct xfrm_selector *sel, int *argcp, char ***argvp)
|
|||
{
|
||||
int argc = *argcp;
|
||||
char **argv = *argvp;
|
||||
inet_prefix dst;
|
||||
inet_prefix src;
|
||||
inet_prefix dst = {};
|
||||
inet_prefix src = {};
|
||||
char *upspecp = NULL;
|
||||
|
||||
memset(&dst, 0, sizeof(dst));
|
||||
memset(&src, 0, sizeof(src));
|
||||
|
||||
while (1) {
|
||||
if (strcmp(*argv, "src") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -50,12 +50,18 @@ static void usage(void)
|
|||
static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[16384];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *greinfo[IFLA_GRE_MAX + 1];
|
||||
|
|
@ -77,14 +83,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
__u8 metadata = 0;
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -60,12 +60,18 @@ static void usage(void)
|
|||
static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[1024];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *greinfo[IFLA_GRE_MAX + 1];
|
||||
|
|
@ -83,14 +89,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
int len;
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -58,18 +58,24 @@ static void usage(void)
|
|||
static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[2048];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1];
|
||||
int len;
|
||||
struct in6_addr laddr;
|
||||
struct in6_addr raddr;
|
||||
struct in6_addr laddr = {};
|
||||
struct in6_addr raddr = {};
|
||||
__u8 hop_limit = DEFAULT_TNL_HOP_LIMIT;
|
||||
__u8 encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT;
|
||||
__u32 flowinfo = 0;
|
||||
|
|
@ -77,18 +83,7 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
__u32 link = 0;
|
||||
__u8 proto = 0;
|
||||
|
||||
memset(&laddr, 0, sizeof(laddr));
|
||||
memset(&raddr, 0, sizeof(raddr));
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -53,12 +53,18 @@ static void usage(int sit)
|
|||
static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[2048];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1];
|
||||
|
|
@ -71,7 +77,7 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
__u8 pmtudisc = 1;
|
||||
__u16 iflags = 0;
|
||||
__u8 proto = 0;
|
||||
struct in6_addr ip6rdprefix;
|
||||
struct in6_addr ip6rdprefix = {};
|
||||
__u16 ip6rdprefixlen = 0;
|
||||
__u32 ip6rdrelayprefix = 0;
|
||||
__u16 ip6rdrelayprefixlen = 0;
|
||||
|
|
@ -80,17 +86,7 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
__u16 encapsport = 0;
|
||||
__u16 encapdport = 0;
|
||||
|
||||
memset(&ip6rdprefix, 0, sizeof(ip6rdprefix));
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -46,12 +46,18 @@ static void usage(void)
|
|||
static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[1024];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
|
||||
|
|
@ -63,14 +69,6 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
int len;
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -42,12 +42,18 @@ static void usage(void)
|
|||
static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg i;
|
||||
char buf[1024];
|
||||
} req;
|
||||
struct ifinfomsg *ifi = (struct ifinfomsg *)(n + 1);
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
.i.ifi_family = preferred_family,
|
||||
.i.ifi_index = ifi->ifi_index,
|
||||
};
|
||||
struct rtattr *tb[IFLA_MAX + 1];
|
||||
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
|
||||
struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
|
||||
|
|
@ -59,14 +65,6 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
int len;
|
||||
|
||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_GETLINK;
|
||||
req.i.ifi_family = preferred_family;
|
||||
req.i.ifi_index = ifi->ifi_index;
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
|
||||
get_failed:
|
||||
fprintf(stderr,
|
||||
|
|
|
|||
|
|
@ -248,34 +248,28 @@ static int xfrm_policy_modify(int cmd, unsigned int flags, int argc, char **argv
|
|||
struct nlmsghdr n;
|
||||
struct xfrm_userpolicy_info xpinfo;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xpinfo)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.xpinfo.sel.family = preferred_family,
|
||||
.xpinfo.lft.soft_byte_limit = XFRM_INF,
|
||||
.xpinfo.lft.hard_byte_limit = XFRM_INF,
|
||||
.xpinfo.lft.soft_packet_limit = XFRM_INF,
|
||||
.xpinfo.lft.hard_packet_limit = XFRM_INF,
|
||||
};
|
||||
char *dirp = NULL;
|
||||
char *selp = NULL;
|
||||
char *ptypep = NULL;
|
||||
char *sctxp = NULL;
|
||||
struct xfrm_userpolicy_type upt;
|
||||
char tmpls_buf[XFRM_TMPLS_BUF_SIZE];
|
||||
struct xfrm_userpolicy_type upt = {};
|
||||
char tmpls_buf[XFRM_TMPLS_BUF_SIZE] = {};
|
||||
int tmpls_len = 0;
|
||||
struct xfrm_mark mark = {0, 0};
|
||||
struct {
|
||||
struct xfrm_user_sec_ctx sctx;
|
||||
char str[CTX_BUF_SIZE];
|
||||
} ctx;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&upt, 0, sizeof(upt));
|
||||
memset(&tmpls_buf, 0, sizeof(tmpls_buf));
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xpinfo));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.xpinfo.sel.family = preferred_family;
|
||||
|
||||
req.xpinfo.lft.soft_byte_limit = XFRM_INF;
|
||||
req.xpinfo.lft.hard_byte_limit = XFRM_INF;
|
||||
req.xpinfo.lft.soft_packet_limit = XFRM_INF;
|
||||
req.xpinfo.lft.hard_packet_limit = XFRM_INF;
|
||||
} ctx = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dir") == 0) {
|
||||
|
|
@ -561,27 +555,23 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete,
|
|||
struct nlmsghdr n;
|
||||
struct xfrm_userpolicy_id xpid;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xpid)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = delete ? XFRM_MSG_DELPOLICY
|
||||
: XFRM_MSG_GETPOLICY,
|
||||
};
|
||||
char *dirp = NULL;
|
||||
char *selp = NULL;
|
||||
char *indexp = NULL;
|
||||
char *ptypep = NULL;
|
||||
char *sctxp = NULL;
|
||||
struct xfrm_userpolicy_type upt;
|
||||
struct xfrm_userpolicy_type upt = {};
|
||||
struct xfrm_mark mark = {0, 0};
|
||||
struct {
|
||||
struct xfrm_user_sec_ctx sctx;
|
||||
char str[CTX_BUF_SIZE];
|
||||
} ctx;
|
||||
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&upt, 0, sizeof(upt));
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xpid));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = delete ? XFRM_MSG_DELPOLICY : XFRM_MSG_GETPOLICY;
|
||||
} ctx = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dir") == 0) {
|
||||
|
|
@ -684,11 +674,9 @@ static int xfrm_policy_delete(int argc, char **argv)
|
|||
|
||||
static int xfrm_policy_get(int argc, char **argv)
|
||||
{
|
||||
char buf[NLMSG_BUF_SIZE];
|
||||
char buf[NLMSG_BUF_SIZE] = {};
|
||||
struct nlmsghdr *n = (struct nlmsghdr *)buf;
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
xfrm_policy_get_or_delete(argc, argv, 0, n, sizeof(buf));
|
||||
|
||||
if (xfrm_policy_print(NULL, n, (void *)stdout) < 0) {
|
||||
|
|
@ -1012,18 +1000,16 @@ static int xfrm_spd_setinfo(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
__u32 flags;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_NEWSPDINFO,
|
||||
.flags = 0XFFFFFFFF,
|
||||
};
|
||||
|
||||
char *thr4 = NULL;
|
||||
char *thr6 = NULL;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_NEWSPDINFO;
|
||||
req.flags = 0XFFFFFFFF;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "hthresh4") == 0) {
|
||||
struct xfrmu_spdhthresh thr;
|
||||
|
|
@ -1080,14 +1066,12 @@ static int xfrm_spd_getinfo(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
__u32 flags;
|
||||
char ans[128];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_GETSPDINFO;
|
||||
req.flags = 0XFFFFFFFF;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_GETSPDINFO,
|
||||
.flags = 0XFFFFFFFF,
|
||||
};
|
||||
|
||||
if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
|
||||
exit(1);
|
||||
|
|
@ -1108,16 +1092,13 @@ static int xfrm_policy_flush(int argc, char **argv)
|
|||
struct {
|
||||
struct nlmsghdr n;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(0), /* nlmsg data is nothing */
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_FLUSHPOLICY,
|
||||
};
|
||||
char *ptypep = NULL;
|
||||
struct xfrm_userpolicy_type upt;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&upt, 0, sizeof(upt));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(0); /* nlmsg data is nothing */
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_FLUSHPOLICY;
|
||||
struct xfrm_userpolicy_type upt = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "ptype") == 0) {
|
||||
|
|
|
|||
110
ip/xfrm_state.c
110
ip/xfrm_state.c
|
|
@ -271,9 +271,18 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct xfrm_usersa_info xsinfo;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
struct xfrm_replay_state replay;
|
||||
struct xfrm_replay_state_esn replay_esn;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsinfo)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.xsinfo.family = preferred_family,
|
||||
.xsinfo.lft.soft_byte_limit = XFRM_INF,
|
||||
.xsinfo.lft.hard_byte_limit = XFRM_INF,
|
||||
.xsinfo.lft.soft_packet_limit = XFRM_INF,
|
||||
.xsinfo.lft.hard_packet_limit = XFRM_INF,
|
||||
};
|
||||
struct xfrm_replay_state replay = {};
|
||||
struct xfrm_replay_state_esn replay_esn = {};
|
||||
__u32 replay_window = 0;
|
||||
__u32 seq = 0, oseq = 0, seq_hi = 0, oseq_hi = 0;
|
||||
char *idp = NULL;
|
||||
|
|
@ -288,22 +297,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct {
|
||||
struct xfrm_user_sec_ctx sctx;
|
||||
char str[CTX_BUF_SIZE];
|
||||
} ctx;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&replay, 0, sizeof(replay));
|
||||
memset(&replay_esn, 0, sizeof(replay_esn));
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsinfo));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.xsinfo.family = preferred_family;
|
||||
|
||||
req.xsinfo.lft.soft_byte_limit = XFRM_INF;
|
||||
req.xsinfo.lft.hard_byte_limit = XFRM_INF;
|
||||
req.xsinfo.lft.soft_packet_limit = XFRM_INF;
|
||||
req.xsinfo.lft.hard_packet_limit = XFRM_INF;
|
||||
} ctx = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "mode") == 0) {
|
||||
|
|
@ -369,7 +363,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
(void *)&encap, sizeof(encap));
|
||||
} else if (strcmp(*argv, "coa") == 0) {
|
||||
inet_prefix coa;
|
||||
xfrm_address_t xcoa;
|
||||
xfrm_address_t xcoa = {};
|
||||
|
||||
if (coap)
|
||||
duparg("coa", *argv);
|
||||
|
|
@ -383,7 +377,6 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
if (coa.bytelen > sizeof(xcoa))
|
||||
invarg("value after \"coa\" is too large", *argv);
|
||||
|
||||
memset(&xcoa, 0, sizeof(xcoa));
|
||||
memcpy(&xcoa, &coa.data, coa.bytelen);
|
||||
|
||||
addattr_l(&req.n, sizeof(req.buf), XFRMA_COADDR,
|
||||
|
|
@ -699,30 +692,25 @@ static int xfrm_state_allocspi(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct xfrm_userspi_info xspi;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xspi)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_ALLOCSPI,
|
||||
.xspi.info.family = preferred_family,
|
||||
#if 0
|
||||
.xspi.lft.soft_byte_limit = XFRM_INF,
|
||||
.xspi.lft.hard_byte_limit = XFRM_INF,
|
||||
.xspi.lft.soft_packet_limit = XFRM_INF,
|
||||
.xspi.lft.hard_packet_limit = XFRM_INF,
|
||||
#endif
|
||||
};
|
||||
char *idp = NULL;
|
||||
char *minp = NULL;
|
||||
char *maxp = NULL;
|
||||
struct xfrm_mark mark = {0, 0};
|
||||
char res_buf[NLMSG_BUF_SIZE];
|
||||
char res_buf[NLMSG_BUF_SIZE] = {};
|
||||
struct nlmsghdr *res_n = (struct nlmsghdr *)res_buf;
|
||||
|
||||
memset(res_buf, 0, sizeof(res_buf));
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xspi));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_ALLOCSPI;
|
||||
req.xspi.info.family = preferred_family;
|
||||
|
||||
#if 0
|
||||
req.xsinfo.lft.soft_byte_limit = XFRM_INF;
|
||||
req.xsinfo.lft.hard_byte_limit = XFRM_INF;
|
||||
req.xsinfo.lft.soft_packet_limit = XFRM_INF;
|
||||
req.xsinfo.lft.hard_packet_limit = XFRM_INF;
|
||||
#endif
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "mode") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
@ -956,18 +944,16 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete)
|
|||
struct nlmsghdr n;
|
||||
struct xfrm_usersa_id xsid;
|
||||
char buf[RTA_BUF_SIZE];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsid)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = delete ? XFRM_MSG_DELSA : XFRM_MSG_GETSA,
|
||||
.xsid.family = preferred_family,
|
||||
};
|
||||
struct xfrm_id id;
|
||||
char *idp = NULL;
|
||||
struct xfrm_mark mark = {0, 0};
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsid));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = delete ? XFRM_MSG_DELSA : XFRM_MSG_GETSA;
|
||||
req.xsid.family = preferred_family;
|
||||
|
||||
while (argc > 0) {
|
||||
xfrm_address_t saddr;
|
||||
|
||||
|
|
@ -1014,11 +1000,9 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete)
|
|||
if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
|
||||
exit(2);
|
||||
} else {
|
||||
char buf[NLMSG_BUF_SIZE];
|
||||
char buf[NLMSG_BUF_SIZE] = {};
|
||||
struct nlmsghdr *res_n = (struct nlmsghdr *)buf;
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
if (rtnl_talk(&rth, &req.n, res_n, sizeof(req)) < 0)
|
||||
exit(2);
|
||||
|
||||
|
|
@ -1282,13 +1266,12 @@ static int xfrm_sad_getinfo(int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
__u32 flags;
|
||||
char ans[64];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.flags));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_GETSADINFO;
|
||||
req.flags = 0XFFFFFFFF;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.flags)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_GETSADINFO,
|
||||
.flags = 0XFFFFFFFF,
|
||||
};
|
||||
|
||||
if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
|
||||
exit(1);
|
||||
|
|
@ -1309,16 +1292,13 @@ static int xfrm_state_flush(int argc, char **argv)
|
|||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct xfrm_usersa_flush xsf;
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsf)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_FLUSHSA,
|
||||
};
|
||||
char *protop = NULL;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsf));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = XFRM_MSG_FLUSHSA;
|
||||
req.xsf.proto = 0;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "proto") == 0) {
|
||||
int ret;
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ struct json_writer {
|
|||
static void jsonw_indent(json_writer_t *self)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i <= self->depth; ++i)
|
||||
for (i = 0; i < self->depth; ++i)
|
||||
fputs(" ", self->out);
|
||||
}
|
||||
|
||||
|
|
@ -102,7 +102,6 @@ json_writer_t *jsonw_new(FILE *f)
|
|||
self->depth = 0;
|
||||
self->pretty = false;
|
||||
self->sep = '\0';
|
||||
putc('{', self->out);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
|
@ -113,8 +112,7 @@ void jsonw_destroy(json_writer_t **self_p)
|
|||
json_writer_t *self = *self_p;
|
||||
|
||||
assert(self->depth == 0);
|
||||
jsonw_eol(self);
|
||||
fputs("}\n", self->out);
|
||||
fputs("\n", self->out);
|
||||
fflush(self->out);
|
||||
free(self);
|
||||
*self_p = NULL;
|
||||
|
|
@ -269,6 +267,7 @@ int main(int argc, char **argv)
|
|||
{
|
||||
json_writer_t *wr = jsonw_new(stdout);
|
||||
|
||||
jsonw_start_object(wr);
|
||||
jsonw_pretty(wr, true);
|
||||
jsonw_name(wr, "Vyatta");
|
||||
jsonw_start_object(wr);
|
||||
|
|
@ -305,6 +304,7 @@ int main(int argc, char **argv)
|
|||
|
||||
jsonw_end_object(wr);
|
||||
|
||||
jsonw_end_object(wr);
|
||||
jsonw_destroy(&wr);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,19 +112,16 @@ int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int family, int type,
|
|||
/* attribute has to be NLMSG aligned */
|
||||
struct rtattr ext_req __attribute__ ((aligned(NLMSG_ALIGNTO)));
|
||||
__u32 ext_filter_mask;
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.nlh.nlmsg_len = sizeof(req);
|
||||
req.nlh.nlmsg_type = type;
|
||||
req.nlh.nlmsg_flags = NLM_F_DUMP|NLM_F_REQUEST;
|
||||
req.nlh.nlmsg_pid = 0;
|
||||
req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
|
||||
req.ifm.ifi_family = family;
|
||||
|
||||
req.ext_req.rta_type = IFLA_EXT_MASK;
|
||||
req.ext_req.rta_len = RTA_LENGTH(sizeof(__u32));
|
||||
req.ext_filter_mask = filt_mask;
|
||||
} req = {
|
||||
.nlh.nlmsg_len = sizeof(req),
|
||||
.nlh.nlmsg_type = type,
|
||||
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
|
||||
.ifm.ifi_family = family,
|
||||
.ext_req.rta_type = IFLA_EXT_MASK,
|
||||
.ext_req.rta_len = RTA_LENGTH(sizeof(__u32)),
|
||||
.ext_filter_mask = filt_mask,
|
||||
};
|
||||
|
||||
return send(rth->fd, (void*)&req, sizeof(req), 0);
|
||||
}
|
||||
|
|
@ -136,20 +133,18 @@ int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int family, int type,
|
|||
struct nlmsghdr nlh;
|
||||
struct ifinfomsg ifm;
|
||||
char buf[1024];
|
||||
} req;
|
||||
} req = {
|
||||
.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.nlh.nlmsg_type = type,
|
||||
.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.nlh.nlmsg_seq = rth->dump = ++rth->seq,
|
||||
.ifm.ifi_family = family,
|
||||
};
|
||||
int err;
|
||||
|
||||
if (!filter_fn)
|
||||
return -EINVAL;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
req.nlh.nlmsg_type = type;
|
||||
req.nlh.nlmsg_flags = NLM_F_DUMP|NLM_F_REQUEST;
|
||||
req.nlh.nlmsg_pid = 0;
|
||||
req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
|
||||
req.ifm.ifi_family = family;
|
||||
|
||||
err = filter_fn(&req.nlh, sizeof(req));
|
||||
if (err)
|
||||
return err;
|
||||
|
|
@ -197,7 +192,12 @@ int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int len)
|
|||
|
||||
int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
|
||||
{
|
||||
struct nlmsghdr nlh;
|
||||
struct nlmsghdr nlh = {
|
||||
.nlmsg_len = NLMSG_LENGTH(len),
|
||||
.nlmsg_type = type,
|
||||
.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.nlmsg_seq = rth->dump = ++rth->seq,
|
||||
};
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
struct iovec iov[2] = {
|
||||
{ .iov_base = &nlh, .iov_len = sizeof(nlh) },
|
||||
|
|
@ -205,17 +205,11 @@ int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
|
|||
};
|
||||
struct msghdr msg = {
|
||||
.msg_name = &nladdr,
|
||||
.msg_namelen = sizeof(nladdr),
|
||||
.msg_namelen = sizeof(nladdr),
|
||||
.msg_iov = iov,
|
||||
.msg_iovlen = 2,
|
||||
};
|
||||
|
||||
nlh.nlmsg_len = NLMSG_LENGTH(len);
|
||||
nlh.nlmsg_type = type;
|
||||
nlh.nlmsg_flags = NLM_F_DUMP|NLM_F_REQUEST;
|
||||
nlh.nlmsg_pid = 0;
|
||||
nlh.nlmsg_seq = rth->dump = ++rth->seq;
|
||||
|
||||
return sendmsg(rth->fd, &msg, 0);
|
||||
}
|
||||
|
||||
|
|
@ -365,7 +359,7 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
|||
int status;
|
||||
unsigned seq;
|
||||
struct nlmsghdr *h;
|
||||
struct sockaddr_nl nladdr;
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
struct iovec iov = {
|
||||
.iov_base = (void*) n,
|
||||
.iov_len = n->nlmsg_len
|
||||
|
|
@ -376,10 +370,7 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
|||
.msg_iov = &iov,
|
||||
.msg_iovlen = 1,
|
||||
};
|
||||
char buf[32768];
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
char buf[32768] = {};
|
||||
|
||||
n->nlmsg_seq = seq = ++rtnl->seq;
|
||||
|
||||
|
|
@ -392,8 +383,6 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(buf,0,sizeof(buf));
|
||||
|
||||
iov.iov_base = buf;
|
||||
while (1) {
|
||||
iov.iov_len = sizeof(buf);
|
||||
|
|
@ -498,7 +487,7 @@ int rtnl_listen(struct rtnl_handle *rtnl,
|
|||
{
|
||||
int status;
|
||||
struct nlmsghdr *h;
|
||||
struct sockaddr_nl nladdr;
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
struct iovec iov;
|
||||
struct msghdr msg = {
|
||||
.msg_name = &nladdr,
|
||||
|
|
@ -514,11 +503,6 @@ int rtnl_listen(struct rtnl_handle *rtnl,
|
|||
msg.msg_controllen = sizeof(cmsgbuf);
|
||||
}
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
nladdr.nl_pid = 0;
|
||||
nladdr.nl_groups = 0;
|
||||
|
||||
iov.iov_base = buf;
|
||||
while (1) {
|
||||
struct rtnl_ctrl_data ctrl;
|
||||
|
|
@ -595,15 +579,10 @@ int rtnl_from_file(FILE *rtnl, rtnl_listen_filter_t handler,
|
|||
void *jarg)
|
||||
{
|
||||
int status;
|
||||
struct sockaddr_nl nladdr;
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
char buf[16384];
|
||||
struct nlmsghdr *h = (void*)buf;
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
nladdr.nl_pid = 0;
|
||||
nladdr.nl_groups = 0;
|
||||
|
||||
while (1) {
|
||||
int err, len;
|
||||
int l;
|
||||
|
|
|
|||
|
|
@ -103,7 +103,6 @@ int ll_remember_index(const struct sockaddr_nl *who,
|
|||
return 0;
|
||||
}
|
||||
|
||||
memset(tb, 0, sizeof(tb));
|
||||
parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(n));
|
||||
ifname = rta_getattr_str(tb[IFLA_IFNAME]);
|
||||
if (ifname == NULL)
|
||||
|
|
|
|||
|
|
@ -54,15 +54,12 @@ struct db_names *db_names_alloc(void)
|
|||
{
|
||||
struct db_names *db;
|
||||
|
||||
db = malloc(sizeof(*db));
|
||||
db = calloc(1, sizeof(*db));
|
||||
if (!db)
|
||||
return NULL;
|
||||
|
||||
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);
|
||||
db->hash = calloc(db->size, sizeof(struct db_entry *));
|
||||
|
||||
return db;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,9 @@ bridge \- show / manipulate bridge addresses and devices
|
|||
.IR OPTIONS " := { "
|
||||
\fB\-V\fR[\fIersion\fR] |
|
||||
\fB\-s\fR[\fItatistics\fR] |
|
||||
\fB\-n\fR[\fIetns\fR] name }
|
||||
\fB\-b\fR[\fIatch\fR] filename }
|
||||
\fB\-n\fR[\fIetns\fR] name |
|
||||
\fB\-b\fR[\fIatch\fR] filename |
|
||||
\fB\-j\fR[\fIson\fR] }
|
||||
|
||||
.ti -8
|
||||
.BR "bridge link set"
|
||||
|
|
@ -153,6 +154,10 @@ Don't terminate bridge command on errors in batch mode.
|
|||
If there were any errors during execution of the commands, the application
|
||||
return code will be non zero.
|
||||
|
||||
.TP
|
||||
.BR "\-json"
|
||||
Display results in JSON format. Currently available for vlan and fdb.
|
||||
|
||||
.SH BRIDGE - COMMAND SYNTAX
|
||||
|
||||
.SS
|
||||
|
|
|
|||
|
|
@ -77,14 +77,15 @@ ip-address \- protocol address management
|
|||
.IR FLAG " := "
|
||||
.RB "[ " permanent " | " dynamic " | " secondary " | " primary " |"
|
||||
.RB [ - ] tentative " | [" - ] deprecated " | [" - ] dadfailed " |"
|
||||
.BR temporary " | " CONFFLAG-LIST " ]"
|
||||
.BR temporary " |"
|
||||
.IR CONFFLAG-LIST " ]"
|
||||
|
||||
.ti -8
|
||||
.IR CONFFLAG-LIST " := [ " CONFFLAG-LIST " ] " CONFFLAG
|
||||
|
||||
.ti -8
|
||||
.IR CONFFLAG " := "
|
||||
.RB "[ " home " | " mngtmpaddr " | " nodad " | " noprefixroute " ]"
|
||||
.RB "[ " home " | " mngtmpaddr " | " nodad " | " noprefixroute " | " autojoin " ]"
|
||||
|
||||
.ti -8
|
||||
.IR LIFETIME " := [ "
|
||||
|
|
@ -249,6 +250,26 @@ address, and don't search for one to delete when removing the address. Changing
|
|||
an address to add this flag will remove the automatically added prefix route,
|
||||
changing it to remove this flag will create the prefix route automatically.
|
||||
|
||||
.TP
|
||||
.B autojoin
|
||||
Joining multicast groups on Ethernet level via
|
||||
.B "ip maddr"
|
||||
command does not work if connected to an Ethernet switch that does IGMP
|
||||
snooping since the switch would not replicate multicast packets on ports that
|
||||
did not have IGMP reports for the multicast addresses.
|
||||
|
||||
Linux VXLAN interfaces created via
|
||||
.B "ip link add vxlan"
|
||||
have the
|
||||
.B group
|
||||
option that enables them to do the required join.
|
||||
|
||||
Using the
|
||||
.B autojoin
|
||||
flag when adding a multicast address enables similar functionality for
|
||||
Openvswitch VXLAN interfaces as well as other tunneling mechanisms that need to
|
||||
receive multicast traffic.
|
||||
|
||||
.SS ip address delete - delete protocol address
|
||||
.B Arguments:
|
||||
coincide with the arguments of
|
||||
|
|
|
|||
|
|
@ -39,35 +39,6 @@ ip-link \- network device configuration
|
|||
.BI type " TYPE"
|
||||
.RI "[ " ARGS " ]"
|
||||
|
||||
.ti -8
|
||||
.IR TYPE " := [ "
|
||||
.BR bridge " | "
|
||||
.BR bond " | "
|
||||
.BR can " | "
|
||||
.BR dummy " | "
|
||||
.BR hsr " | "
|
||||
.BR ifb " | "
|
||||
.BR ipoib " |"
|
||||
.BR macvlan " | "
|
||||
.BR macvtap " | "
|
||||
.BR vcan " | "
|
||||
.BR veth " | "
|
||||
.BR vlan " | "
|
||||
.BR vxlan " |"
|
||||
.BR ip6tnl " |"
|
||||
.BR ipip " |"
|
||||
.BR sit " |"
|
||||
.BR gre " |"
|
||||
.BR gretap " |"
|
||||
.BR ip6gre " |"
|
||||
.BR ip6gretap " |"
|
||||
.BR vti " |"
|
||||
.BR nlmon " |"
|
||||
.BR ipvlan " |"
|
||||
.BR lowpan " |"
|
||||
.BR geneve " |"
|
||||
.BR vrf " ]"
|
||||
|
||||
.ti -8
|
||||
.BR "ip link delete " {
|
||||
.IR DEVICE " | "
|
||||
|
|
@ -80,7 +51,12 @@ ip-link \- network device configuration
|
|||
.BR "ip link set " {
|
||||
.IR DEVICE " | "
|
||||
.BI "group " GROUP
|
||||
.RB "} [ { " up " | " down " } ]"
|
||||
}
|
||||
.br
|
||||
.RB "[ { " up " | " down " } ]"
|
||||
.br
|
||||
.RB "[ " type
|
||||
.IR "ETYPE TYPE_ARGS" " ]"
|
||||
.br
|
||||
.RB "[ " arp " { " on " | " off " } ]"
|
||||
.br
|
||||
|
|
@ -173,7 +149,7 @@ ip-link \- network device configuration
|
|||
.B master
|
||||
.IR DEVICE " ] ["
|
||||
.B type
|
||||
.IR TYPE " ]"
|
||||
.IR ETYPE " ]"
|
||||
.B vrf
|
||||
.IR NAME " ]"
|
||||
|
||||
|
|
@ -181,6 +157,39 @@ ip-link \- network device configuration
|
|||
.B ip link help
|
||||
.RI "[ " TYPE " ]"
|
||||
|
||||
.ti -8
|
||||
.IR TYPE " := [ "
|
||||
.BR bridge " | "
|
||||
.BR bond " | "
|
||||
.BR can " | "
|
||||
.BR dummy " | "
|
||||
.BR hsr " | "
|
||||
.BR ifb " | "
|
||||
.BR ipoib " |"
|
||||
.BR macvlan " | "
|
||||
.BR macvtap " | "
|
||||
.BR vcan " | "
|
||||
.BR veth " | "
|
||||
.BR vlan " | "
|
||||
.BR vxlan " |"
|
||||
.BR ip6tnl " |"
|
||||
.BR ipip " |"
|
||||
.BR sit " |"
|
||||
.BR gre " |"
|
||||
.BR gretap " |"
|
||||
.BR ip6gre " |"
|
||||
.BR ip6gretap " |"
|
||||
.BR vti " |"
|
||||
.BR nlmon " |"
|
||||
.BR ipvlan " |"
|
||||
.BR lowpan " |"
|
||||
.BR geneve " |"
|
||||
.BR vrf " ]"
|
||||
|
||||
.ti -8
|
||||
.IR ETYPE " := [ " TYPE " |"
|
||||
.BR bridge_slave " | " bond_slave " ]"
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
.SS ip link add - add virtual link
|
||||
|
||||
|
|
@ -299,7 +308,7 @@ the following additional arguments are supported:
|
|||
.BI "ip link add
|
||||
.BI link " DEVICE "
|
||||
.BI name " NAME "
|
||||
.BI type " vlan "
|
||||
.B "type vlan"
|
||||
[
|
||||
.BI protocol " VLAN_PROTO "
|
||||
]
|
||||
|
|
@ -401,7 +410,7 @@ For a link of type
|
|||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add " DEVICE
|
||||
.BI type " vxlan " id " ID"
|
||||
.BI type " vxlan " id " VNI"
|
||||
[
|
||||
.BI dev " PHYS_DEV "
|
||||
.RB " ] [ { " group " | " remote " } "
|
||||
|
|
@ -420,27 +429,27 @@ the following additional arguments are supported:
|
|||
] [
|
||||
.BI srcport " MIN MAX "
|
||||
] [
|
||||
.I "[no]learning "
|
||||
.RB [ no ] learning
|
||||
] [
|
||||
.I "[no]proxy "
|
||||
.RB [ no ] proxy
|
||||
] [
|
||||
.I "[no]rsc "
|
||||
.RB [ no ] rsc
|
||||
] [
|
||||
.I "[no]l2miss "
|
||||
.RB [ no ] l2miss
|
||||
] [
|
||||
.I "[no]l3miss "
|
||||
.RB [ no ] l3miss
|
||||
] [
|
||||
.I "[no]udpcsum "
|
||||
.RB [ no ] udpcsum
|
||||
] [
|
||||
.I "[no]udp6zerocsumtx "
|
||||
.RB [ no ] udp6zerocsumtx
|
||||
] [
|
||||
.I "[no]udp6zerocsumrx "
|
||||
.RB [ no ] udp6zerocsumrx
|
||||
] [
|
||||
.BI ageing " SECONDS "
|
||||
] [
|
||||
.BI maxaddress " NUMBER "
|
||||
] [
|
||||
.RI "[no]external "
|
||||
.RB [ no ] external
|
||||
] [
|
||||
.B gbp
|
||||
] [
|
||||
|
|
@ -497,36 +506,36 @@ parameter.
|
|||
source ports to communicate to the remote VXLAN tunnel endpoint.
|
||||
|
||||
.sp
|
||||
.I [no]learning
|
||||
.RB [ no ] learning
|
||||
- specifies if unknown source link layer addresses and IP addresses
|
||||
are entered into the VXLAN device forwarding database.
|
||||
|
||||
.sp
|
||||
.I [no]rsc
|
||||
.RB [ no ] rsc
|
||||
- specifies if route short circuit is turned on.
|
||||
|
||||
.sp
|
||||
.I [no]proxy
|
||||
.RB [ no ] proxy
|
||||
- specifies ARP proxy is turned on.
|
||||
|
||||
.sp
|
||||
.I [no]l2miss
|
||||
.RB [ no ] l2miss
|
||||
- specifies if netlink LLADDR miss notifications are generated.
|
||||
|
||||
.sp
|
||||
.I [no]l3miss
|
||||
.RB [ no ] l3miss
|
||||
- specifies if netlink IP ADDR miss notifications are generated.
|
||||
|
||||
.sp
|
||||
.I [no]udpcsum
|
||||
.RB [ no ] udpcsum
|
||||
- specifies if UDP checksum is calculated for transmitted packets over IPv4.
|
||||
|
||||
.sp
|
||||
.I [no]udp6zerocsumtx
|
||||
.RB [ no ] udp6zerocsumtx
|
||||
- skip UDP checksum calculation for transmitted packets over IPv6.
|
||||
|
||||
.sp
|
||||
.I [no]udp6zerocsumrx
|
||||
.RB [ no ] udp6zerocsumrx
|
||||
- allow incoming UDP packets over IPv6 with zero checksum field.
|
||||
|
||||
.sp
|
||||
|
|
@ -538,7 +547,7 @@ are entered into the VXLAN device forwarding database.
|
|||
- specifies the maximum number of FDB entries.
|
||||
|
||||
.sp
|
||||
.I [no]external
|
||||
.RB [ no ] external
|
||||
- specifies whether an external control plane
|
||||
.RB "(e.g. " "ip route encap" )
|
||||
or the internal FDB should be used.
|
||||
|
|
@ -602,18 +611,18 @@ For a link of types
|
|||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add " DEVICE
|
||||
.BR type " { gre | ipip | sit } "
|
||||
.BR type " { " gre " | " ipip " | " sit " }"
|
||||
.BI " remote " ADDR " local " ADDR
|
||||
[
|
||||
.BR encap " { fou | gue | none } "
|
||||
.BR encap " { " fou " | " gue " | " none " }"
|
||||
] [
|
||||
.BI "encap-sport { " PORT " | auto } "
|
||||
.BR encap-sport " { " \fIPORT " | " auto " }"
|
||||
] [
|
||||
.BI "encap-dport " PORT
|
||||
] [
|
||||
.I " [no]encap-csum "
|
||||
.RB [ no ] encap-csum
|
||||
] [
|
||||
.I " [no]encap-remcsum "
|
||||
.RB [ no ] encap-remcsum
|
||||
]
|
||||
|
||||
.in +8
|
||||
|
|
@ -627,12 +636,12 @@ the following additional arguments are supported:
|
|||
It must be an address on another interface on this host.
|
||||
|
||||
.sp
|
||||
.BR encap " { fou | gue | none } "
|
||||
.BR encap " { " fou " | " gue " | " none " }"
|
||||
- specifies type of secondary UDP encapsulation. "fou" indicates
|
||||
Foo-Over-UDP, "gue" indicates Generic UDP Encapsulation.
|
||||
|
||||
.sp
|
||||
.BI "encap-sport { " PORT " | auto } "
|
||||
.BR encap-sport " { " \fIPORT " | " auto " }"
|
||||
- specifies the source port in UDP encapsulation.
|
||||
.IR PORT
|
||||
indicates the port by number, "auto"
|
||||
|
|
@ -641,12 +650,12 @@ indicates that the port number should be chosen automatically
|
|||
encapsulated packet).
|
||||
|
||||
.sp
|
||||
.I [no]encap-csum
|
||||
.RB [ no ] encap-csum
|
||||
- specifies if UDP checksums are enabled in the secondary
|
||||
encapsulation.
|
||||
|
||||
.sp
|
||||
.I [no]encap-remcsum
|
||||
.RB [ no ] encap-remcsum
|
||||
- specifies if Remote Checksum Offload is enabled. This is only
|
||||
applicable for Generic UDP Encapsulation.
|
||||
|
||||
|
|
@ -659,13 +668,15 @@ For a link of type
|
|||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add " DEVICE
|
||||
.BI type " { ip6gre | ip6gretap } " remote " ADDR " local " ADDR
|
||||
.BR type " { " ip6gre " | " ip6gretap " }"
|
||||
.BI remote " ADDR " local " ADDR"
|
||||
[
|
||||
.I "[i|o]seq]"
|
||||
.RB [ i | o ] seq
|
||||
] [
|
||||
.I "[i|o]key" KEY
|
||||
.RB [ i | o ] key
|
||||
.I KEY
|
||||
] [
|
||||
.I " [i|o]csum "
|
||||
.RB [ i | o ] csum
|
||||
] [
|
||||
.BI hoplimit " TTL "
|
||||
] [
|
||||
|
|
@ -691,7 +702,7 @@ the following additional arguments are supported:
|
|||
It must be an address on another interface on this host.
|
||||
|
||||
.sp
|
||||
.BI [i|o]seq
|
||||
.RB [ i | o ] seq
|
||||
- serialize packets.
|
||||
The
|
||||
.B oseq
|
||||
|
|
@ -701,7 +712,7 @@ The
|
|||
flag requires that all input packets are serialized.
|
||||
|
||||
.sp
|
||||
.BI [i|o]key " KEY"
|
||||
.RB [ i | o ] key " \fIKEY"
|
||||
- use keyed GRE with key
|
||||
.IR KEY ". "KEY
|
||||
is either a number or an IPv4 address-like dotted quad.
|
||||
|
|
@ -713,7 +724,7 @@ The
|
|||
parameters specify different keys for input and output.
|
||||
|
||||
.sp
|
||||
.BI [i|o]csum
|
||||
.RB [ i | o ] csum
|
||||
- generate/require checksums for tunneled packets.
|
||||
The
|
||||
.B ocsum
|
||||
|
|
@ -765,7 +776,7 @@ For a link of type
|
|||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add " DEVICE " name " NAME
|
||||
.BI type " ipoib [ " pkey " PKEY ] [" mode " MODE " ]
|
||||
.BR "type ipoib " [ " pkey \fIPKEY" " ] [ " mode " \fIMODE \fR]"
|
||||
|
||||
.in +8
|
||||
.sp
|
||||
|
|
@ -782,7 +793,7 @@ For a link of type
|
|||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add " DEVICE
|
||||
.BI type " geneve " id " ID " remote " IPADDR"
|
||||
.BI type " geneve " id " VNI " remote " IPADDR"
|
||||
[
|
||||
.BI ttl " TTL "
|
||||
] [
|
||||
|
|
@ -825,7 +836,7 @@ the following additional arguments are supported:
|
|||
.BI "ip link add link " DEVICE " name " NAME
|
||||
.BR type " { " macvlan " | " macvtap " } "
|
||||
.BR mode " { " private " | " vepa " | " bridge " | " passthru
|
||||
.BR " [ " nopromisc " ] } "
|
||||
.RB " [ " nopromisc " ] } "
|
||||
|
||||
.in +8
|
||||
.sp
|
||||
|
|
@ -870,11 +881,11 @@ For a link of type
|
|||
.I HSR
|
||||
the following additional arguments are supported:
|
||||
|
||||
.BI "ip link add link " DEVICE " name " NAME
|
||||
.BI type " hsr "
|
||||
.BI "ip link add link " DEVICE " name " NAME " type hsr"
|
||||
.BI slave1 " SLAVE1-IF " slave2 " SLAVE2-IF "
|
||||
.BR " [ supervision " ADDR-BYTE " ] "
|
||||
.BR " [ version { " 0 " | " 1 " } ] "
|
||||
.RB [ " supervision"
|
||||
.IR ADDR-BYTE " ] ["
|
||||
.BR version " { " 0 " | " 1 " } ]"
|
||||
|
||||
.in +8
|
||||
.sp
|
||||
|
|
@ -887,11 +898,11 @@ the following additional arguments are supported:
|
|||
.BI slave2 " SLAVE2-IF "
|
||||
- Specifies the physical device used for the second of the two ring ports.
|
||||
|
||||
.BR "supervision ADDR-BYTE "
|
||||
.BI supervision " ADDR-BYTE"
|
||||
- The last byte of the multicast address used for HSR supervision frames.
|
||||
Default option is "0", possible values 0-255.
|
||||
|
||||
.BR "version { 0 | 1 }"
|
||||
.BR version " { " 0 " | " 1 " }"
|
||||
- Selects the protocol version of the interface. Default option is "0", which
|
||||
corresponds to the 2010 version of the HSR standard. Option "1" activates the
|
||||
2012 version.
|
||||
|
|
@ -1010,6 +1021,18 @@ specifies the type of the device.
|
|||
|
||||
.SS ip link set - change device attributes
|
||||
|
||||
.PP
|
||||
.B Warning:
|
||||
If multiple parameter changes are requested,
|
||||
.B ip
|
||||
aborts immediately after any of the changes have failed.
|
||||
This is the only case when
|
||||
.B ip
|
||||
can move the system to an unpredictable state. The solution
|
||||
is to avoid changing several parameters with one
|
||||
.B ip link set
|
||||
call.
|
||||
|
||||
.TP
|
||||
.BI dev " DEVICE "
|
||||
.I DEVICE
|
||||
|
|
@ -1236,17 +1259,134 @@ set the IPv6 address generation mode
|
|||
.BR "link-netnsid "
|
||||
set peer netnsid for a cross-netns interface
|
||||
|
||||
.PP
|
||||
.B Warning:
|
||||
If multiple parameter changes are requested,
|
||||
.B ip
|
||||
aborts immediately after any of the changes have failed.
|
||||
This is the only case when
|
||||
.B ip
|
||||
can move the system to an unpredictable state. The solution
|
||||
is to avoid changing several parameters with one
|
||||
.B ip link set
|
||||
call.
|
||||
.TP
|
||||
.BI type " ETYPE TYPE_ARGS"
|
||||
Change type-specific settings. For a list of supported types and arguments refer
|
||||
to the description of
|
||||
.B "ip link add"
|
||||
above. In addition to that, it is possible to manipulate settings to slave
|
||||
devices:
|
||||
|
||||
.TP
|
||||
Bridge Slave Support
|
||||
For a link with master
|
||||
.B bridge
|
||||
the following additional arguments are supported:
|
||||
|
||||
.B "ip link set type bridge_slave"
|
||||
[
|
||||
.BI state " STATE"
|
||||
] [
|
||||
.BI priority " PRIO"
|
||||
] [
|
||||
.BI cost " COST"
|
||||
] [
|
||||
.BR guard " { " on " | " off " }"
|
||||
] [
|
||||
.BR hairpin " { " on " | " off " }"
|
||||
] [
|
||||
.BR fastleave " { " on " | " off " }"
|
||||
] [
|
||||
.BR root_block " { " on " | " off " }"
|
||||
] [
|
||||
.BR learning " { " on " | " off " }"
|
||||
] [
|
||||
.BR flood " { " on " | " off " }"
|
||||
] [
|
||||
.BR proxy_arp " { " on " | " off " }"
|
||||
] [
|
||||
.BR proxy_arp_wifi " { " on " | " off " }"
|
||||
] [
|
||||
.BI mcast_router " MULTICAST_ROUTER"
|
||||
] [
|
||||
.BR mcast_fast_leave " { " on " | " off "} ]"
|
||||
|
||||
.in +8
|
||||
.sp
|
||||
.BI state " STATE"
|
||||
- Set port state.
|
||||
.I STATE
|
||||
is a number representing the following states:
|
||||
.BR 0 " (disabled),"
|
||||
.BR 1 " (listening),"
|
||||
.BR 2 " (learning),"
|
||||
.BR 3 " (forwarding),"
|
||||
.BR 4 " (blocking)."
|
||||
|
||||
.BI priority " PRIO"
|
||||
- set port priority (a 16bit unsigned value).
|
||||
|
||||
.BI cost " COST"
|
||||
- set port cost (a 32bit unsigned value).
|
||||
|
||||
.BR guard " { " on " | " off " }"
|
||||
- block incoming BPDU packets on this port.
|
||||
|
||||
.BR hairpin " { " on " | " off " }"
|
||||
- enable hairpin mode on this port. This will allow incoming packets on this
|
||||
port to be reflected back.
|
||||
|
||||
.BR fastleave " { " on " | " off " }"
|
||||
- enable multicast fast leave on this port.
|
||||
|
||||
.BR root_block " { " on " | " off " }"
|
||||
- block this port from becoming the bridge's root port.
|
||||
|
||||
.BR learning " { " on " | " off " }"
|
||||
- allow MAC address learning on this port.
|
||||
|
||||
.BR flood " { " on " | " off " }"
|
||||
- open the flood gates on this port, i.e. forward all unicast frames to this
|
||||
port also. Requires
|
||||
.BR proxy_arp " and " proxy_arp_wifi
|
||||
to be turned off.
|
||||
|
||||
.BR proxy_arp " { " on " | " off " }"
|
||||
- enable proxy ARP on this port.
|
||||
|
||||
.BR proxy_arp_wifi " { " on " | " off " }"
|
||||
- enable proxy ARP on this port which meets extended requirements by IEEE
|
||||
802.11 and Hotspot 2.0 specifications.
|
||||
|
||||
.BI mcast_router " MULTICAST_ROUTER"
|
||||
- configure this port for having multicast routers attached. A port with a
|
||||
multicast router will receive all multicast traffic.
|
||||
.I MULTICAST_ROUTER
|
||||
may be either
|
||||
.B 0
|
||||
to disable multicast routers on this port,
|
||||
.B 1
|
||||
to let the system detect the presence of of routers (this is the default),
|
||||
.B 2
|
||||
to permanently enable multicast traffic forwarding on this port or
|
||||
.B 3
|
||||
to enable multicast routers temporarily on this port, not depending on incoming
|
||||
queries.
|
||||
|
||||
.BR mcast_fast_leave " { " on " | " off " }"
|
||||
- this is a synonym to the
|
||||
.B fastleave
|
||||
option above.
|
||||
|
||||
.in -8
|
||||
|
||||
.TP
|
||||
Bonding Slave Support
|
||||
For a link with master
|
||||
.B bond
|
||||
the following additional arguments are supported:
|
||||
|
||||
.B "ip link set type bond_slave"
|
||||
[
|
||||
.BI queue_id " ID"
|
||||
]
|
||||
|
||||
.in +8
|
||||
.sp
|
||||
.BI queue_id " ID"
|
||||
- set the slave's queue ID (a 16bit unsigned value).
|
||||
|
||||
.in -8
|
||||
|
||||
.SS ip link show - display device attributes
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,9 @@ Show summary of options.
|
|||
.B \-V, \-\-version
|
||||
Output version information.
|
||||
.TP
|
||||
.B \-H, \-\-no-header
|
||||
Suppress header line.
|
||||
.TP
|
||||
.B \-n, \-\-numeric
|
||||
Do not try to resolve service names.
|
||||
.TP
|
||||
|
|
|
|||
64
misc/arpd.c
64
misc/arpd.c
|
|
@ -179,16 +179,22 @@ static void undo_sysctl_adjustments(void)
|
|||
|
||||
static int send_probe(int ifindex, __u32 addr)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
struct sockaddr_in dst;
|
||||
struct ifreq ifr = { .ifr_ifindex = ifindex };
|
||||
struct sockaddr_in dst = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_port = htons(1025),
|
||||
.sin_addr.s_addr = addr,
|
||||
};
|
||||
socklen_t len;
|
||||
unsigned char buf[256];
|
||||
struct arphdr *ah = (struct arphdr *)buf;
|
||||
unsigned char *p = (unsigned char *)(ah+1);
|
||||
struct sockaddr_ll sll;
|
||||
struct sockaddr_ll sll = {
|
||||
.sll_family = AF_PACKET,
|
||||
.sll_ifindex = ifindex,
|
||||
.sll_protocol = htons(ETH_P_ARP),
|
||||
};
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
ifr.ifr_ifindex = ifindex;
|
||||
if (ioctl(udp_sock, SIOCGIFNAME, &ifr))
|
||||
return -1;
|
||||
if (ioctl(udp_sock, SIOCGIFHWADDR, &ifr))
|
||||
|
|
@ -198,9 +204,6 @@ static int send_probe(int ifindex, __u32 addr)
|
|||
if (setsockopt(udp_sock, SOL_SOCKET, SO_BINDTODEVICE, ifr.ifr_name, strlen(ifr.ifr_name)+1) < 0)
|
||||
return -1;
|
||||
|
||||
dst.sin_family = AF_INET;
|
||||
dst.sin_port = htons(1025);
|
||||
dst.sin_addr.s_addr = addr;
|
||||
if (connect(udp_sock, (struct sockaddr *)&dst, sizeof(dst)) < 0)
|
||||
return -1;
|
||||
len = sizeof(dst);
|
||||
|
|
@ -219,10 +222,7 @@ static int send_probe(int ifindex, __u32 addr)
|
|||
memcpy(p, &dst.sin_addr, 4);
|
||||
p += 4;
|
||||
|
||||
sll.sll_family = AF_PACKET;
|
||||
memset(sll.sll_addr, 0xFF, sizeof(sll.sll_addr));
|
||||
sll.sll_ifindex = ifindex;
|
||||
sll.sll_protocol = htons(ETH_P_ARP);
|
||||
memcpy(p, &sll.sll_addr, ah->ar_hln);
|
||||
p += ah->ar_hln;
|
||||
|
||||
|
|
@ -268,18 +268,15 @@ static int respond_to_kernel(int ifindex, __u32 addr, char *lla, int llalen)
|
|||
struct nlmsghdr n;
|
||||
struct ndmsg ndm;
|
||||
char buf[256];
|
||||
} req;
|
||||
|
||||
memset(&req.n, 0, sizeof(req.n));
|
||||
memset(&req.ndm, 0, sizeof(req.ndm));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST;
|
||||
req.n.nlmsg_type = RTM_NEWNEIGH;
|
||||
req.ndm.ndm_family = AF_INET;
|
||||
req.ndm.ndm_state = NUD_STALE;
|
||||
req.ndm.ndm_ifindex = ifindex;
|
||||
req.ndm.ndm_type = RTN_UNICAST;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_NEWNEIGH,
|
||||
.ndm.ndm_family = AF_INET,
|
||||
.ndm.ndm_state = NUD_STALE,
|
||||
.ndm.ndm_ifindex = ifindex,
|
||||
.ndm.ndm_type = RTN_UNICAST,
|
||||
};
|
||||
|
||||
addattr_l(&req.n, sizeof(req), NDA_DST, &addr, 4);
|
||||
addattr_l(&req.n, sizeof(req), NDA_LLADDR, lla, llalen);
|
||||
|
|
@ -440,7 +437,7 @@ static void get_kern_msg(void)
|
|||
{
|
||||
int status;
|
||||
struct nlmsghdr *h;
|
||||
struct sockaddr_nl nladdr;
|
||||
struct sockaddr_nl nladdr = {};
|
||||
struct iovec iov;
|
||||
char buf[8192];
|
||||
struct msghdr msg = {
|
||||
|
|
@ -450,8 +447,6 @@ static void get_kern_msg(void)
|
|||
0
|
||||
};
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
|
||||
iov.iov_base = buf;
|
||||
iov.iov_len = sizeof(buf);
|
||||
|
||||
|
|
@ -539,10 +534,8 @@ static void get_arp_pkt(void)
|
|||
|
||||
static void catch_signal(int sig, void (*handler)(int))
|
||||
{
|
||||
struct sigaction sa;
|
||||
struct sigaction sa = { .sa_handler = handler };
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_handler = handler;
|
||||
#ifdef SA_INTERRUPT
|
||||
sa.sa_flags = SA_INTERRUPT;
|
||||
#endif
|
||||
|
|
@ -668,9 +661,8 @@ int main(int argc, char **argv)
|
|||
|
||||
if (ifnum) {
|
||||
int i;
|
||||
struct ifreq ifr;
|
||||
struct ifreq ifr = {};
|
||||
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
for (i = 0; i < ifnum; i++) {
|
||||
strncpy(ifr.ifr_name, ifnames[i], IFNAMSIZ);
|
||||
if (ioctl(udp_sock, SIOCGIFINDEX, &ifr)) {
|
||||
|
|
@ -772,12 +764,12 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (1) {
|
||||
struct sockaddr_ll sll;
|
||||
struct sockaddr_ll sll = {
|
||||
.sll_family = AF_PACKET,
|
||||
.sll_protocol = htons(ETH_P_ARP),
|
||||
.sll_ifindex = (ifnum == 1 ? ifvec[0] : 0),
|
||||
};
|
||||
|
||||
memset(&sll, 0, sizeof(sll));
|
||||
sll.sll_family = AF_PACKET;
|
||||
sll.sll_protocol = htons(ETH_P_ARP);
|
||||
sll.sll_ifindex = (ifnum == 1 ? ifvec[0] : 0);
|
||||
if (bind(pset[0].fd, (struct sockaddr *)&sll, sizeof(sll)) < 0) {
|
||||
perror("bind");
|
||||
goto do_abort;
|
||||
|
|
|
|||
|
|
@ -245,6 +245,7 @@ static void dump_raw_db(FILE *fp, int to_hist)
|
|||
|
||||
h = hist_db;
|
||||
if (jw) {
|
||||
jsonw_start_object(jw);
|
||||
jsonw_pretty(jw, pretty);
|
||||
jsonw_name(jw, info_source);
|
||||
jsonw_start_object(jw);
|
||||
|
|
@ -287,6 +288,8 @@ static void dump_raw_db(FILE *fp, int to_hist)
|
|||
}
|
||||
}
|
||||
if (jw) {
|
||||
jsonw_end_object(jw);
|
||||
|
||||
jsonw_end_object(jw);
|
||||
jsonw_destroy(&jw);
|
||||
}
|
||||
|
|
@ -451,6 +454,7 @@ static void dump_kern_db(FILE *fp)
|
|||
struct ifstat_ent *n;
|
||||
|
||||
if (jw) {
|
||||
jsonw_start_object(jw);
|
||||
jsonw_pretty(jw, pretty);
|
||||
jsonw_name(jw, info_source);
|
||||
jsonw_start_object(jw);
|
||||
|
|
@ -477,6 +481,7 @@ static void dump_incr_db(FILE *fp)
|
|||
|
||||
h = hist_db;
|
||||
if (jw) {
|
||||
jsonw_start_object(jw);
|
||||
jsonw_pretty(jw, pretty);
|
||||
jsonw_name(jw, info_source);
|
||||
jsonw_start_object(jw);
|
||||
|
|
@ -508,6 +513,8 @@ static void dump_incr_db(FILE *fp)
|
|||
}
|
||||
|
||||
if (jw) {
|
||||
jsonw_end_object(jw);
|
||||
|
||||
jsonw_end_object(jw);
|
||||
jsonw_destroy(&jw);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,10 +182,8 @@ static struct table_hdr *build_hdr_string(struct lnstat_file *lnstat_files,
|
|||
static struct table_hdr th;
|
||||
int ofs = 0;
|
||||
|
||||
for (i = 0; i < HDR_LINES; i++) {
|
||||
th.hdr[i] = malloc(HDR_LINE_LENGTH);
|
||||
memset(th.hdr[i], 0, HDR_LINE_LENGTH);
|
||||
}
|
||||
for (i = 0; i < HDR_LINES; i++)
|
||||
th.hdr[i] = calloc(1, HDR_LINE_LENGTH);
|
||||
|
||||
for (i = 0; i < fps->num; i++) {
|
||||
char *cname, *fname = fps->params[i].lf->name;
|
||||
|
|
|
|||
|
|
@ -173,15 +173,13 @@ static struct lnstat_file *alloc_and_open(const char *path, const char *file)
|
|||
struct lnstat_file *lf;
|
||||
|
||||
/* allocate */
|
||||
lf = malloc(sizeof(*lf));
|
||||
lf = calloc(1, sizeof(*lf));
|
||||
if (!lf) {
|
||||
fprintf(stderr, "out of memory\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* initialize */
|
||||
memset(lf, 0, sizeof(*lf));
|
||||
|
||||
/* de->d_name is guaranteed to be <= NAME_MAX */
|
||||
strcpy(lf->basename, file);
|
||||
strcpy(lf->path, path);
|
||||
|
|
|
|||
|
|
@ -285,6 +285,7 @@ static void dump_kern_db(FILE *fp, int to_hist)
|
|||
|
||||
h = hist_db;
|
||||
if (jw) {
|
||||
jsonw_start_object(jw);
|
||||
jsonw_pretty(jw, pretty);
|
||||
jsonw_name(jw, info_source);
|
||||
jsonw_start_object(jw);
|
||||
|
|
@ -317,6 +318,8 @@ static void dump_kern_db(FILE *fp, int to_hist)
|
|||
}
|
||||
|
||||
if (jw) {
|
||||
jsonw_end_object(jw);
|
||||
|
||||
jsonw_end_object(jw);
|
||||
jsonw_destroy(&jw);
|
||||
}
|
||||
|
|
@ -329,6 +332,7 @@ static void dump_incr_db(FILE *fp)
|
|||
|
||||
h = hist_db;
|
||||
if (jw) {
|
||||
jsonw_start_object(jw);
|
||||
jsonw_pretty(jw, pretty);
|
||||
jsonw_name(jw, info_source);
|
||||
jsonw_start_object(jw);
|
||||
|
|
@ -364,6 +368,8 @@ static void dump_incr_db(FILE *fp)
|
|||
}
|
||||
|
||||
if (jw) {
|
||||
jsonw_end_object(jw);
|
||||
|
||||
jsonw_end_object(jw);
|
||||
jsonw_destroy(&jw);
|
||||
}
|
||||
|
|
|
|||
73
misc/ss.c
73
misc/ss.c
|
|
@ -97,6 +97,7 @@ int show_tcpinfo;
|
|||
int show_bpf;
|
||||
int show_proc_ctx;
|
||||
int show_sock_ctx;
|
||||
int show_header = 1;
|
||||
/* If show_users & show_proc_ctx only do user_ent_hash_build() once */
|
||||
int user_ent_hash_build_init;
|
||||
int follow_events;
|
||||
|
|
@ -1435,11 +1436,13 @@ void *parse_devcond(char *name)
|
|||
a.iface = xll_name_to_index(name);
|
||||
if (a.iface == 0) {
|
||||
char *end;
|
||||
unsigned long res;
|
||||
unsigned long n;
|
||||
|
||||
res = strtoul(name, &end, 0);
|
||||
if (!end || end == name || *end || res > UINT_MAX)
|
||||
n = strtoul(name, &end, 0);
|
||||
if (!end || end == name || *end || n > UINT_MAX)
|
||||
return NULL;
|
||||
|
||||
a.iface = n;
|
||||
}
|
||||
|
||||
res = malloc(sizeof(*res));
|
||||
|
|
@ -2163,11 +2166,17 @@ static int inet_show_sock(struct nlmsghdr *nlh,
|
|||
|
||||
static int tcpdiag_send(int fd, int protocol, struct filter *f)
|
||||
{
|
||||
struct sockaddr_nl nladdr;
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
struct {
|
||||
struct nlmsghdr nlh;
|
||||
struct inet_diag_req r;
|
||||
} req;
|
||||
} req = {
|
||||
.nlh.nlmsg_len = sizeof(req),
|
||||
.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST,
|
||||
.nlh.nlmsg_seq = MAGIC_SEQ,
|
||||
.r.idiag_family = AF_INET,
|
||||
.r.idiag_states = f->states,
|
||||
};
|
||||
char *bc = NULL;
|
||||
int bclen;
|
||||
struct msghdr msg;
|
||||
|
|
@ -2178,20 +2187,10 @@ static int tcpdiag_send(int fd, int protocol, struct filter *f)
|
|||
if (protocol == IPPROTO_UDP)
|
||||
return -1;
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
|
||||
req.nlh.nlmsg_len = sizeof(req);
|
||||
if (protocol == IPPROTO_TCP)
|
||||
req.nlh.nlmsg_type = TCPDIAG_GETSOCK;
|
||||
else
|
||||
req.nlh.nlmsg_type = DCCPDIAG_GETSOCK;
|
||||
req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
|
||||
req.nlh.nlmsg_pid = 0;
|
||||
req.nlh.nlmsg_seq = MAGIC_SEQ;
|
||||
memset(&req.r, 0, sizeof(req.r));
|
||||
req.r.idiag_family = AF_INET;
|
||||
req.r.idiag_states = f->states;
|
||||
if (show_mem) {
|
||||
req.r.idiag_ext |= (1<<(INET_DIAG_MEMINFO-1));
|
||||
req.r.idiag_ext |= (1<<(INET_DIAG_SKMEMINFO-1));
|
||||
|
|
@ -2236,8 +2235,7 @@ static int tcpdiag_send(int fd, int protocol, struct filter *f)
|
|||
|
||||
static int sockdiag_send(int family, int fd, int protocol, struct filter *f)
|
||||
{
|
||||
struct sockaddr_nl nladdr;
|
||||
|
||||
struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
|
||||
DIAG_REQUEST(req, struct inet_diag_req_v2 r);
|
||||
char *bc = NULL;
|
||||
int bclen;
|
||||
|
|
@ -2249,9 +2247,6 @@ static int sockdiag_send(int family, int fd, int protocol, struct filter *f)
|
|||
if (family == PF_UNSPEC)
|
||||
return tcpdiag_send(fd, protocol, f);
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
|
||||
memset(&req.r, 0, sizeof(req.r));
|
||||
req.r.sdiag_family = family;
|
||||
req.r.sdiag_protocol = protocol;
|
||||
|
|
@ -2747,14 +2742,13 @@ static void unix_stats_print(struct sockstat *list, struct filter *f)
|
|||
}
|
||||
|
||||
if (use_proc && f->f) {
|
||||
struct sockstat st;
|
||||
struct sockstat st = {
|
||||
.local.family = AF_UNIX,
|
||||
.remote.family = AF_UNIX,
|
||||
};
|
||||
|
||||
st.local.family = AF_UNIX;
|
||||
st.remote.family = AF_UNIX;
|
||||
memcpy(st.local.data, &s->name, sizeof(s->name));
|
||||
if (strcmp(peer, "*") == 0)
|
||||
memset(st.remote.data, 0, sizeof(peer));
|
||||
else
|
||||
if (strcmp(peer, "*"))
|
||||
memcpy(st.remote.data, &peer, sizeof(peer));
|
||||
if (run_ssfilter(f->f, &st) == 0)
|
||||
continue;
|
||||
|
|
@ -3667,6 +3661,7 @@ static void _usage(FILE *dest)
|
|||
" FAMILY := {inet|inet6|link|unix|netlink|help}\n"
|
||||
"\n"
|
||||
" -K, --kill forcibly close sockets, display what was closed\n"
|
||||
" -H, --no-header Suppress header line\n"
|
||||
"\n"
|
||||
" -A, --query=QUERY, --socket=QUERY\n"
|
||||
" QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink}[,QUERY]\n"
|
||||
|
|
@ -3760,6 +3755,7 @@ static const struct option long_opts[] = {
|
|||
{ "contexts", 0, 0, 'z' },
|
||||
{ "net", 1, 0, 'N' },
|
||||
{ "kill", 0, 0, 'K' },
|
||||
{ "no-header", 0, 0, 'H' },
|
||||
{ 0 }
|
||||
|
||||
};
|
||||
|
|
@ -3774,7 +3770,7 @@ int main(int argc, char *argv[])
|
|||
int ch;
|
||||
int state_filter = 0;
|
||||
|
||||
while ((ch = getopt_long(argc, argv, "dhaletuwxnro460spbEf:miA:D:F:vVzZN:K",
|
||||
while ((ch = getopt_long(argc, argv, "dhaletuwxnro460spbEf:miA:D:F:vVzZN:KH",
|
||||
long_opts, NULL)) != EOF) {
|
||||
switch (ch) {
|
||||
case 'n':
|
||||
|
|
@ -3959,6 +3955,9 @@ int main(int argc, char *argv[])
|
|||
case 'K':
|
||||
current_filter.kill = 1;
|
||||
break;
|
||||
case 'H':
|
||||
show_header = 0;
|
||||
break;
|
||||
case 'h':
|
||||
help();
|
||||
case '?':
|
||||
|
|
@ -4084,19 +4083,23 @@ int main(int argc, char *argv[])
|
|||
|
||||
addr_width = addrp_width - serv_width - 1;
|
||||
|
||||
if (netid_width)
|
||||
printf("%-*s ", netid_width, "Netid");
|
||||
if (state_width)
|
||||
printf("%-*s ", state_width, "State");
|
||||
printf("%-6s %-6s ", "Recv-Q", "Send-Q");
|
||||
if (show_header) {
|
||||
if (netid_width)
|
||||
printf("%-*s ", netid_width, "Netid");
|
||||
if (state_width)
|
||||
printf("%-*s ", state_width, "State");
|
||||
printf("%-6s %-6s ", "Recv-Q", "Send-Q");
|
||||
}
|
||||
|
||||
/* Make enough space for the local/remote port field */
|
||||
addr_width -= 13;
|
||||
serv_width += 13;
|
||||
|
||||
printf("%*s:%-*s %*s:%-*s\n",
|
||||
addr_width, "Local Address", serv_width, "Port",
|
||||
addr_width, "Peer Address", serv_width, "Port");
|
||||
if (show_header) {
|
||||
printf("%*s:%-*s %*s:%-*s\n",
|
||||
addr_width, "Local Address", serv_width, "Port",
|
||||
addr_width, "Peer Address", serv_width, "Port");
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"description": "bridge fdb show",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"dev": {
|
||||
"type": "string"
|
||||
},
|
||||
"dst": {
|
||||
"description" : "host name or ip address",
|
||||
"type": "string"
|
||||
},
|
||||
"flags": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"enum": ["self", "master", "router", "offload"]
|
||||
},
|
||||
"uniqueItems": true
|
||||
},
|
||||
"linkNetNsId": {
|
||||
"type": "integer"
|
||||
},
|
||||
"mac": {
|
||||
"type": "string"
|
||||
},
|
||||
"master": {
|
||||
"type": "string"
|
||||
},
|
||||
"opCode": {
|
||||
"description" : "used to indicate fdb entry del",
|
||||
"enum": ["deleted"]
|
||||
},
|
||||
"port": {
|
||||
"type": "integer"
|
||||
},
|
||||
"state": {
|
||||
"description" : "permanent, static, stale, state=#x",
|
||||
"type": "string"
|
||||
},
|
||||
"updated": {
|
||||
"type": "integer"
|
||||
},
|
||||
"used": {
|
||||
"type": "integer"
|
||||
},
|
||||
"viaIf": {
|
||||
"type": "string"
|
||||
},
|
||||
"viaIfIndex": {
|
||||
"type": "integer"
|
||||
},
|
||||
"vlan": {
|
||||
"type": "integer"
|
||||
},
|
||||
"vni": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -56,8 +56,8 @@ static int parse_bpf(struct exec_util *eu, int argc, char **argv)
|
|||
char **argv_run = argv_default, **envp_run, *tmp;
|
||||
int ret, i, env_old, env_num, env_map;
|
||||
const char *bpf_uds_name = NULL;
|
||||
int fds[BPF_SCM_MAX_FDS];
|
||||
struct bpf_map_aux aux;
|
||||
int fds[BPF_SCM_MAX_FDS] = {};
|
||||
struct bpf_map_aux aux = {};
|
||||
|
||||
if (argc == 0)
|
||||
return 0;
|
||||
|
|
@ -115,9 +115,6 @@ static int parse_bpf(struct exec_util *eu, int argc, char **argv)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(fds, 0, sizeof(fds));
|
||||
memset(&aux, 0, sizeof(aux));
|
||||
|
||||
ret = bpf_recv_map_fds(bpf_uds_name, fds, &aux, ARRAY_SIZE(fds));
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "bpf: Could not receive fds!\n");
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@ static int canid_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
|||
if (args == NULL)
|
||||
return PARSE_ERR(args, "canid: missing arguments");
|
||||
|
||||
rules.rules_raw = malloc(sizeof(struct can_filter) * rules.rules_capacity);
|
||||
memset(rules.rules_raw, 0, sizeof(struct can_filter) * rules.rules_capacity);
|
||||
rules.rules_raw = calloc(rules.rules_capacity,
|
||||
sizeof(struct can_filter));
|
||||
|
||||
do {
|
||||
if (!bstrcmp(args, "sff")) {
|
||||
|
|
|
|||
|
|
@ -44,9 +44,7 @@ static int cmp_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
|||
int align, opnd = 0;
|
||||
unsigned long offset = 0, layer = TCF_LAYER_NETWORK, mask = 0, value = 0;
|
||||
int offset_present = 0, value_present = 0;
|
||||
struct tcf_em_cmp cmp;
|
||||
|
||||
memset(&cmp, 0, sizeof(cmp));
|
||||
struct tcf_em_cmp cmp = {};
|
||||
|
||||
#define PARSE_ERR(CARG, FMT, ARGS...) \
|
||||
em_parse_error(EINVAL, args, CARG, &cmp_ematch_util, FMT, ##ARGS)
|
||||
|
|
|
|||
|
|
@ -198,11 +198,9 @@ static void ipset_print_usage(FILE *fd)
|
|||
static int ipset_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
||||
struct bstr *args)
|
||||
{
|
||||
struct xt_set_info set_info;
|
||||
struct xt_set_info set_info = {};
|
||||
int ret;
|
||||
|
||||
memset(&set_info, 0, sizeof(set_info));
|
||||
|
||||
#define PARSE_ERR(CARG, FMT, ARGS...) \
|
||||
em_parse_error(EINVAL, args, CARG, &ipset_ematch_util, FMT, ##ARGS)
|
||||
|
||||
|
|
|
|||
|
|
@ -361,11 +361,9 @@ static int meta_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
|||
{
|
||||
int opnd;
|
||||
struct bstr *a;
|
||||
struct tcf_meta_hdr meta_hdr;
|
||||
struct tcf_meta_hdr meta_hdr = {};
|
||||
unsigned long lvalue = 0, rvalue = 0;
|
||||
|
||||
memset(&meta_hdr, 0, sizeof(meta_hdr));
|
||||
|
||||
if (args == NULL)
|
||||
return PARSE_ERR(args, "meta: missing arguments");
|
||||
|
||||
|
|
@ -485,8 +483,9 @@ static int print_object(FILE *fd, struct tcf_meta_val *obj, struct rtattr *rta)
|
|||
if (RTA_PAYLOAD(rta) < sizeof(__u32))
|
||||
goto size_mismatch;
|
||||
|
||||
fprintf(fd, " mask 0x%08x",
|
||||
rta_getattr_u32(rta));
|
||||
if (rta_getattr_u32(rta))
|
||||
fprintf(fd, " mask 0x%08x",
|
||||
rta_getattr_u32(rta));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,9 +44,7 @@ static int nbyte_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
|||
struct bstr *needle = args;
|
||||
unsigned long offset = 0, layer = TCF_LAYER_NETWORK;
|
||||
int offset_present = 0;
|
||||
struct tcf_em_nbyte nb;
|
||||
|
||||
memset(&nb, 0, sizeof(nb));
|
||||
struct tcf_em_nbyte nb = {};
|
||||
|
||||
#define PARSE_ERR(CARG, FMT, ARGS...) \
|
||||
em_parse_error(EINVAL, args, CARG, &nbyte_ematch_util, FMT, ##ARGS)
|
||||
|
|
|
|||
|
|
@ -39,9 +39,7 @@ static int u32_parse_eopt(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr,
|
|||
struct bstr *a;
|
||||
int align, nh_len;
|
||||
unsigned long key, mask, offmask = 0, offset;
|
||||
struct tc_u32_key u_key;
|
||||
|
||||
memset(&u_key, 0, sizeof(u_key));
|
||||
struct tc_u32_key u_key = {};
|
||||
|
||||
#define PARSE_ERR(CARG, FMT, ARGS...) \
|
||||
em_parse_error(EINVAL, args, CARG, &u32_ematch_util, FMT, ##ARGS)
|
||||
|
|
|
|||
|
|
@ -133,7 +133,6 @@ out:
|
|||
static int flow_parse_opt(struct filter_util *fu, char *handle,
|
||||
int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_police tp;
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
struct rtattr *tail;
|
||||
__u32 mask = ~0U, xor = 0;
|
||||
|
|
@ -141,8 +140,6 @@ static int flow_parse_opt(struct filter_util *fu, char *handle,
|
|||
__u32 mode = FLOW_MODE_MAP;
|
||||
__u32 tmp;
|
||||
|
||||
memset(&tp, 0, sizeof(tp));
|
||||
|
||||
if (handle) {
|
||||
if (get_u32(&t->tcm_handle, handle, 0)) {
|
||||
fprintf(stderr, "Illegal \"handle\"\n");
|
||||
|
|
|
|||
|
|
@ -203,10 +203,9 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
|
|||
} else if (matches(*argv, "skip_sw") == 0) {
|
||||
flags |= TCA_CLS_FLAGS_SKIP_SW;
|
||||
} else if (matches(*argv, "indev") == 0) {
|
||||
char ifname[IFNAMSIZ];
|
||||
char ifname[IFNAMSIZ] = {};
|
||||
|
||||
NEXT_ARG();
|
||||
memset(ifname, 0, sizeof(ifname));
|
||||
strncpy(ifname, *argv, sizeof(ifname) - 1);
|
||||
addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, ifname);
|
||||
} else if (matches(*argv, "dst_mac") == 0) {
|
||||
|
|
|
|||
|
|
@ -33,14 +33,11 @@ static void explain(void)
|
|||
|
||||
static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_police tp;
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
struct rtattr *tail;
|
||||
__u32 mask = 0;
|
||||
int mask_set = 0;
|
||||
|
||||
memset(&tp, 0, sizeof(tp));
|
||||
|
||||
if (handle) {
|
||||
char *slash;
|
||||
|
||||
|
|
@ -94,9 +91,8 @@ static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **a
|
|||
}
|
||||
continue;
|
||||
} else if (strcmp(*argv, "indev") == 0) {
|
||||
char d[IFNAMSIZ+1];
|
||||
char d[IFNAMSIZ+1] = {};
|
||||
|
||||
memset(d, 0, sizeof(d));
|
||||
argc--;
|
||||
argv++;
|
||||
if (argc < 1) {
|
||||
|
|
|
|||
|
|
@ -36,14 +36,11 @@ static void explain(void)
|
|||
|
||||
static int route_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_police tp;
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
struct rtattr *tail;
|
||||
__u32 fh = 0xFFFF8000;
|
||||
__u32 order = 0;
|
||||
|
||||
memset(&tp, 0, sizeof(tp));
|
||||
|
||||
if (handle) {
|
||||
if (get_u32(&t->tcm_handle, handle, 0)) {
|
||||
fprintf(stderr, "Illegal \"handle\"\n");
|
||||
|
|
|
|||
|
|
@ -173,15 +173,11 @@ done:
|
|||
static int rsvp_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int family = strcmp(qu->id, "rsvp") == 0 ? AF_INET : AF_INET6;
|
||||
struct tc_rsvp_pinfo pinfo;
|
||||
struct tc_police tp;
|
||||
struct tc_rsvp_pinfo pinfo = {};
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
int pinfo_ok = 0;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&pinfo, 0, sizeof(pinfo));
|
||||
memset(&tp, 0, sizeof(tp));
|
||||
|
||||
if (handle) {
|
||||
if (get_u32(&t->tcm_handle, handle, 0)) {
|
||||
fprintf(stderr, "Illegal \"handle\"\n");
|
||||
|
|
|
|||
12
tc/f_u32.c
12
tc/f_u32.c
|
|
@ -988,7 +988,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
|
|||
struct {
|
||||
struct tc_u32_sel sel;
|
||||
struct tc_u32_key keys[128];
|
||||
} sel;
|
||||
} sel = {};
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
struct rtattr *tail;
|
||||
int sel_ok = 0, terminal_ok = 0;
|
||||
|
|
@ -997,8 +997,6 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
|
|||
__u32 order = 0;
|
||||
__u32 flags = 0;
|
||||
|
||||
memset(&sel, 0, sizeof(sel));
|
||||
|
||||
if (handle && get_u32_handle(&t->tcm_handle, handle)) {
|
||||
fprintf(stderr, "Illegal filter ID\n");
|
||||
return -1;
|
||||
|
|
@ -1093,12 +1091,11 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
|
|||
} else if (strcmp(*argv, "sample") == 0) {
|
||||
__u32 hash;
|
||||
unsigned int divisor = 0x100;
|
||||
|
||||
struct {
|
||||
struct tc_u32_sel sel;
|
||||
struct tc_u32_key keys[4];
|
||||
} sel2;
|
||||
memset(&sel2, 0, sizeof(sel2));
|
||||
} sel2 = {};
|
||||
|
||||
NEXT_ARG();
|
||||
if (parse_selector(&argc, &argv, &sel2.sel, n)) {
|
||||
fprintf(stderr, "Illegal \"sample\"\n");
|
||||
|
|
@ -1125,9 +1122,8 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
|
|||
sample_ok = 1;
|
||||
continue;
|
||||
} else if (strcmp(*argv, "indev") == 0) {
|
||||
char ind[IFNAMSIZ + 1];
|
||||
char ind[IFNAMSIZ + 1] = {};
|
||||
|
||||
memset(ind, 0, sizeof(ind));
|
||||
argc--;
|
||||
argv++;
|
||||
if (argc < 1) {
|
||||
|
|
|
|||
|
|
@ -126,9 +126,8 @@ noexist:
|
|||
goto restart_s;
|
||||
}
|
||||
#endif
|
||||
a = malloc(sizeof(*a));
|
||||
a = calloc(1, sizeof(*a));
|
||||
if (a) {
|
||||
memset(a, 0, sizeof(*a));
|
||||
strncpy(a->id, "noact", 15);
|
||||
a->parse_aopt = parse_noaopt;
|
||||
a->print_aopt = print_noaopt;
|
||||
|
|
@ -395,13 +394,10 @@ static int tc_action_gd(int cmd, unsigned int flags, int *argc_p, char ***argv_p
|
|||
struct tcamsg t;
|
||||
char buf[MAX_MSG];
|
||||
} req = {
|
||||
.n = {
|
||||
.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcamsg)),
|
||||
.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.nlmsg_type = cmd,
|
||||
},
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcamsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.t.tca_family = AF_UNSPEC,
|
||||
.buf = { 0 }
|
||||
};
|
||||
|
||||
argc -= 1;
|
||||
|
|
@ -491,23 +487,18 @@ static int tc_action_modify(int cmd, unsigned int flags, int *argc_p, char ***ar
|
|||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ret = 0;
|
||||
|
||||
struct rtattr *tail;
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct tcamsg t;
|
||||
char buf[MAX_MSG];
|
||||
} req = {
|
||||
.n = {
|
||||
.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcamsg)),
|
||||
.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.nlmsg_type = cmd,
|
||||
},
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcamsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.t.tca_family = AF_UNSPEC,
|
||||
.buf = { 0 }
|
||||
};
|
||||
struct rtattr *tail = NLMSG_TAIL(&req.n);
|
||||
|
||||
tail = NLMSG_TAIL(&req.n);
|
||||
argc -= 1;
|
||||
argv += 1;
|
||||
if (parse_action(&argc, &argv, TCA_ACT_TAB, &req.n)) {
|
||||
|
|
@ -540,7 +531,6 @@ static int tc_act_list_or_flush(int argc, char **argv, int event)
|
|||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcamsg)),
|
||||
.t.tca_family = AF_UNSPEC,
|
||||
.buf = { 0 }
|
||||
};
|
||||
|
||||
tail = NLMSG_TAIL(&req.n);
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ static int bpf_parse_opt(struct action_util *a, int *ptr_argc, char ***ptr_argv,
|
|||
int tca_id, struct nlmsghdr *n)
|
||||
{
|
||||
const char *bpf_obj = NULL, *bpf_uds_name = NULL;
|
||||
struct tc_act_bpf parm;
|
||||
struct tc_act_bpf parm = { .action = TC_ACT_PIPE };
|
||||
bool seen_run = false;
|
||||
struct rtattr *tail;
|
||||
int argc, ret = 0;
|
||||
|
|
@ -104,9 +104,6 @@ opt_bpf:
|
|||
NEXT_ARG_FWD();
|
||||
}
|
||||
|
||||
memset(&parm, 0, sizeof(parm));
|
||||
parm.action = TC_ACT_PIPE;
|
||||
|
||||
if (argc) {
|
||||
if (matches(*argv, "reclassify") == 0) {
|
||||
parm.action = TC_ACT_RECLASSIFY;
|
||||
|
|
|
|||
|
|
@ -85,15 +85,13 @@ static int
|
|||
parse_csum(struct action_util *a, int *argc_p,
|
||||
char ***argv_p, int tca_id, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_csum sel;
|
||||
struct tc_csum sel = {};
|
||||
|
||||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ok = 0;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&sel, 0, sizeof(sel));
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "csum") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -177,9 +177,7 @@ static int parse_tree(struct nlmsghdr *n, struct ematch *tree)
|
|||
|
||||
for (t = tree; t; t = t->next) {
|
||||
struct rtattr *tail = NLMSG_TAIL(n);
|
||||
struct tcf_ematch_hdr hdr = {
|
||||
.flags = t->relation
|
||||
};
|
||||
struct tcf_ematch_hdr hdr = { .flags = t->relation };
|
||||
|
||||
if (t->inverted)
|
||||
hdr.flags |= TCF_EM_INVERT;
|
||||
|
|
|
|||
|
|
@ -97,16 +97,13 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
char **argv = *argv_p;
|
||||
int ok = 0;
|
||||
int action = TC_POLICE_RECLASSIFY;
|
||||
struct tc_gact p;
|
||||
struct tc_gact p = { .action = TC_POLICE_RECLASSIFY };
|
||||
#ifdef CONFIG_GACT_PROB
|
||||
int rd = 0;
|
||||
struct tc_gact_p pp;
|
||||
#endif
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
p.action = TC_POLICE_RECLASSIFY;
|
||||
|
||||
if (argc < 0)
|
||||
return -1;
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ok = 0;
|
||||
struct tc_ife p;
|
||||
struct tc_ife p = { .action = TC_ACT_PIPE }; /* good default */
|
||||
struct rtattr *tail;
|
||||
struct rtattr *tail2;
|
||||
char dbuf[ETH_ALEN];
|
||||
|
|
@ -69,9 +69,6 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
char *daddr = NULL;
|
||||
char *saddr = NULL;
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
p.action = TC_ACT_PIPE; /* good default */
|
||||
|
||||
if (argc <= 0)
|
||||
return -1;
|
||||
|
||||
|
|
|
|||
13
tc/m_ipt.c
13
tc/m_ipt.c
|
|
@ -164,16 +164,11 @@ get_target_name(const char *name)
|
|||
return NULL;
|
||||
#endif
|
||||
|
||||
new_name = malloc(strlen(name) + 1);
|
||||
lname = malloc(strlen(name) + 1);
|
||||
if (new_name)
|
||||
memset(new_name, '\0', strlen(name) + 1);
|
||||
else
|
||||
new_name = calloc(1, strlen(name) + 1);
|
||||
lname = calloc(1, strlen(name) + 1);
|
||||
if (!new_name)
|
||||
exit_error(PARAMETER_PROBLEM, "get_target_name");
|
||||
|
||||
if (lname)
|
||||
memset(lname, '\0', strlen(name) + 1);
|
||||
else
|
||||
if (!lname)
|
||||
exit_error(PARAMETER_PROBLEM, "get_target_name");
|
||||
|
||||
strcpy(new_name, name);
|
||||
|
|
|
|||
|
|
@ -69,12 +69,9 @@ parse_egress(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ok = 0, iok = 0, mirror = 0, redir = 0;
|
||||
struct tc_mirred p;
|
||||
struct tc_mirred p = {};
|
||||
struct rtattr *tail;
|
||||
char d[16];
|
||||
|
||||
memset(d, 0, sizeof(d)-1);
|
||||
memset(&p, 0, sizeof(struct tc_mirred));
|
||||
char d[16] = {};
|
||||
|
||||
while (argc > 0) {
|
||||
|
||||
|
|
|
|||
|
|
@ -84,15 +84,13 @@ bad_val:
|
|||
static int
|
||||
parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_nat sel;
|
||||
struct tc_nat sel = {};
|
||||
|
||||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ok = 0;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&sel, 0, sizeof(sel));
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "nat") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
11
tc/m_pedit.c
11
tc/m_pedit.c
|
|
@ -107,9 +107,8 @@ reg:
|
|||
return p;
|
||||
|
||||
noexist:
|
||||
p = malloc(sizeof(*p));
|
||||
p = calloc(1, sizeof(*p));
|
||||
if (p) {
|
||||
memset(p, 0, sizeof(*p));
|
||||
strncpy(p->id, str, sizeof(p->id) - 1);
|
||||
p->parse_peopt = pedit_parse_nopopt;
|
||||
goto reg;
|
||||
|
|
@ -392,7 +391,7 @@ done:
|
|||
|
||||
static int parse_munge(int *argc_p, char ***argv_p, struct tc_pedit_sel *sel)
|
||||
{
|
||||
struct tc_pedit_key tkey;
|
||||
struct tc_pedit_key tkey = {};
|
||||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int res = -1;
|
||||
|
|
@ -400,8 +399,6 @@ static int parse_munge(int *argc_p, char ***argv_p, struct tc_pedit_sel *sel)
|
|||
if (argc <= 0)
|
||||
return -1;
|
||||
|
||||
memset(&tkey, 0, sizeof(tkey));
|
||||
|
||||
if (matches(*argv, "offset") == 0) {
|
||||
NEXT_ARG();
|
||||
res = parse_offset(&argc, &argv, sel, &tkey);
|
||||
|
|
@ -442,15 +439,13 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
|
|||
struct {
|
||||
struct tc_pedit_sel sel;
|
||||
struct tc_pedit_key keys[MAX_OFFS];
|
||||
} sel;
|
||||
} sel = {};
|
||||
|
||||
int argc = *argc_p;
|
||||
char **argv = *argv_p;
|
||||
int ok = 0, iok = 0;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&sel, 0, sizeof(sel));
|
||||
|
||||
while (argc > 0) {
|
||||
if (pedit_debug > 1)
|
||||
fprintf(stderr, "while pedit (%d:%s)\n", argc, *argv);
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
char **argv = *argv_p;
|
||||
int res = -1;
|
||||
int ok = 0;
|
||||
struct tc_police p;
|
||||
struct tc_police p = { .action = TC_POLICE_RECLASSIFY };
|
||||
__u32 rtab[256];
|
||||
__u32 ptab[256];
|
||||
__u32 avrate = 0;
|
||||
|
|
@ -138,9 +138,6 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
|
|||
int Rcell_log = -1, Pcell_log = -1;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
p.action = TC_POLICE_RECLASSIFY;
|
||||
|
||||
if (a) /* new way of doing things */
|
||||
NEXT_ARG();
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ static void explain(void)
|
|||
static int atm_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct sockaddr_atmsvc addr;
|
||||
struct sockaddr_atmsvc addr = {};
|
||||
struct atm_qos qos;
|
||||
struct atm_sap sap;
|
||||
unsigned char hdr[MAX_HDR_LEN];
|
||||
|
|
@ -58,7 +58,6 @@ static int atm_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
|
|||
int set_clip = 0;
|
||||
int s;
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
(void) text2qos("aal5,ubr:sdu=9180,rx:none", &qos, 0);
|
||||
(void) text2sap("blli:l2=iso8802", &sap, 0);
|
||||
while (argc > 0) {
|
||||
|
|
|
|||
22
tc/q_cbq.c
22
tc/q_cbq.c
|
|
@ -49,8 +49,8 @@ static void explain1(char *arg)
|
|||
|
||||
static int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_ratespec r;
|
||||
struct tc_cbq_lssopt lss;
|
||||
struct tc_ratespec r = {};
|
||||
struct tc_cbq_lssopt lss = {};
|
||||
__u32 rtab[256];
|
||||
unsigned mpu = 0, avpkt = 0, allot = 0;
|
||||
unsigned short overhead = 0;
|
||||
|
|
@ -59,9 +59,6 @@ static int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
|
|||
int ewma_log = -1;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&lss, 0, sizeof(lss));
|
||||
memset(&r, 0, sizeof(r));
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "bandwidth") == 0 ||
|
||||
matches(*argv, "rate") == 0) {
|
||||
|
|
@ -183,11 +180,10 @@ static int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
|
|||
static int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int wrr_ok = 0, fopt_ok = 0;
|
||||
struct tc_ratespec r;
|
||||
struct tc_cbq_lssopt lss;
|
||||
struct tc_cbq_wrropt wrr;
|
||||
struct tc_cbq_fopt fopt;
|
||||
struct tc_cbq_ovl ovl;
|
||||
struct tc_ratespec r = {};
|
||||
struct tc_cbq_lssopt lss = {};
|
||||
struct tc_cbq_wrropt wrr = {};
|
||||
struct tc_cbq_fopt fopt = {};
|
||||
__u32 rtab[256];
|
||||
unsigned mpu = 0;
|
||||
int cell_log = -1;
|
||||
|
|
@ -198,12 +194,6 @@ static int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, str
|
|||
unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&r, 0, sizeof(r));
|
||||
memset(&lss, 0, sizeof(lss));
|
||||
memset(&wrr, 0, sizeof(wrr));
|
||||
memset(&fopt, 0, sizeof(fopt));
|
||||
memset(&ovl, 0, sizeof(ovl));
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "rate") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ static void explain(void)
|
|||
static int choke_parse_opt(struct qdisc_util *qu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_red_qopt opt;
|
||||
struct tc_red_qopt opt = {};
|
||||
unsigned int burst = 0;
|
||||
unsigned int avpkt = 1000;
|
||||
double probability = 0.02;
|
||||
|
|
@ -45,8 +45,6 @@ static int choke_parse_opt(struct qdisc_util *qu, int argc, char **argv,
|
|||
__u32 max_P;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "limit") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ static int codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
|
|||
static int codel_print_xstats(struct qdisc_util *qu, FILE *f,
|
||||
struct rtattr *xstats)
|
||||
{
|
||||
struct tc_codel_xstats _st, *st;
|
||||
struct tc_codel_xstats _st = {}, *st;
|
||||
|
||||
SPRINT_BUF(b1);
|
||||
|
||||
|
|
@ -184,7 +184,6 @@ static int codel_print_xstats(struct qdisc_util *qu, FILE *f,
|
|||
|
||||
st = RTA_DATA(xstats);
|
||||
if (RTA_PAYLOAD(xstats) < sizeof(*st)) {
|
||||
memset(&_st, 0, sizeof(_st));
|
||||
memcpy(&_st, st, RTA_PAYLOAD(xstats));
|
||||
st = &_st;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,7 +128,6 @@ static int dsmark_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
|
|||
struct rtattr *tb[TCA_DSMARK_MAX+1];
|
||||
|
||||
if (!opt) return 0;
|
||||
memset(tb, 0, sizeof(tb));
|
||||
parse_rtattr(tb, TCA_DSMARK_MAX, RTA_DATA(opt), RTA_PAYLOAD(opt));
|
||||
if (tb[TCA_DSMARK_MASK]) {
|
||||
if (!RTA_PAYLOAD(tb[TCA_DSMARK_MASK]))
|
||||
|
|
|
|||
|
|
@ -31,9 +31,7 @@ static void explain(void)
|
|||
static int fifo_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int ok = 0;
|
||||
struct tc_fifo_qopt opt;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
struct tc_fifo_qopt opt = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "limit") == 0) {
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@ static int fq_codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt
|
|||
static int fq_codel_print_xstats(struct qdisc_util *qu, FILE *f,
|
||||
struct rtattr *xstats)
|
||||
{
|
||||
struct tc_fq_codel_xstats _st, *st;
|
||||
struct tc_fq_codel_xstats _st = {}, *st;
|
||||
|
||||
SPRINT_BUF(b1);
|
||||
|
||||
|
|
@ -229,7 +229,6 @@ static int fq_codel_print_xstats(struct qdisc_util *qu, FILE *f,
|
|||
|
||||
st = RTA_DATA(xstats);
|
||||
if (RTA_PAYLOAD(xstats) < sizeof(*st)) {
|
||||
memset(&_st, 0, sizeof(_st));
|
||||
memcpy(&_st, st, RTA_PAYLOAD(xstats));
|
||||
st = &_st;
|
||||
}
|
||||
|
|
|
|||
13
tc/q_hfsc.c
13
tc/q_hfsc.c
|
|
@ -73,9 +73,7 @@ explain1(char *arg)
|
|||
static int
|
||||
hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_hfsc_qopt qopt;
|
||||
|
||||
memset(&qopt, 0, sizeof(qopt));
|
||||
struct tc_hfsc_qopt qopt = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "default") == 0) {
|
||||
|
|
@ -146,15 +144,10 @@ static int
|
|||
hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_service_curve rsc, fsc, usc;
|
||||
int rsc_ok, fsc_ok, usc_ok;
|
||||
struct tc_service_curve rsc = {}, fsc = {}, usc = {};
|
||||
int rsc_ok = 0, fsc_ok = 0, usc_ok = 0;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&rsc, 0, sizeof(rsc));
|
||||
memset(&fsc, 0, sizeof(fsc));
|
||||
memset(&usc, 0, sizeof(usc));
|
||||
rsc_ok = fsc_ok = usc_ok = 0;
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "rt") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
15
tc/q_htb.c
15
tc/q_htb.c
|
|
@ -63,14 +63,13 @@ static void explain1(char *arg)
|
|||
static int htb_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
unsigned int direct_qlen = ~0U;
|
||||
struct tc_htb_glob opt;
|
||||
struct tc_htb_glob opt = {
|
||||
.rate2quantum = 10,
|
||||
.version = 3,
|
||||
};
|
||||
struct rtattr *tail;
|
||||
unsigned int i; char *p;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
opt.rate2quantum = 10;
|
||||
opt.version = 3;
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "r2q") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
@ -113,19 +112,17 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
|
|||
static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int ok = 0;
|
||||
struct tc_htb_opt opt;
|
||||
struct tc_htb_opt opt = {};
|
||||
__u32 rtab[256], ctab[256];
|
||||
unsigned buffer = 0, cbuffer = 0;
|
||||
int cell_log = -1, ccell_log = -1;
|
||||
unsigned int mtu;
|
||||
unsigned int mtu = 1600; /* eth packet len */
|
||||
unsigned short mpu = 0;
|
||||
unsigned short overhead = 0;
|
||||
unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */
|
||||
struct rtattr *tail;
|
||||
__u64 ceil64 = 0, rate64 = 0;
|
||||
|
||||
memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "prio") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
16
tc/q_netem.c
16
tc/q_netem.c
|
|
@ -175,23 +175,17 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
|
|||
int dist_size = 0;
|
||||
struct rtattr *tail;
|
||||
struct tc_netem_qopt opt = { .limit = 1000 };
|
||||
struct tc_netem_corr cor;
|
||||
struct tc_netem_reorder reorder;
|
||||
struct tc_netem_corrupt corrupt;
|
||||
struct tc_netem_corr cor = {};
|
||||
struct tc_netem_reorder reorder = {};
|
||||
struct tc_netem_corrupt corrupt = {};
|
||||
struct tc_netem_gimodel gimodel;
|
||||
struct tc_netem_gemodel gemodel;
|
||||
struct tc_netem_rate rate;
|
||||
struct tc_netem_rate rate = {};
|
||||
__s16 *dist_data = NULL;
|
||||
__u16 loss_type = NETEM_LOSS_UNSPEC;
|
||||
int present[__TCA_NETEM_MAX];
|
||||
int present[__TCA_NETEM_MAX] = {};
|
||||
__u64 rate64 = 0;
|
||||
|
||||
memset(&cor, 0, sizeof(cor));
|
||||
memset(&reorder, 0, sizeof(reorder));
|
||||
memset(&corrupt, 0, sizeof(corrupt));
|
||||
memset(&rate, 0, sizeof(rate));
|
||||
memset(present, 0, sizeof(present));
|
||||
|
||||
for ( ; argc > 0; --argc, ++argv) {
|
||||
if (matches(*argv, "limit") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ static void explain(void)
|
|||
|
||||
static int red_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_red_qopt opt;
|
||||
struct tc_red_qopt opt = {};
|
||||
unsigned int burst = 0;
|
||||
unsigned int avpkt = 0;
|
||||
double probability = 0.02;
|
||||
|
|
@ -45,8 +45,6 @@ static int red_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
|
|||
__u32 max_P;
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "limit") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
17
tc/q_sfb.c
17
tc/q_sfb.c
|
|
@ -51,17 +51,16 @@ static int get_prob(__u32 *val, const char *arg)
|
|||
static int sfb_parse_opt(struct qdisc_util *qu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
struct tc_sfb_qopt opt;
|
||||
struct tc_sfb_qopt opt = {
|
||||
.rehash_interval = 600*1000,
|
||||
.warmup_time = 60*1000,
|
||||
.penalty_rate = 10,
|
||||
.penalty_burst = 20,
|
||||
.increment = (SFB_MAX_PROB + 1000) / 2000,
|
||||
.decrement = (SFB_MAX_PROB + 10000) / 20000,
|
||||
};
|
||||
struct rtattr *tail;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
opt.rehash_interval = 600*1000;
|
||||
opt.warmup_time = 60*1000;
|
||||
opt.penalty_rate = 10;
|
||||
opt.penalty_burst = 20;
|
||||
opt.increment = (SFB_MAX_PROB + 1000) / 2000;
|
||||
opt.decrement = (SFB_MAX_PROB + 10000) / 20000;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "rehash") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -38,14 +38,12 @@ static void explain(void)
|
|||
static int sfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int ok = 0, red = 0;
|
||||
struct tc_sfq_qopt_v1 opt;
|
||||
struct tc_sfq_qopt_v1 opt = {};
|
||||
unsigned int burst = 0;
|
||||
int wlog;
|
||||
unsigned int avpkt = 1000;
|
||||
double probability = 0.02;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "quantum") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ static void explain1(const char *arg, const char *val)
|
|||
static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
|
||||
{
|
||||
int ok = 0;
|
||||
struct tc_tbf_qopt opt;
|
||||
struct tc_tbf_qopt opt = {};
|
||||
__u32 rtab[256];
|
||||
__u32 ptab[256];
|
||||
unsigned buffer = 0, mtu = 0, mpu = 0, latency = 0;
|
||||
|
|
@ -49,8 +49,6 @@ static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
|
|||
struct rtattr *tail;
|
||||
__u64 rate64 = 0, prate64 = 0;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "limit") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
9
tc/tc.c
9
tc/tc.c
|
|
@ -133,11 +133,9 @@ reg:
|
|||
return q;
|
||||
|
||||
noexist:
|
||||
q = malloc(sizeof(*q));
|
||||
q = calloc(1, sizeof(*q));
|
||||
if (q) {
|
||||
|
||||
memset(q, 0, sizeof(*q));
|
||||
q->id = strcpy(malloc(strlen(str)+1), str);
|
||||
q->id = strdup(str);
|
||||
q->parse_qopt = parse_noqopt;
|
||||
q->print_qopt = print_noqopt;
|
||||
goto reg;
|
||||
|
|
@ -177,9 +175,8 @@ reg:
|
|||
filter_list = q;
|
||||
return q;
|
||||
noexist:
|
||||
q = malloc(sizeof(*q));
|
||||
q = calloc(1, sizeof(*q));
|
||||
if (q) {
|
||||
memset(q, 0, sizeof(*q));
|
||||
strncpy(q->id, str, 15);
|
||||
q->parse_fopt = parse_nofopt;
|
||||
q->print_fopt = print_nofopt;
|
||||
|
|
|
|||
65
tc/tc_bpf.c
65
tc/tc_bpf.c
|
|
@ -54,6 +54,10 @@
|
|||
#define AF_ALG 38
|
||||
#endif
|
||||
|
||||
#ifndef EM_BPF
|
||||
#define EM_BPF 247
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ELF
|
||||
static int bpf_obj_open(const char *path, enum bpf_prog_type type,
|
||||
const char *sec, bool verbose);
|
||||
|
|
@ -86,9 +90,8 @@ static int bpf(int cmd, union bpf_attr *attr, unsigned int size)
|
|||
static int bpf_map_update(int fd, const void *key, const void *value,
|
||||
uint64_t flags)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
union bpf_attr attr = {};
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.map_fd = fd;
|
||||
attr.key = bpf_ptr_to_u64(key);
|
||||
attr.value = bpf_ptr_to_u64(value);
|
||||
|
|
@ -109,12 +112,10 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
|||
FILE *fp;
|
||||
|
||||
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
||||
tmp_string = malloc(tmp_len);
|
||||
tmp_string = calloc(1, tmp_len);
|
||||
if (tmp_string == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(tmp_string, 0, tmp_len);
|
||||
|
||||
fp = fopen(arg, "r");
|
||||
if (fp == NULL) {
|
||||
perror("Cannot fopen");
|
||||
|
|
@ -243,7 +244,7 @@ static int bpf_map_selfcheck_pinned(int fd, const struct bpf_elf_map *map,
|
|||
int length)
|
||||
{
|
||||
char file[PATH_MAX], buff[4096];
|
||||
struct bpf_elf_map tmp, zero;
|
||||
struct bpf_elf_map tmp = {}, zero = {};
|
||||
unsigned int val;
|
||||
FILE *fp;
|
||||
|
||||
|
|
@ -255,7 +256,6 @@ static int bpf_map_selfcheck_pinned(int fd, const struct bpf_elf_map *map,
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
while (fgets(buff, sizeof(buff), fp)) {
|
||||
if (sscanf(buff, "map_type:\t%u", &val) == 1)
|
||||
tmp.type = val;
|
||||
|
|
@ -274,7 +274,6 @@ static int bpf_map_selfcheck_pinned(int fd, const struct bpf_elf_map *map,
|
|||
if (!memcmp(&tmp, map, length)) {
|
||||
return 0;
|
||||
} else {
|
||||
memset(&zero, 0, sizeof(zero));
|
||||
/* If kernel doesn't have eBPF-related fdinfo, we cannot do much,
|
||||
* so just accept it. We know we do have an eBPF fd and in this
|
||||
* case, everything is 0. It is guaranteed that no such map exists
|
||||
|
|
@ -465,7 +464,7 @@ done:
|
|||
|
||||
static int bpf_obj_get(const char *pathname)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
union bpf_attr attr = {};
|
||||
char tmp[PATH_MAX];
|
||||
|
||||
if (strlen(pathname) > 2 && pathname[0] == 'm' &&
|
||||
|
|
@ -475,7 +474,6 @@ static int bpf_obj_get(const char *pathname)
|
|||
pathname = tmp;
|
||||
}
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.pathname = bpf_ptr_to_u64(pathname);
|
||||
|
||||
return bpf(BPF_OBJ_GET, &attr, sizeof(attr));
|
||||
|
|
@ -806,9 +804,8 @@ static int bpf_map_create(enum bpf_map_type type, uint32_t size_key,
|
|||
uint32_t size_value, uint32_t max_elem,
|
||||
uint32_t flags)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
union bpf_attr attr = {};
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.map_type = type;
|
||||
attr.key_size = size_key;
|
||||
attr.value_size = size_value;
|
||||
|
|
@ -822,9 +819,8 @@ static int bpf_prog_load(enum bpf_prog_type type, const struct bpf_insn *insns,
|
|||
size_t size_insns, const char *license, char *log,
|
||||
size_t size_log)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
union bpf_attr attr = {};
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = type;
|
||||
attr.insns = bpf_ptr_to_u64(insns);
|
||||
attr.insn_cnt = size_insns / sizeof(struct bpf_insn);
|
||||
|
|
@ -841,9 +837,8 @@ static int bpf_prog_load(enum bpf_prog_type type, const struct bpf_insn *insns,
|
|||
|
||||
static int bpf_obj_pin(int fd, const char *pathname)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
union bpf_attr attr = {};
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.pathname = bpf_ptr_to_u64(pathname);
|
||||
attr.bpf_fd = fd;
|
||||
|
||||
|
|
@ -1628,7 +1623,7 @@ static bool bpf_pinning_reserved(uint32_t pinning)
|
|||
static void bpf_hash_init(struct bpf_elf_ctx *ctx, const char *db_file)
|
||||
{
|
||||
struct bpf_hash_entry *entry;
|
||||
char subpath[PATH_MAX];
|
||||
char subpath[PATH_MAX] = {};
|
||||
uint32_t pinning;
|
||||
FILE *fp;
|
||||
int ret;
|
||||
|
|
@ -1637,7 +1632,6 @@ static void bpf_hash_init(struct bpf_elf_ctx *ctx, const char *db_file)
|
|||
if (!fp)
|
||||
return;
|
||||
|
||||
memset(subpath, 0, sizeof(subpath));
|
||||
while ((ret = bpf_read_pin_mapping(fp, &pinning, subpath))) {
|
||||
if (ret == -1) {
|
||||
fprintf(stderr, "Database %s is corrupted at: %s\n",
|
||||
|
|
@ -1690,7 +1684,8 @@ static void bpf_hash_destroy(struct bpf_elf_ctx *ctx)
|
|||
static int bpf_elf_check_ehdr(const struct bpf_elf_ctx *ctx)
|
||||
{
|
||||
if (ctx->elf_hdr.e_type != ET_REL ||
|
||||
ctx->elf_hdr.e_machine != 0 ||
|
||||
(ctx->elf_hdr.e_machine != EM_NONE &&
|
||||
ctx->elf_hdr.e_machine != EM_BPF) ||
|
||||
ctx->elf_hdr.e_version != EV_CURRENT) {
|
||||
fprintf(stderr, "ELF format error, ELF file not for eBPF?\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -1864,16 +1859,14 @@ static int
|
|||
bpf_map_set_send(int fd, struct sockaddr_un *addr, unsigned int addr_len,
|
||||
const struct bpf_map_data *aux, unsigned int entries)
|
||||
{
|
||||
struct bpf_map_set_msg msg;
|
||||
struct bpf_map_set_msg msg = {
|
||||
.aux.uds_ver = BPF_SCM_AUX_VER,
|
||||
.aux.num_ent = entries,
|
||||
};
|
||||
int *cmsg_buf, min_fd;
|
||||
char *amsg_buf;
|
||||
int i;
|
||||
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
|
||||
msg.aux.uds_ver = BPF_SCM_AUX_VER;
|
||||
msg.aux.num_ent = entries;
|
||||
|
||||
strncpy(msg.aux.obj_name, aux->obj, sizeof(msg.aux.obj_name));
|
||||
memcpy(&msg.aux.obj_st, aux->st, sizeof(msg.aux.obj_st));
|
||||
|
||||
|
|
@ -1947,8 +1940,13 @@ bpf_map_set_recv(int fd, int *fds, struct bpf_map_aux *aux,
|
|||
int bpf_send_map_fds(const char *path, const char *obj)
|
||||
{
|
||||
struct bpf_elf_ctx *ctx = &__ctx;
|
||||
struct sockaddr_un addr;
|
||||
struct bpf_map_data bpf_aux;
|
||||
struct sockaddr_un addr = { .sun_family = AF_UNIX };
|
||||
struct bpf_map_data bpf_aux = {
|
||||
.fds = ctx->map_fds,
|
||||
.ent = ctx->maps,
|
||||
.st = &ctx->stat,
|
||||
.obj = obj,
|
||||
};
|
||||
int fd, ret;
|
||||
|
||||
fd = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
|
|
@ -1958,8 +1956,6 @@ int bpf_send_map_fds(const char *path, const char *obj)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path));
|
||||
|
||||
ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
|
||||
|
|
@ -1969,13 +1965,6 @@ int bpf_send_map_fds(const char *path, const char *obj)
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&bpf_aux, 0, sizeof(bpf_aux));
|
||||
|
||||
bpf_aux.fds = ctx->map_fds;
|
||||
bpf_aux.ent = ctx->maps;
|
||||
bpf_aux.st = &ctx->stat;
|
||||
bpf_aux.obj = obj;
|
||||
|
||||
ret = bpf_map_set_send(fd, &addr, sizeof(addr), &bpf_aux,
|
||||
bpf_maps_count(ctx));
|
||||
if (ret < 0)
|
||||
|
|
@ -1990,7 +1979,7 @@ int bpf_send_map_fds(const char *path, const char *obj)
|
|||
int bpf_recv_map_fds(const char *path, int *fds, struct bpf_map_aux *aux,
|
||||
unsigned int entries)
|
||||
{
|
||||
struct sockaddr_un addr;
|
||||
struct sockaddr_un addr = { .sun_family = AF_UNIX };
|
||||
int fd, ret;
|
||||
|
||||
fd = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
|
|
@ -2000,8 +1989,6 @@ int bpf_recv_map_fds(const char *path, int *fds, struct bpf_map_aux *aux,
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path));
|
||||
|
||||
ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
|
||||
|
|
|
|||
|
|
@ -61,21 +61,16 @@ static int tc_class_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct tcmsg t;
|
||||
char buf[4096];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.t.tcm_family = AF_UNSPEC,
|
||||
};
|
||||
struct qdisc_util *q = NULL;
|
||||
struct tc_estimator est;
|
||||
char d[16];
|
||||
char k[16];
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&est, 0, sizeof(est));
|
||||
memset(d, 0, sizeof(d));
|
||||
memset(k, 0, sizeof(k));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.t.tcm_family = AF_UNSPEC;
|
||||
struct tc_estimator est = {};
|
||||
char d[16] = {};
|
||||
char k[16] = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
|
|
@ -168,9 +163,8 @@ __u32 filter_classid;
|
|||
static void graph_node_add(__u32 parent_id, __u32 id, void *data,
|
||||
int len)
|
||||
{
|
||||
struct graph_node *node = malloc(sizeof(struct graph_node));
|
||||
struct graph_node *node = calloc(1, sizeof(struct graph_node));
|
||||
|
||||
memset(node, 0, sizeof(*node));
|
||||
node->id = id;
|
||||
node->parent_id = parent_id;
|
||||
|
||||
|
|
@ -225,7 +219,7 @@ static void graph_cls_show(FILE *fp, char *buf, struct hlist_head *root_list,
|
|||
{
|
||||
struct hlist_node *n, *tmp_cls;
|
||||
char cls_id_str[256] = {};
|
||||
struct rtattr *tb[TCA_MAX + 1] = {};
|
||||
struct rtattr *tb[TCA_MAX + 1];
|
||||
struct qdisc_util *q;
|
||||
char str[100] = {};
|
||||
|
||||
|
|
@ -310,7 +304,7 @@ int print_class(const struct sockaddr_nl *who,
|
|||
FILE *fp = (FILE *)arg;
|
||||
struct tcmsg *t = NLMSG_DATA(n);
|
||||
int len = n->nlmsg_len;
|
||||
struct rtattr *tb[TCA_MAX + 1] = {};
|
||||
struct rtattr *tb[TCA_MAX + 1];
|
||||
struct qdisc_util *q;
|
||||
char abuf[256];
|
||||
|
||||
|
|
@ -395,14 +389,10 @@ int print_class(const struct sockaddr_nl *who,
|
|||
|
||||
static int tc_class_list(int argc, char **argv)
|
||||
{
|
||||
struct tcmsg t;
|
||||
char d[16];
|
||||
struct tcmsg t = { .tcm_family = AF_UNSPEC };
|
||||
char d[16] = {};
|
||||
char buf[1024] = {0};
|
||||
|
||||
memset(&t, 0, sizeof(t));
|
||||
t.tcm_family = AF_UNSPEC;
|
||||
memset(d, 0, sizeof(d));
|
||||
|
||||
filter_qdisc = 0;
|
||||
filter_classid = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -71,9 +71,8 @@ reg:
|
|||
|
||||
return eu;
|
||||
noexist:
|
||||
eu = malloc(sizeof(*eu));
|
||||
eu = calloc(1, sizeof(*eu));
|
||||
if (eu) {
|
||||
memset(eu, 0, sizeof(*eu));
|
||||
strncpy(eu->id, name, sizeof(eu->id) - 1);
|
||||
eu->parse_eopt = parse_noeopt;
|
||||
goto reg;
|
||||
|
|
@ -85,7 +84,7 @@ noexist:
|
|||
int do_exec(int argc, char **argv)
|
||||
{
|
||||
struct exec_util *eu;
|
||||
char kind[16];
|
||||
char kind[16] = {};
|
||||
|
||||
if (argc < 1) {
|
||||
fprintf(stderr, "No command given, try \"tc exec help\".\n");
|
||||
|
|
@ -97,7 +96,6 @@ int do_exec(int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
memset(kind, 0, sizeof(kind));
|
||||
strncpy(kind, *argv, sizeof(kind) - 1);
|
||||
|
||||
eu = get_exec_kind(kind);
|
||||
|
|
|
|||
|
|
@ -47,26 +47,20 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct nlmsghdr n;
|
||||
struct tcmsg t;
|
||||
char buf[MAX_MSG];
|
||||
} req;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.t.tcm_family = AF_UNSPEC,
|
||||
};
|
||||
struct filter_util *q = NULL;
|
||||
__u32 prio = 0;
|
||||
__u32 protocol = 0;
|
||||
int protocol_set = 0;
|
||||
char *fhandle = NULL;
|
||||
char d[16];
|
||||
char k[16];
|
||||
struct tc_estimator est;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&est, 0, sizeof(est));
|
||||
memset(d, 0, sizeof(d));
|
||||
memset(k, 0, sizeof(k));
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.t.tcm_family = AF_UNSPEC;
|
||||
char d[16] = {};
|
||||
char k[16] = {};
|
||||
struct tc_estimator est = {};
|
||||
|
||||
if (cmd == RTM_NEWTFILTER && flags & NLM_F_CREATE)
|
||||
protocol = htons(ETH_P_ALL);
|
||||
|
|
@ -213,7 +207,6 @@ int print_filter(const struct sockaddr_nl *who,
|
|||
return -1;
|
||||
}
|
||||
|
||||
memset(tb, 0, sizeof(tb));
|
||||
parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len);
|
||||
|
||||
if (tb[TCA_KIND] == NULL) {
|
||||
|
|
@ -278,16 +271,12 @@ int print_filter(const struct sockaddr_nl *who,
|
|||
|
||||
static int tc_filter_list(int argc, char **argv)
|
||||
{
|
||||
struct tcmsg t;
|
||||
char d[16];
|
||||
struct tcmsg t = { .tcm_family = AF_UNSPEC };
|
||||
char d[16] = {};
|
||||
__u32 prio = 0;
|
||||
__u32 protocol = 0;
|
||||
char *fhandle = NULL;
|
||||
|
||||
memset(&t, 0, sizeof(t));
|
||||
t.tcm_family = AF_UNSPEC;
|
||||
memset(d, 0, sizeof(d));
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
|
|
@ -49,25 +49,19 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
|
|||
struct {
|
||||
struct tc_sizespec szopts;
|
||||
__u16 *data;
|
||||
} stab;
|
||||
char d[16];
|
||||
char k[16];
|
||||
} stab = {};
|
||||
char d[16] = {};
|
||||
char k[16] = {};
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct tcmsg t;
|
||||
char buf[TCA_BUF_MAX];
|
||||
} req;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&stab, 0, sizeof(stab));
|
||||
memset(&est, 0, sizeof(est));
|
||||
memset(&d, 0, sizeof(d));
|
||||
memset(&k, 0, sizeof(k));
|
||||
|
||||
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg));
|
||||
req.n.nlmsg_flags = NLM_F_REQUEST|flags;
|
||||
req.n.nlmsg_type = cmd;
|
||||
req.t.tcm_family = AF_UNSPEC;
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||
.n.nlmsg_type = cmd,
|
||||
.t.tcm_family = AF_UNSPEC,
|
||||
};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
|
|
@ -227,7 +221,6 @@ int print_qdisc(const struct sockaddr_nl *who,
|
|||
if (filter_ifindex && filter_ifindex != t->tcm_ifindex)
|
||||
return 0;
|
||||
|
||||
memset(tb, 0, sizeof(tb));
|
||||
parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len);
|
||||
|
||||
if (tb[TCA_KIND] == NULL) {
|
||||
|
|
@ -287,12 +280,8 @@ int print_qdisc(const struct sockaddr_nl *who,
|
|||
|
||||
static int tc_qdisc_list(int argc, char **argv)
|
||||
{
|
||||
struct tcmsg t;
|
||||
char d[16];
|
||||
|
||||
memset(&t, 0, sizeof(t));
|
||||
t.tcm_family = AF_UNSPEC;
|
||||
memset(&d, 0, sizeof(d));
|
||||
struct tcmsg t = { .tcm_family = AF_UNSPEC };
|
||||
char d[16] = {};
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
|
|
|
|||
|
|
@ -53,9 +53,7 @@ int parse_size_table(int *argcp, char ***argvp, struct tc_sizespec *sp)
|
|||
{
|
||||
char **argv = *argvp;
|
||||
int argc = *argcp;
|
||||
struct tc_sizespec s;
|
||||
|
||||
memset(&s, 0, sizeof(s));
|
||||
struct tc_sizespec s = {};
|
||||
|
||||
NEXT_ARG();
|
||||
if (matches(*argv, "help") == 0) {
|
||||
|
|
|
|||
|
|
@ -580,10 +580,9 @@ void print_tcstats_attr(FILE *fp, struct rtattr *tb[], char *prefix, struct rtat
|
|||
}
|
||||
/* backward compatibility */
|
||||
if (tb[TCA_STATS]) {
|
||||
struct tc_stats st;
|
||||
struct tc_stats st = {};
|
||||
|
||||
/* handle case where kernel returns more/less than we know about */
|
||||
memset(&st, 0, sizeof(st));
|
||||
memcpy(&st, RTA_DATA(tb[TCA_STATS]), MIN(RTA_PAYLOAD(tb[TCA_STATS]), sizeof(st)));
|
||||
|
||||
fprintf(fp, "%sSent %llu bytes %u pkts (dropped %u, overlimits %u) ",
|
||||
|
|
|
|||
Loading…
Reference in New Issue