{
fprintf(stderr,
"Usage: bridge mdb { add | del } dev DEV port PORT grp GROUP [src SOURCE] [permanent | temp] [vid VID]\n"
- " [ filter_mode { include | exclude } ]\n"
+ " [ filter_mode { include | exclude } ] [ source_list SOURCE_LIST ]\n"
" bridge mdb {show} [ dev DEV ] [ vid VID ]\n");
exit(-1);
}
return -1;
}
+static int mdb_parse_src_entry(struct nlmsghdr *n, int maxlen, char *src_entry)
+{
+ struct in6_addr src_ip6;
+ struct rtattr *nest;
+ __be32 src_ip4;
+
+ nest = addattr_nest(n, maxlen, MDBE_SRC_LIST_ENTRY | NLA_F_NESTED);
+
+ if (inet_pton(AF_INET, src_entry, &src_ip4))
+ addattr32(n, maxlen, MDBE_SRCATTR_ADDRESS, src_ip4);
+ else if (inet_pton(AF_INET6, src_entry, &src_ip6))
+ addattr_l(n, maxlen, MDBE_SRCATTR_ADDRESS, &src_ip6,
+ sizeof(src_ip6));
+ else
+ return -1;
+
+ addattr_nest_end(n, nest);
+
+ return 0;
+}
+
+static int mdb_parse_src_list(struct nlmsghdr *n, int maxlen, char *src_list)
+{
+ struct rtattr *nest;
+ char *sep;
+
+ nest = addattr_nest(n, maxlen, MDBE_ATTR_SRC_LIST | NLA_F_NESTED);
+
+ do {
+ sep = strchr(src_list, ',');
+ if (sep)
+ *sep = '\0';
+
+ if (mdb_parse_src_entry(n, maxlen, src_list)) {
+ fprintf(stderr, "Invalid source entry \"%s\" in source list\n",
+ src_list);
+ return -1;
+ }
+
+ src_list = sep + 1;
+ } while (sep);
+
+ addattr_nest_end(n, nest);
+
+ return 0;
+}
+
static int mdb_modify(int cmd, int flags, int argc, char **argv)
{
struct {
char *d = NULL, *p = NULL, *grp = NULL, *src = NULL, *mode = NULL;
struct br_mdb_entry entry = {};
bool set_attrs = false;
+ char *src_list = NULL;
short vid = 0;
while (argc > 0) {
NEXT_ARG();
mode = *argv;
set_attrs = true;
+ } else if (strcmp(*argv, "source_list") == 0) {
+ NEXT_ARG();
+ src_list = *argv;
+ set_attrs = true;
} else {
if (matches(*argv, "help") == 0)
usage();
return -1;
}
+ if (src_list && mdb_parse_src_list(&req.n, sizeof(req),
+ src_list))
+ return -1;
+
addattr_nest_end(&req.n, nest);
}
.BR permanent " | " temp " ] [ "
.B vid
.IR VID " ] [ "
-.BR filter_mode " { " include " | " exclude " } ] "
+.BR filter_mode " { " include " | " exclude " } ] [ "
+.B source_list
+.IR SOURCE_LIST " ]
.ti -8
.BR "bridge mdb show" " [ "
controls whether the sources in the entry's source list are in INCLUDE or
EXCLUDE mode. Can only be set for (*, G) entries.
+.TP
+.BI source_list " SOURCE_LIST"
+optional list of source IP addresses of senders for this multicast group,
+separated by a ','. Whether the entry forwards packets from these senders or
+not is determined by the entry's filter mode, which becomes a mandatory
+argument. Can only be set for (*, G) entries.
+
.in -8
.SS bridge mdb delete - delete a multicast group database entry
This command removes an existing mdb entry.