1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * net/dccp/minisocks.c 4 * 5 * An implementation of the DCCP protocol 6 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 7 */ 8 9 #include <linux/dccp.h> 10 #include <linux/gfp.h> 11 #include <linux/kernel.h> 12 #include <linux/skbuff.h> 13 #include <linux/timer.h> 14 15 #include <net/sock.h> 16 #include <net/xfrm.h> 17 #include <net/inet_timewait_sock.h> 18 19 #include "ackvec.h" 20 #include "ccid.h" 21 #include "dccp.h" 22 #include "feat.h" 23 24 struct inet_timewait_death_row dccp_death_row = { 25 .sysctl_max_tw_buckets = NR_FILE * 2, 26 .hashinfo = &dccp_hashinfo, 27 }; 28 29 EXPORT_SYMBOL_GPL(dccp_death_row); 30 31 void dccp_time_wait(struct sock *sk, int state, int timeo) 32 { 33 struct inet_timewait_sock *tw; 34 35 tw = inet_twsk_alloc(sk, &dccp_death_row, state); 36 37 if (tw != NULL) { 38 const struct inet_connection_sock *icsk = inet_csk(sk); 39 const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1); 40 #if IS_ENABLED(CONFIG_IPV6) 41 if (tw->tw_family == PF_INET6) { 42 tw->tw_v6_daddr = sk->sk_v6_daddr; 43 tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr; 44 tw->tw_ipv6only = sk->sk_ipv6only; 45 } 46 #endif 47 48 /* Get the TIME_WAIT timeout firing. */ 49 if (timeo < rto) 50 timeo = rto; 51 52 if (state == DCCP_TIME_WAIT) 53 timeo = DCCP_TIMEWAIT_LEN; 54 55 /* tw_timer is pinned, so we need to make sure BH are disabled 56 * in following section, otherwise timer handler could run before 57 * we complete the initialization. 58 */ 59 local_bh_disable(); 60 inet_twsk_schedule(tw, timeo); 61 /* Linkage updates. 62 * Note that access to tw after this point is illegal. 63 */ 64 inet_twsk_hashdance(tw, sk, &dccp_hashinfo); 65 local_bh_enable(); 66 } else { 67 /* Sorry, if we're out of memory, just CLOSE this 68 * socket up. We've got bigger problems than 69 * non-graceful socket closings. 70 */ 71 DCCP_WARN("time wait bucket table overflow\n"); 72 } 73 74 dccp_done(sk); 75 } 76 77 struct sock *dccp_create_openreq_child(const struct sock *sk, 78 const struct request_sock *req, 79 const struct sk_buff *skb) 80 { 81 /* 82 * Step 3: Process LISTEN state 83 * 84 * (* Generate a new socket and switch to that socket *) 85 * Set S := new socket for this port pair 86 */ 87 struct sock *newsk = inet_csk_clone_lock(sk, req, GFP_ATOMIC); 88 89 if (newsk != NULL) { 90 struct dccp_request_sock *dreq = dccp_rsk(req); 91 struct inet_connection_sock *newicsk = inet_csk(newsk); 92 struct dccp_sock *newdp = dccp_sk(newsk); 93 94 newdp->dccps_role = DCCP_ROLE_SERVER; 95 newdp->dccps_hc_rx_ackvec = NULL; 96 newdp->dccps_service_list = NULL; 97 newdp->dccps_hc_rx_ccid = NULL; 98 newdp->dccps_hc_tx_ccid = NULL; 99 newdp->dccps_service = dreq->dreq_service; 100 newdp->dccps_timestamp_echo = dreq->dreq_timestamp_echo; 101 newdp->dccps_timestamp_time = dreq->dreq_timestamp_time; 102 newicsk->icsk_rto = DCCP_TIMEOUT_INIT; 103 104 INIT_LIST_HEAD(&newdp->dccps_featneg); 105 /* 106 * Step 3: Process LISTEN state 107 * 108 * Choose S.ISS (initial seqno) or set from Init Cookies 109 * Initialize S.GAR := S.ISS 110 * Set S.ISR, S.GSR from packet (or Init Cookies) 111 * 112 * Setting AWL/AWH and SWL/SWH happens as part of the feature 113 * activation below, as these windows all depend on the local 114 * and remote Sequence Window feature values (7.5.2). 115 */ 116 newdp->dccps_iss = dreq->dreq_iss; 117 newdp->dccps_gss = dreq->dreq_gss; 118 newdp->dccps_gar = newdp->dccps_iss; 119 newdp->dccps_isr = dreq->dreq_isr; 120 newdp->dccps_gsr = dreq->dreq_gsr; 121 122 /* 123 * Activate features: initialise CCIDs, sequence windows etc. 124 */ 125 if (dccp_feat_activate_values(newsk, &dreq->dreq_featneg)) { 126 sk_free_unlock_clone(newsk); 127 return NULL; 128 } 129 dccp_init_xmit_timers(newsk); 130 131 __DCCP_INC_STATS(DCCP_MIB_PASSIVEOPENS); 132 } 133 return newsk; 134 } 135 136 EXPORT_SYMBOL_GPL(dccp_create_openreq_child); 137 138 /* 139 * Process an incoming packet for RESPOND sockets represented 140 * as an request_sock. 141 */ 142 struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb, 143 struct request_sock *req) 144 { 145 struct sock *child = NULL; 146 struct dccp_request_sock *dreq = dccp_rsk(req); 147 bool own_req; 148 149 /* TCP/DCCP listeners became lockless. 150 * DCCP stores complex state in its request_sock, so we need 151 * a protection for them, now this code runs without being protected 152 * by the parent (listener) lock. 153 */ 154 spin_lock_bh(&dreq->dreq_lock); 155 156 /* Check for retransmitted REQUEST */ 157 if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) { 158 159 if (after48(DCCP_SKB_CB(skb)->dccpd_seq, dreq->dreq_gsr)) { 160 dccp_pr_debug("Retransmitted REQUEST\n"); 161 dreq->dreq_gsr = DCCP_SKB_CB(skb)->dccpd_seq; 162 /* 163 * Send another RESPONSE packet 164 * To protect against Request floods, increment retrans 165 * counter (backoff, monitored by dccp_response_timer). 166 */ 167 inet_rtx_syn_ack(sk, req); 168 } 169 /* Network Duplicate, discard packet */ 170 goto out; 171 } 172 173 DCCP_SKB_CB(skb)->dccpd_reset_code = DCCP_RESET_CODE_PACKET_ERROR; 174 175 if (dccp_hdr(skb)->dccph_type != DCCP_PKT_ACK && 176 dccp_hdr(skb)->dccph_type != DCCP_PKT_DATAACK) 177 goto drop; 178 179 /* Invalid ACK */ 180 if (!between48(DCCP_SKB_CB(skb)->dccpd_ack_seq, 181 dreq->dreq_iss, dreq->dreq_gss)) { 182 dccp_pr_debug("Invalid ACK number: ack_seq=%llu, " 183 "dreq_iss=%llu, dreq_gss=%llu\n", 184 (unsigned long long) 185 DCCP_SKB_CB(skb)->dccpd_ack_seq, 186 (unsigned long long) dreq->dreq_iss, 187 (unsigned long long) dreq->dreq_gss); 188 goto drop; 189 } 190 191 if (dccp_parse_options(sk, dreq, skb)) 192 goto drop; 193 194 child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL, 195 req, &own_req); 196 if (child) { 197 child = inet_csk_complete_hashdance(sk, child, req, own_req); 198 goto out; 199 } 200 201 DCCP_SKB_CB(skb)->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY; 202 drop: 203 if (dccp_hdr(skb)->dccph_type != DCCP_PKT_RESET) 204 req->rsk_ops->send_reset(sk, skb); 205 206 inet_csk_reqsk_queue_drop(sk, req); 207 out: 208 spin_unlock_bh(&dreq->dreq_lock); 209 return child; 210 } 211 212 EXPORT_SYMBOL_GPL(dccp_check_req); 213 214 /* 215 * Queue segment on the new socket if the new socket is active, 216 * otherwise we just shortcircuit this and continue with 217 * the new socket. 218 */ 219 int dccp_child_process(struct sock *parent, struct sock *child, 220 struct sk_buff *skb) 221 __releases(child) 222 { 223 int ret = 0; 224 const int state = child->sk_state; 225 226 if (!sock_owned_by_user(child)) { 227 ret = dccp_rcv_state_process(child, skb, dccp_hdr(skb), 228 skb->len); 229 230 /* Wakeup parent, send SIGIO */ 231 if (state == DCCP_RESPOND && child->sk_state != state) 232 parent->sk_data_ready(parent); 233 } else { 234 /* Alas, it is possible again, because we do lookup 235 * in main socket hash table and lock on listening 236 * socket does not protect us more. 237 */ 238 __sk_add_backlog(child, skb); 239 } 240 241 bh_unlock_sock(child); 242 sock_put(child); 243 return ret; 244 } 245 246 EXPORT_SYMBOL_GPL(dccp_child_process); 247 248 void dccp_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb, 249 struct request_sock *rsk) 250 { 251 DCCP_BUG("DCCP-ACK packets are never sent in LISTEN/RESPOND state"); 252 } 253 254 EXPORT_SYMBOL_GPL(dccp_reqsk_send_ack); 255 256 int dccp_reqsk_init(struct request_sock *req, 257 struct dccp_sock const *dp, struct sk_buff const *skb) 258 { 259 struct dccp_request_sock *dreq = dccp_rsk(req); 260 261 spin_lock_init(&dreq->dreq_lock); 262 inet_rsk(req)->ir_rmt_port = dccp_hdr(skb)->dccph_sport; 263 inet_rsk(req)->ir_num = ntohs(dccp_hdr(skb)->dccph_dport); 264 inet_rsk(req)->acked = 0; 265 dreq->dreq_timestamp_echo = 0; 266 267 /* inherit feature negotiation options from listening socket */ 268 return dccp_feat_clone_list(&dp->dccps_featneg, &dreq->dreq_featneg); 269 } 270 271 EXPORT_SYMBOL_GPL(dccp_reqsk_init); 272