mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
[IP_SOCKGLUE]: Remove most of the tcp specific calls
As DCCP needs to be called in the same spots. Now we have a member in inet_sock (is_icsk), set at sock creation time from struct inet_protosw->flags (if INET_PROTOSW_ICSK is set, like for TCP and DCCP) to see if a struct sock instance is a inet_connection_sock for places like the ones in ip_sockglue.c (v4 and v6) where we previously were looking if sk_type was SOCK_STREAM, that is insufficient because we now use the same code for DCCP, that has sk_type SOCK_DCCP. Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2271281362
commit
d83d8461f9
20 changed files with 97 additions and 83 deletions
|
@ -163,17 +163,17 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
sk_refcnt_debug_dec(sk);
|
||||
|
||||
if (sk->sk_protocol == IPPROTO_TCP) {
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_dec_use(sk->sk_prot);
|
||||
sock_prot_inc_use(&tcp_prot);
|
||||
local_bh_enable();
|
||||
sk->sk_prot = &tcp_prot;
|
||||
inet_csk(sk)->icsk_af_ops = &ipv4_specific;
|
||||
icsk->icsk_af_ops = &ipv4_specific;
|
||||
sk->sk_socket->ops = &inet_stream_ops;
|
||||
sk->sk_family = PF_INET;
|
||||
tcp_sync_mss(sk, tp->pmtu_cookie);
|
||||
tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||
} else {
|
||||
local_bh_disable();
|
||||
sock_prot_dec_use(sk->sk_prot);
|
||||
|
@ -317,14 +317,15 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
}
|
||||
|
||||
retv = 0;
|
||||
if (sk->sk_type == SOCK_STREAM) {
|
||||
if (inet_sk(sk)->is_icsk) {
|
||||
if (opt) {
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
if (!((1 << sk->sk_state) &
|
||||
(TCPF_LISTEN | TCPF_CLOSE))
|
||||
&& inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
|
||||
tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
|
||||
tcp_sync_mss(sk, tp->pmtu_cookie);
|
||||
icsk->icsk_ext_hdr_len =
|
||||
opt->opt_flen + opt->opt_nflen;
|
||||
icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||
}
|
||||
}
|
||||
opt = xchg(&np->opt, opt);
|
||||
|
@ -380,14 +381,15 @@ sticky_done:
|
|||
goto done;
|
||||
update:
|
||||
retv = 0;
|
||||
if (sk->sk_type == SOCK_STREAM) {
|
||||
if (inet_sk(sk)->is_icsk) {
|
||||
if (opt) {
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
if (!((1 << sk->sk_state) &
|
||||
(TCPF_LISTEN | TCPF_CLOSE))
|
||||
&& inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
|
||||
tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
|
||||
tcp_sync_mss(sk, tp->pmtu_cookie);
|
||||
icsk->icsk_ext_hdr_len =
|
||||
opt->opt_flen + opt->opt_nflen;
|
||||
icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||
}
|
||||
}
|
||||
opt = xchg(&np->opt, opt);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue