|
繼續(xù)講關于myraw_setsockopt的實現(xiàn),如果level是SOL_IP,則調(diào)用myip_setsockopt函數(shù)。
myip_setsockopt的操作對像是struct socket sock的成員struct sock
sk。并把sk強制轉化為struct inet_sock: inet = inet_sk(sk)。
如果option_name在MRT_BASE和MRT_BASE+10之間,則調(diào)用myip_mroute_setsockopt函數(shù),關于mroute,后面再給出分析。 IP_OPTIONS:設置將由該套接字發(fā)送的每個包的IP選項。 其option_value是一個結構體struct ip_options。該選項首先分配一個這樣的結構體,然后用這個結構體替代inet->opt指向的結構體。如果協(xié)議類型是 SOCK_STREAM的話,從struct tcp_sock *tp中,tp->ext_header_len減去舊的inet->opt->optlen, 再加上新的opt->optlen。最后調(diào)用tcp_sync_mss進行同步,有關TCP的一些細節(jié),我們在實現(xiàn)TCP協(xié)議時再分析。 IP_PKTINFO:傳遞一條包含pktinfo結構(該結構提供一些來訪包的相關信息)的IP_PKTINFO輔助信息。 這個選項只對數(shù)據(jù)報類的套接字有效。 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,那么外發(fā)的包會通過在ipi_ifindex中指定的接口發(fā)送出去,同時把ipi_spec_dst設置為目 的地址。 myip_setsockopt的代碼實現(xiàn)中只是根據(jù)option_value是否為0,置或清inet->cmsg_flags的IP_CMSG_PKTINFO位。 IP_RECVTTL: 該選項根據(jù)option_value的值是否為0,置或清inet->cmsg_flags的IP_CMSG_TTL位,具體用途,留待日后分析。 IP_RECVTOS: 如果打開了這個選項,則IP_TOS輔助信息會與來訪包一起傳遞。它包含一個字節(jié)用來指定包頭中的服務/優(yōu)先>級字段的類型。該字節(jié)為一個布爾整型 標識。該選項根據(jù)option_value的值是否為0,置或清inet->cmsg_flags的IP_CMSG_TOS位。 IP_RECVOPTS: 用一條IP_OPTIONS控制信息傳遞所有來訪的IP選項給用戶。路由頭標識和其它選項已經(jīng)為本地主機填好.此選項不支持SOCK_STREAM套接 字。該選項根據(jù)option_value的值是否為0,置或清inet->cmsg_flags的IP_CMSG_RECVOPTS位。 IP_RETOPTS: 等同于IP_RECVOPTS但是返回的是帶有時間戳的未處理的原始選項和在這段路由中未填入的路由記錄項目。該>選項根據(jù) option_value的值是否為0,置或清inet->cmsg_flags的IP_CMSG_RETOPTS位。 IP_TOS: 設置源于該套接字的每個IP包的Type-Of-Service(TOS 服務類型)字段。它被用來在網(wǎng)絡上區(qū)分包的優(yōu)先級>。TOS是單字節(jié)的字段。定義了一些的標準TOS標識:IPTOS_LOWDELAY用來為交互 式通信最小化延遲時間,IPTOS_THROUGHPUT用來優(yōu)化吞吐量,IPTOS_RELIABILITY用來作可靠性優(yōu)化, IPTOS_MINCOST應該被用作“填充數(shù)據(jù)”,對于這些數(shù)據(jù),低速傳輸是無關緊要的。至多只能聲明這些 TOS 值中的一個,其它的都是無效的,應當被清除。缺省時,Linux首先發(fā)送IPTOS_LOWDELAY數(shù)據(jù)報,但是確切的做法要看配置的排隊規(guī)則而定。一 些高優(yōu)先級的層次可能會要求一個有效的用戶標識0或者CAP_NET_ADMIN能力。優(yōu)先級也可以以于協(xié)議無關的方式通過( SOL_SOCKET, SO_PRIORITY )套接字選項來設置。 該選項的操作置inet->tos = val,sk->sk_priority = rt_tos2priority(val),同時,清sk->sk_dst_cache。 IP_TTL:設置從此套接字發(fā)出的包的當前生存時間字段。 該選項置inet->uc_ttl = option_value。 IP_HDRINCL: 該選項只對SOCK_RAW有效,如果提供的話,用戶可在用戶數(shù)據(jù)前面提供一個ip頭。該選項的操作根據(jù)option_value是否為零,置inet->hdrincl為1或0。 IP_MTU_DISCOVER: 為套接字設置Path MTU Discovery setting(路徑MTU發(fā)現(xiàn)設置)。該選項的操作置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。 在涉及到相關內(nèi)容時,再進行一一分析。 |
|
|