// 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
最新推荐文章于 2021-11-17 10:08:47 发布
本文详细介绍了Linux内核中网桥子系统如何通过socket ioctl和设备文件ioctl接口处理用户空间的请求,包括添加、删除网桥,设置网桥参数以及管理网桥端口等操作。涉及的命令包括SIOCBRADDBR、SIOCBRDELBR等,同时也阐述了权限检查和数据拷贝等关键步骤。
摘要由CSDN通过智能技术生成