summaryrefslogtreecommitdiff
path: root/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c')
-rwxr-xr-x[-rw-r--r--]cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c b/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c
index 0655a5f07f..326af8668a 100644..100755
--- a/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c
+++ b/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_ioctl.c
@@ -22,6 +22,9 @@
#include <asm/uaccess.h>
#include "br_private.h"
+#ifdef CONFIG_IEEE1905_1_FORWARD_ENTITY
+unsigned char not_forward_dest[6]={0x0,0x0,0x0,0x0,0x0,0x0};
+#endif
/* called with RTNL */
static int get_bridge_ifindices(int *indices, int num)
{
@@ -83,6 +86,46 @@ static int get_fdb_entries(struct net_bridge *br, void __user *userbuf,
return num;
}
+#ifdef CONFIG_IEEE1905_1_FORWARD_ENTITY
+/*
+ * This function is for 1905.1 daemon use.
+ * for 1905.1 relay multicast message, daemon use this function to select
+ * correct interface to re-transmit message.
+ * for topology message, daemon use this function to record the
+ * receiving interface for topology used.
+ */
+static int get_received_port_addr(struct net_bridge *br, void __user *ruserbuf,
+ void __user *wuserbuf)
+{
+ unsigned char mac_addr[6];
+ struct net_bridge_fdb_entry *dst;
+
+ if(copy_from_user(mac_addr, wuserbuf, 6))
+ return -EFAULT;
+
+ if((dst = __br_fdb_get(br,mac_addr)) == NULL)
+ return -EFAULT;
+
+ if (copy_to_user(ruserbuf, dst->dst->dev->dev_addr,6))
+ return -EFAULT;
+
+ return 0;
+}
+
+/*
+ * This function is for 1905.1 daemon use.
+ * let bridge not forward 1905.1 multicast address and local abstraction layer
+ * mac address.
+ */
+static int set_not_forward_dest(struct net_bridge *br, void __user *userbuf)
+{
+ if(copy_from_user(not_forward_dest, userbuf, 6))
+ return -EFAULT;
+
+ return 0;
+}
+#endif
+
static int add_del_if(struct net_bridge *br, int ifindex, int isadd)
{
struct net_device *dev;
@@ -306,6 +349,13 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
case BRCTL_GET_FDB_ENTRIES:
return get_fdb_entries(br, (void __user *)args[1],
args[2], args[3]);
+#ifdef CONFIG_IEEE1905_1_FORWARD_ENTITY
+ case BRCTL_GET_RECV_PORT_ADDR:
+ return get_received_port_addr(br, (void __user *)args[1],\
+ (void __user *)args[2]);
+ case BRCTL_SET_BRIDGE_NOT_FORWARD_DEST:
+ return set_not_forward_dest(br, (void __user *)args[1]);
+#endif
}
return -EOPNOTSUPP;
@@ -365,6 +415,18 @@ static int old_deviceless(void __user *uarg)
return -EOPNOTSUPP;
}
+#ifdef CONFIG_IEEE1905_1_FORWARD_ENTITY
+/*
+ * used in function br_handle_frame_finish.
+ * 1905.1 daemon set not forward mac address in user space, then kernel use
+ * it to handle forwarding rule.
+ */
+unsigned char *br_get_not_forward_dest(void)
+{
+ return &not_forward_dest[0];
+}
+#endif
+
int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *uarg)
{
switch (cmd) {