aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2005-02-12 11:41:32 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2005-02-12 11:41:32 +0000
commit810d5e89f4a13ccebad192385843e156610c6f3a (patch)
tree30374dc3c16bce7743363d885b0b8cd23322a338 /sys
parent953a8b2e6d802491d82579381a8fcb4e21299166 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/netgraph/ng_ether.c56
-rw-r--r--sys/netgraph/ng_ether.h5
2 files changed, 59 insertions, 2 deletions
diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
index 674a1f2d2030..cfa0976bfe26 100644
--- a/sys/netgraph/ng_ether.c
+++ b/sys/netgraph/ng_ether.c
@@ -57,6 +57,7 @@
#include <net/bridge.h>
#include <net/if.h>
+#include <net/if_dl.h>
#include <net/if_types.h>
#include <net/if_arp.h>
#include <net/if_var.h>
@@ -171,6 +172,20 @@ static const struct ng_cmdlist ng_ether_cmdlist[] = {
&ng_parse_int32_type,
NULL
},
+ {
+ NGM_ETHER_COOKIE,
+ NGM_ETHER_ADD_MULTI,
+ "addmulti",
+ &ng_parse_enaddr_type,
+ NULL
+ },
+ {
+ NGM_ETHER_COOKIE,
+ NGM_ETHER_DEL_MULTI,
+ "delmulti",
+ &ng_parse_enaddr_type,
+ NULL
+ },
{ 0 }
};
@@ -492,6 +507,47 @@ ng_ether_rcvmsg(node_p node, item_p item, hook_p lasthook)
}
priv->autoSrcAddr = !!*((u_int32_t *)msg->data);
break;
+ case NGM_ETHER_ADD_MULTI:
+ {
+ struct sockaddr_dl sa_dl;
+ struct ifmultiaddr *ifm;
+
+ if (msg->header.arglen != ETHER_ADDR_LEN) {
+ error = EINVAL;
+ break;
+ }
+ sa_dl.sdl_len = sizeof(struct sockaddr_dl);
+ sa_dl.sdl_family = AF_LINK;
+ sa_dl.sdl_index = 0;
+ sa_dl.sdl_nlen = 0;
+ sa_dl.sdl_alen = 6;
+ sa_dl.sdl_slen = 0;
+ bcopy((void *)msg->data, LLADDR(&sa_dl),
+ ETHER_ADDR_LEN);
+ error = if_addmulti(priv->ifp,
+ (struct sockaddr *)&sa_dl, &ifm);
+ break;
+ }
+ case NGM_ETHER_DEL_MULTI:
+ {
+ struct sockaddr_dl sa_dl;
+
+ if (msg->header.arglen != ETHER_ADDR_LEN) {
+ error = EINVAL;
+ break;
+ }
+ sa_dl.sdl_len = sizeof(struct sockaddr_dl);
+ sa_dl.sdl_family = AF_LINK;
+ sa_dl.sdl_index = 0;
+ sa_dl.sdl_nlen = 0;
+ sa_dl.sdl_alen = 6;
+ sa_dl.sdl_slen = 0;
+ bcopy((void *)msg->data, LLADDR(&sa_dl),
+ ETHER_ADDR_LEN);
+ error = if_delmulti(priv->ifp,
+ (struct sockaddr *)&sa_dl);
+ break;
+ }
default:
error = EINVAL;
break;
diff --git a/sys/netgraph/ng_ether.h b/sys/netgraph/ng_ether.h
index e91a6b153dc4..ffe8e8afcf48 100644
--- a/sys/netgraph/ng_ether.h
+++ b/sys/netgraph/ng_ether.h
@@ -47,7 +47,7 @@
/* Node type name and magic cookie */
#define NG_ETHER_NODE_TYPE "ether"
-#define NGM_ETHER_COOKIE 917786906
+#define NGM_ETHER_COOKIE 1108206947
/* Hook names */
#define NG_ETHER_HOOK_LOWER "lower" /* connection to raw device */
@@ -65,7 +65,8 @@ enum {
NGM_ETHER_SET_PROMISC, /* enable/disable promiscuous mode */
NGM_ETHER_GET_AUTOSRC, /* get source address override */
NGM_ETHER_SET_AUTOSRC, /* enable/disable src addr override */
+ NGM_ETHER_ADD_MULTI, /* add multicast membership */
+ NGM_ETHER_DEL_MULTI, /* delete multicast membership */
};
#endif /* _NETGRAPH_NG_ETHER_H_ */
-