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