关于PPPd拨号程序的虚拟网络接口PPP0数据交换问题

愿达前程 2012-06-01 04:08:48

PPP0 设备与linux内核交互接口IOCTL()进行数据交换,为什么需要创建SOCKET()来初始化IOCTL()操作,且开启的是个基于

SOCK_DGRAM 类型UDP socket。下面是创建与初始化函数:

int ppp_available(void){
////////......

fd = open("/dev/ppp", O_RDWR);

#if 0
if (fd < 0 && errno == ENOENT) {
/* try making it and see if that helps. */
if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
makedev(108, 0)) >= 0) {
fd = open("/dev/ppp", O_RDWR);
if (fd >= 0)
info("Created /dev/ppp device node");
else
unlink("/dev/ppp"); /* didn't work, undo the mknod */
} else if (errno == EEXIST) {
fd = open("/dev/ppp", O_RDWR);
}
}
#endif /* 0 */


///////......

/*
* Open a socket for doing the ioctl operations.
*/
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0)
return 0;

strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;

//////........


...全文
829 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
int ioctl(int fd, ind cmd, …);
一般情况下fd就是用户程序打开设备时使用open函数返回的文件标示符.

内核中的N多驱动都有ioctl. 那你应用层的ioctl是调用的那个驱动的? 这个区分就是依靠设备描述法来区分的。

LZ现在是要调用内核中网络驱动部分的ioctl,那是不是应该传递网络驱动的描述符?而不是你个人ppp驱动的描述符? 那网络驱动的描述符咋个来?? socket....

21,620

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧