static int br_ioctl_deviceless(unsigned int cmd, unsigned long arg0, unsigned long arg1) { switch (cmd) { case BRCTL_GET_VERSION: return BRCTL_VERSION; case BRCTL_GET_BRIDGES: { int i; int indices[64]; for (i=0;i<64;i++) indices[i] = 0; if (arg1 > 64) arg1 = 64; arg1 = br_get_bridge_ifindices(indices, arg1); if (copy_to_user((void *)arg0, indices, arg1*sizeof(int))) return -EFAULT; return arg1; } case BRCTL_ADD_BRIDGE: case BRCTL_DEL_BRIDGE: { char buf[IFNAMSIZ]; if (copy_from_user(buf, (void *)arg0, IFNAMSIZ)) return -EFAULT; buf[IFNAMSIZ-1] = 0; if (cmd == BRCTL_ADD_BRIDGE) return br_add_bridge(buf); return br_del_bridge(buf); } } return -EOPNOTSUPP; }
static int br_ioctl_deviceless(unsigned int cmd, unsigned long arg0, unsigned long arg1) { switch (cmd) { case BRCTL_GET_VERSION: return BRCTL_VERSION; case BRCTL_GET_BRIDGES: { int i; int indices[64]; for (i=0;i<64;i++) indices[i] = 0; if (arg1 > 64) arg1 = 64; arg1 = br_get_bridge_ifindices(indices, arg1); if (copy_to_user((void *)arg0, indices, arg1*sizeof(int))) return -EFAULT; return arg1; } case BRCTL_ADD_BRIDGE: case BRCTL_DEL_BRIDGE: { char buf[IFNAMSIZ]; if (copy_from_user(buf, (void *)arg0, IFNAMSIZ)) return -EFAULT; buf[IFNAMSIZ-1] = 0; if (cmd == BRCTL_ADD_BRIDGE) return br_add_bridge(buf); return br_del_bridge(buf); } #ifdef CONFIG_RTK_MESH //by brian, dynamic portal enable case BRCTL_SET_MESH_PATHSELPID: return br_set_meshpathsel_pid(arg0); case BRCTL_GET_PORTSTAT: { struct net_bridge *br; br = find_br_by_name("br0"); if (br == NULL) return -1; else return br->eth0_received; } #endif } return -EOPNOTSUPP; }