Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154506
  • 博文数量: 41
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 10:16
文章分类
文章存档

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-08-25 17:17:56

tcp.c文件的tcp_ioctl函数

978计划工作组 2009-8-25

1函数源码

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)

{

       int err;

       switch(cmd)

       {

 

              case TIOCINQ:

#ifdef FIXME /* FIXME: */

              case FIONREAD:

#endif            {

                     unsigned long amount;

 

                     if (sk->state == TCP_LISTEN)

                            return(-EINVAL);

 

                     sk->inuse = 1;

                     amount = tcp_readable(sk);

                     release_sock(sk);

                     err=verify_area(VERIFY_WRITE,(void *)arg,

                                             sizeof(unsigned long));

                     if(err)

                            return err;

                     put_fs_long(amount,(unsigned long *)arg);

                     return(0);

              }

              case SIOCATMARK:

              {

                     int answ = sk->urg_data && sk->urg_seq == sk->copied_seq;

 

                     err = verify_area(VERIFY_WRITE,(void *) arg,

                                            sizeof(unsigned long));

                     if (err)

                            return err;

                     put_fs_long(answ,(int *) arg);

                     return(0);

              }

              case TIOCOUTQ:

              {

                     unsigned long amount;

 

                     if (sk->state == TCP_LISTEN) return(-EINVAL);

                     amount = sk->prot->wspace(sk);

                     err=verify_area(VERIFY_WRITE,(void *)arg,

                                             sizeof(unsigned long));

                     if(err)

                            return err;

                     put_fs_long(amount,(unsigned long *)arg);

                     return(0);

              }

              default:

                     return(-EINVAL);

       }

}

2函数用途

查询相关信息。

3调用关系

4语句注释

4.1  case TIOCINQ:

       case FIONREAD:

       case SIOCATMARK:

       case TIOCOUTQ:

TIOCINQ/ FIONREAD:宏值为0x541B用于查询下一个可读取数据包中数据长度

SIOCATMARK:宏值为0x8905用于判断下一个将要读取得数据是否为urgent 数据。

TIOCOUTQ:宏值为0x5411用于检测当前发送缓冲区中空闲空间大小

4.2  err=verify_area(VERIFY_WRITE,(void *)arg, sizeof(unsigned long));

       put_fs_long(amount,(unsigned long *)arg);

VERIFY_WRITE:宏值为1,访问类型是写类型

arg:用于返回函数的执行结果

verify_area验证参数地址空间是否存在,根据参数验证是否可读(VERIFY_READ)或可写(VERIFY_WRITE

put_fs_long:将第一个参数的值赋给第二个参数

amount:可读取的数据字节数

4.3 int answ = sk->urg_data && sk->urg_seq == sk->copied_seq;

answ:为1表示接收到了紧急数据且下一个要读取的就是紧急数据

sk->urg_seq:值为紧急数据的序列号,而非紧急标志的序列号。

阅读(1933) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~