套接字选项(四)_深度探索Linux内核

来源:百度文库 编辑:神马文学网 时间:2024/04/27 21:00:21
继续讲关于myraw_setsockopt的实现,如果level是SOL_IP,则调用myip_setsockopt函数。 myip_setsockopt的操作对像是struct socket sock的成员struct sock sk。并把sk强制转化为struct inet_sock: inet = inet_sk(sk)。
如果option_name在MRT_BASE和MRT_BASE+10之间,则调用myip_mroute_setsockopt函数,关于mroute,后面再给出分析。
IP_OPTIONS:设置将由该套接字发送的每个包的IP选项。
其option_value是一个结构体struct ip_options。该选项首先分配一个这样的结构体,然后用这个结构体替代inet->opt指向的结构体。如果协议类型是 SOCK_STREAM的话,从struct tcp_sock *tp中,tp->ext_header_len减去旧的inet->opt->optlen, 再加上新的opt->optlen。最后调用tcp_sync_mss进行同步,有关TCP的一些细节,我们在实现TCP协议时再分析。
IP_PKTINFO:传递一条包含pktinfo结构(该结构提供一些来访包的相关信息)的IP_PKTINFO辅助信息。
这个选项只对数据报类的套接字有效。
struct in_pktinfo
{
unsigned int ipi_ifindex; /* 接口索引 */
struct in_addr ipi_spec_dst; /* 路由目的地址 */
struct in_addr ipi_addr; /* 头标识目的地址 */
};
ipi_ifindex 指的是接收包的接口的唯一索引。ipi_spec_dst指的是路由表记录中的目的地址,而ipi_addr 指的是包头中的目的地址。如果给 sendmsg传递了IP_PKTINFO,那么外发的包会通过在ipi_ifindex中指定的接口发送出去,同时把ipi_spec_dst设置为目 的地址。
myip_setsockopt的代码实现中只是根据option_value是否为0,置或清inet->cmsg_flags的IP_CMSG_PKTINFO位。
IP_RECVTTL:
该选项根据option_value的值是否为0,置或清inet->cmsg_flags的IP_CMSG_TTL位,具体用途,留待日后分析。
IP_RECVTOS:
如果打开了这个选项,则IP_TOS辅助信息会与来访包一起传递。它包含一个字节用来指定包头中的服务/优先>级字段的类型。该字节为一个布尔整型 标识。该选项根据option_value的值是否为0,置或清inet->cmsg_flags的IP_CMSG_TOS位。
IP_RECVOPTS:
用一条IP_OPTIONS控制信息传递所有来访的IP选项给用户。路由头标识和其它选项已经为本地主机填好.此选项不支持SOCK_STREAM套接 字。该选项根据option_value的值是否为0,置或清inet->cmsg_flags的IP_CMSG_RECVOPTS位。
IP_RETOPTS:
等同于IP_RECVOPTS但是返回的是带有时间戳的未处理的原始选项和在这段路由中未填入的路由记录项目。该>选项根据 option_value的值是否为0,置或清inet->cmsg_flags的IP_CMSG_RETOPTS位。
IP_TOS:
设置源于该套接字的每个IP包的Type-Of-Service(TOS 服务类型)字段。它被用来在网络上区分包的优先级>。TOS是单字节的字段。定义了一些的标准TOS标识:IPTOS_LOWDELAY用来为交互 式通信最小化延迟时间,IPTOS_THROUGHPUT用来优化吞吐量,IPTOS_RELIABILITY用来作可靠性优化, IPTOS_MINCOST应该被用作“填充数据”,对于这些数据,低速传输是无关紧要的。至多只能声明这些 TOS 值中的一个,其它的都是无效的,应当被清除。缺省时,Linux首先发送IPTOS_LOWDELAY数据报,但是确切的做法要看配置的排队规则而定。一 些高优先级的层次可能会要求一个有效的用户标识0或者CAP_NET_ADMIN能力。优先级也可以以于协议无关的方式通过( SOL_SOCKET, SO_PRIORITY )套接字选项来设置。
该选项的操作置inet->tos = val,sk->sk_priority = rt_tos2priority(val),同时,清sk->sk_dst_cache。
IP_TTL:设置从此套接字发出的包的当前生存时间字段。
该选项置inet->uc_ttl = option_value。
IP_HDRINCL:
该选项只对SOCK_RAW有效,如果提供的话,用户可在用户数据前面提供一个ip头。该选项的操作根据option_value是否为零,置inet->hdrincl为1或0。
IP_MTU_DISCOVER:
为套接字设置Path MTU Discovery setting(路径MTU发现设置)。该选项的操作置inet->pmtudisc = option_value,option_value只允许取值0,1,2。
IP_SOL层上余下的选项还有:
IP_RECVERR,IP_MULTICAST_TTL,IP_MULTICAST_LOOP,IP_MULTICAST_IF, IP_ADD_MEMBERSHIP,IP_DROP_MEMBERSHIP,IP_MSFILTER,IP_BLOCK_SOURCE, IP_UNBLOCK_SOURCE,IP_ADD_SOURCE_MEMBERSHIP,IP_DROP_SOURCE_MEMBERSHIP, MCAST_JOIN_GROUP,MCAST_LEAVE_GROUP,MCAST_JOIN_SOURCE_GROUP, MCAST_LEAVE_SOURCE_GROUP,MCAST_BLOCK_SOURCE,MCAST_UNBLOCK_SOURCE, MCAST_MSFILTER,IP_ROUTER_ALERT,IP_FREEBIND,IP_IPSEC_POLICY, IP_XFRM_POLICY。
在涉及到相关内容时,再进行一一分析。