// 1.网桥子系统向用户空间提供的接口:
// 1.1 通过socket ioctl创建网桥
// 1.2 通过网桥的特殊设备文件ioctl添加网桥端口
// 桥接在socket ioctl中的衔接处理
// 处理的命令类型:
// 1.获取网桥信息
// 2.设置网桥信息
// 3.添加网桥
// 4.删除网桥
1.1 static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{
...
case SIOCGIFBR:
case SIOCSIFBR:
case SIOCBRADDBR:
case SIOCBRDELBR:
err = -ENOPKG;
if (!br_ioctl_hook)//如果钩子函数没有被设置,则加载桥接模块
request_module("bridge");
down(&br_ioctl_mutex);//在执行钩子函数的过程中,获取信号量,防止在钩子函数被执行的过程,被设置
if (br_ioctl_hook)
err = br_ioctl_hook(cmd, argp);
up(&br_ioctl_mutex);
break;
...
}
// 网桥的socket ioctl
// 在网桥子系统初始化时,由brioctl_set设置br_ioctl_hook = br_ioctl_deviceless_stub
// 调用路径: sock_ioctl->br_ioctl_hook
1.2 int br_ioctl_deviceless_stub(unsigned int cmd, void __user *uarg)
{
switch (cmd) {
case SIOCGIFBR:
case SIOCSIFBR:
return old_deviceless(uarg);//老式网桥命令
case SIOCBRADDBR://新网桥命令,添加或删除网桥
case SIOCBRDELBR:
{
char buf[IFNAMSIZ];
if (!capable(CAP_NET_ADMIN))//当前进程需要admin权限
return -EPERM;
if (copy_from_user(buf, uarg, IFNAMSIZ))//uarg提供网桥名字
return -EFAULT;
buf[IFNAMSIZ-1] = 0;//c格式字符串
if (cmd == SIOCBRADDBR)//添加网桥
return br_add_bridge(buf);
return br_del_bridge(buf);//删除
}
}
return -EOPNOTSUPP
网络子系统28_桥接ioctl
最新推荐文章于 2024-07-15 21:56:46 发布