Lines Matching +full:no +full:- +full:reset +full:- +full:on +full:- +full:init

1 // SPDX-License-Identifier: GPL-2.0-or-later
42 * The per-net v4_ctl_sk socket is used for responding to
43 * the Out-of-the-blue (OOTB) packets. A control sock will be created
59 dp->dccps_role = DCCP_ROLE_CLIENT; in dccp_v4_connect()
62 return -EINVAL; in dccp_v4_connect()
64 if (usin->sin_family != AF_INET) in dccp_v4_connect()
65 return -EAFNOSUPPORT; in dccp_v4_connect()
67 nexthop = daddr = usin->sin_addr.s_addr; in dccp_v4_connect()
69 inet_opt = rcu_dereference_protected(inet->inet_opt, in dccp_v4_connect()
71 if (inet_opt != NULL && inet_opt->opt.srr) { in dccp_v4_connect()
73 return -EINVAL; in dccp_v4_connect()
74 nexthop = inet_opt->opt.faddr; in dccp_v4_connect()
77 orig_sport = inet->inet_sport; in dccp_v4_connect()
78 orig_dport = usin->sin_port; in dccp_v4_connect()
79 fl4 = &inet->cork.fl.u.ip4; in dccp_v4_connect()
80 rt = ip_route_connect(fl4, nexthop, inet->inet_saddr, in dccp_v4_connect()
81 sk->sk_bound_dev_if, IPPROTO_DCCP, orig_sport, in dccp_v4_connect()
86 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { in dccp_v4_connect()
88 return -ENETUNREACH; in dccp_v4_connect()
91 if (inet_opt == NULL || !inet_opt->opt.srr) in dccp_v4_connect()
92 daddr = fl4->daddr; in dccp_v4_connect()
94 if (inet->inet_saddr == 0) { in dccp_v4_connect()
95 err = inet_bhash2_update_saddr(sk, &fl4->saddr, AF_INET); in dccp_v4_connect()
101 sk_rcv_saddr_set(sk, inet->inet_saddr); in dccp_v4_connect()
104 inet->inet_dport = usin->sin_port; in dccp_v4_connect()
107 inet_csk(sk)->icsk_ext_hdr_len = 0; in dccp_v4_connect()
109 inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen; in dccp_v4_connect()
122 inet->inet_sport, inet->inet_dport, sk); in dccp_v4_connect()
129 sk_setup_caps(sk, &rt->dst); in dccp_v4_connect()
131 dp->dccps_iss = secure_dccp_sequence_number(inet->inet_saddr, in dccp_v4_connect()
132 inet->inet_daddr, in dccp_v4_connect()
133 inet->inet_sport, in dccp_v4_connect()
134 inet->inet_dport); in dccp_v4_connect()
135 atomic_set(&inet->inet_id, get_random_u16()); in dccp_v4_connect()
150 sk->sk_route_caps = 0; in dccp_v4_connect()
151 inet->inet_dport = 0; in dccp_v4_connect()
171 if (sk->sk_state == DCCP_LISTEN) in dccp_do_pmtu_discovery()
182 WRITE_ONCE(sk->sk_err_soft, EMSGSIZE); in dccp_do_pmtu_discovery()
186 if (inet->pmtudisc != IP_PMTUDISC_DONT && in dccp_do_pmtu_discovery()
188 inet_csk(sk)->icsk_pmtu_cookie > mtu) { in dccp_do_pmtu_discovery()
194 * DCCP-Sync packets are the best choice for upward in dccp_do_pmtu_discovery()
195 * probing, since DCCP-Sync probes do not risk application in dccp_do_pmtu_discovery()
198 dccp_send_sync(sk, dp->dccps_gsr, DCCP_PKT_SYNC); in dccp_do_pmtu_discovery()
207 dst->ops->redirect(dst, sk, skb); in dccp_do_redirect()
219 if (!between48(seq, dccp_rsk(req)->dreq_iss, dccp_rsk(req)->dreq_gss)) { in dccp_req_err()
224 * There is no good way to pass the error to the newly in dccp_req_err()
228 inet_csk_reqsk_queue_drop(req->rsk_listener, req); in dccp_req_err()
242 * accesses the socket the ICMP is just dropped and for some paths there is no
248 const struct iphdr *iph = (struct iphdr *)skb->data; in dccp_v4_err()
249 const u8 offset = iph->ihl << 2; in dccp_v4_err()
252 const int type = icmp_hdr(skb)->type; in dccp_v4_err()
253 const int code = icmp_hdr(skb)->code; in dccp_v4_err()
257 struct net *net = dev_net(skb->dev); in dccp_v4_err()
260 return -EINVAL; in dccp_v4_err()
261 dh = (struct dccp_hdr *)(skb->data + offset); in dccp_v4_err()
263 return -EINVAL; in dccp_v4_err()
264 iph = (struct iphdr *)skb->data; in dccp_v4_err()
265 dh = (struct dccp_hdr *)(skb->data + offset); in dccp_v4_err()
268 iph->daddr, dh->dccph_dport, in dccp_v4_err()
269 iph->saddr, ntohs(dh->dccph_sport), in dccp_v4_err()
273 return -ENOENT; in dccp_v4_err()
276 if (sk->sk_state == DCCP_TIME_WAIT) { in dccp_v4_err()
281 if (sk->sk_state == DCCP_NEW_SYN_RECV) { in dccp_v4_err()
287 /* If too many ICMPs get dropped on busy in dccp_v4_err()
293 if (sk->sk_state == DCCP_CLOSED) in dccp_v4_err()
297 if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_LISTEN) && in dccp_v4_err()
298 !between48(seq, dp->dccps_awl, dp->dccps_awh)) { in dccp_v4_err()
333 switch (sk->sk_state) { in dccp_v4_err()
338 sk->sk_err = err; in dccp_v4_err()
344 WRITE_ONCE(sk->sk_err_soft, err); in dccp_v4_err()
362 * --ANK (980905) in dccp_v4_err()
366 sk->sk_err = err; in dccp_v4_err()
368 } else { /* Only an error on timeout */ in dccp_v4_err()
369 WRITE_ONCE(sk->sk_err_soft, err); in dccp_v4_err()
380 return csum_tcpudp_magic(src, dst, skb->len, IPPROTO_DCCP, skb->csum); in dccp_v4_csum_finish()
389 dh->dccph_checksum = dccp_v4_csum_finish(skb, in dccp_v4_send_check()
390 inet->inet_saddr, in dccp_v4_send_check()
391 inet->inet_daddr); in dccp_v4_send_check()
397 return secure_dccp_sequence_number(ip_hdr(skb)->daddr, in dccp_v4_init_sequence()
398 ip_hdr(skb)->saddr, in dccp_v4_init_sequence()
399 dccp_hdr(skb)->dccph_dport, in dccp_v4_init_sequence()
400 dccp_hdr(skb)->dccph_sport); in dccp_v4_init_sequence()
404 * The three way handshake has completed - we got a valid ACK or DATAACK -
429 RCU_INIT_POINTER(newinet->inet_opt, rcu_dereference(ireq->ireq_opt)); in dccp_v4_request_recv_sock()
430 newinet->mc_index = inet_iif(skb); in dccp_v4_request_recv_sock()
431 newinet->mc_ttl = ip_hdr(skb)->ttl; in dccp_v4_request_recv_sock()
432 atomic_set(&newinet->inet_id, get_random_u16()); in dccp_v4_request_recv_sock()
445 ireq->ireq_opt = NULL; in dccp_v4_request_recv_sock()
447 newinet->inet_opt = NULL; in dccp_v4_request_recv_sock()
458 newinet->inet_opt = NULL; in dccp_v4_request_recv_sock()
472 .daddr = iph->saddr, in dccp_v4_route_skb()
473 .saddr = iph->daddr, in dccp_v4_route_skb()
476 .flowi4_proto = sk->sk_protocol, in dccp_v4_route_skb()
477 .fl4_sport = dccp_hdr(skb)->dccph_dport, in dccp_v4_route_skb()
478 .fl4_dport = dccp_hdr(skb)->dccph_sport, in dccp_v4_route_skb()
488 return &rt->dst; in dccp_v4_route_skb()
493 int err = -1; in dccp_v4_send_response()
507 dh->dccph_checksum = dccp_v4_csum_finish(skb, ireq->ir_loc_addr, in dccp_v4_send_response()
508 ireq->ir_rmt_addr); in dccp_v4_send_response()
510 err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr, in dccp_v4_send_response()
511 ireq->ir_rmt_addr, in dccp_v4_send_response()
512 rcu_dereference(ireq->ireq_opt), in dccp_v4_send_response()
513 READ_ONCE(inet_sk(sk)->tos)); in dccp_v4_send_response()
530 struct net *net = dev_net(skb_dst(rxskb)->dev); in dccp_v4_ctl_send_reset()
534 /* Never send a reset in response to a reset. */ in dccp_v4_ctl_send_reset()
535 if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET) in dccp_v4_ctl_send_reset()
538 if (skb_rtable(rxskb)->rt_type != RTN_LOCAL) in dccp_v4_ctl_send_reset()
542 ctl_sk = pn->v4_ctl_sk; in dccp_v4_ctl_send_reset()
552 dccp_hdr(skb)->dccph_checksum = dccp_v4_csum_finish(skb, rxiph->saddr, in dccp_v4_ctl_send_reset()
553 rxiph->daddr); in dccp_v4_ctl_send_reset()
559 rxiph->daddr, rxiph->saddr, NULL, in dccp_v4_ctl_send_reset()
560 inet_sk(ctl_sk)->tos); in dccp_v4_ctl_send_reset()
574 dccp_feat_list_purge(&dccp_rsk(req)->dreq_featneg); in dccp_v4_reqsk_destructor()
575 kfree(rcu_dereference_protected(inet_rsk(req)->ireq_opt, 1)); in dccp_v4_reqsk_destructor()
598 const __be32 service = dccp_hdr_request(skb)->dccph_req_service; in dccp_v4_conn_request()
602 if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) in dccp_v4_conn_request()
603 return 0; /* discard, don't send a reset here */ in dccp_v4_conn_request()
606 dcb->dccpd_reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE; in dccp_v4_conn_request()
614 dcb->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY; in dccp_v4_conn_request()
633 sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr); in dccp_v4_conn_request()
634 sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr); in dccp_v4_conn_request()
635 ireq->ir_mark = inet_request_mark(sk, skb); in dccp_v4_conn_request()
636 ireq->ireq_family = AF_INET; in dccp_v4_conn_request()
637 ireq->ir_iif = READ_ONCE(sk->sk_bound_dev_if); in dccp_v4_conn_request()
645 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie in dccp_v4_conn_request()
649 dreq->dreq_isr = dcb->dccpd_seq; in dccp_v4_conn_request()
650 dreq->dreq_gsr = dreq->dreq_isr; in dccp_v4_conn_request()
651 dreq->dreq_iss = dccp_v4_init_sequence(skb); in dccp_v4_conn_request()
652 dreq->dreq_gss = dreq->dreq_iss; in dccp_v4_conn_request()
653 dreq->dreq_service = service; in dccp_v4_conn_request()
669 return -1; in dccp_v4_conn_request()
677 if (sk->sk_state == DCCP_OPEN) { /* Fast path */ in dccp_v4_do_rcv()
678 if (dccp_rcv_established(sk, skb, dh, skb->len)) in dccp_v4_do_rcv()
679 goto reset; in dccp_v4_do_rcv()
685 * If P.type == Request or P contains a valid Init Cookie option, in dccp_v4_do_rcv()
686 * (* Must scan the packet's options to check for Init in dccp_v4_do_rcv()
687 * Cookies. Only Init Cookies are processed here, in dccp_v4_do_rcv()
689 * scan need only be performed if the endpoint uses Init in dccp_v4_do_rcv()
694 * Choose S.ISS (initial seqno) or set from Init Cookies in dccp_v4_do_rcv()
696 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies in dccp_v4_do_rcv()
700 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_do_rcv()
707 if (dccp_rcv_state_process(sk, skb, dh, skb->len)) in dccp_v4_do_rcv()
708 goto reset; in dccp_v4_do_rcv()
711 reset: in dccp_v4_do_rcv()
719 * dccp_invalid_packet - check for malformed packets
731 if (skb->pkt_type != PACKET_HOST) in dccp_invalid_packet()
743 if (dh->dccph_type >= DCCP_PKT_INVALID) { in dccp_invalid_packet()
751 dccph_doff = dh->dccph_doff; in dccp_invalid_packet()
768 if ((dh->dccph_type < DCCP_PKT_DATA || in dccp_invalid_packet()
769 dh->dccph_type > DCCP_PKT_DATAACK) && dh->dccph_x == 0) { in dccp_invalid_packet()
771 dccp_packet_name(dh->dccph_type)); in dccp_invalid_packet()
780 if (cscov > skb->len) { in dccp_invalid_packet()
782 dh->dccph_cscov, skb->len); in dccp_invalid_packet()
787 * (This step is completed in the AF-dependent functions.) */ in dccp_invalid_packet()
788 skb->csum = skb_checksum(skb, 0, cscov, 0); in dccp_invalid_packet()
810 if (dccp_v4_csum_finish(skb, iph->saddr, iph->daddr)) { in dccp_v4_rcv()
817 DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh); in dccp_v4_rcv()
818 DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type; in dccp_v4_rcv()
820 dccp_pr_debug("%8.8s src=%pI4@%-5d dst=%pI4@%-5d seq=%llu", in dccp_v4_rcv()
821 dccp_packet_name(dh->dccph_type), in dccp_v4_rcv()
822 &iph->saddr, ntohs(dh->dccph_sport), in dccp_v4_rcv()
823 &iph->daddr, ntohs(dh->dccph_dport), in dccp_v4_rcv()
824 (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq); in dccp_v4_rcv()
827 DCCP_SKB_CB(skb)->dccpd_ack_seq = DCCP_PKT_WITHOUT_ACK_SEQ; in dccp_v4_rcv()
830 DCCP_SKB_CB(skb)->dccpd_ack_seq = dccp_hdr_ack_seq(skb); in dccp_v4_rcv()
832 DCCP_SKB_CB(skb)->dccpd_ack_seq); in dccp_v4_rcv()
837 dh->dccph_sport, dh->dccph_dport, 0, &refcounted); in dccp_v4_rcv()
847 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_rcv()
850 if (sk->sk_state == DCCP_TIME_WAIT) { in dccp_v4_rcv()
851 dccp_pr_debug("sk->sk_state == DCCP_TIME_WAIT: do_time_wait\n"); in dccp_v4_rcv()
856 if (sk->sk_state == DCCP_NEW_SYN_RECV) { in dccp_v4_rcv()
860 sk = req->rsk_listener; in dccp_v4_rcv()
861 if (unlikely(sk->sk_state != DCCP_LISTEN)) { in dccp_v4_rcv()
887 min_cov = dccp_sk(sk)->dccps_pcrlen; in dccp_v4_rcv()
888 if (dh->dccph_cscov && (min_cov == 0 || dh->dccph_cscov < min_cov)) { in dccp_v4_rcv()
890 dh->dccph_cscov, min_cov); in dccp_v4_rcv()
901 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4, refcounted); in dccp_v4_rcv()
908 * If no socket ... in dccp_v4_rcv()
909 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_rcv()
912 if (dh->dccph_type != DCCP_PKT_RESET) { in dccp_v4_rcv()
913 DCCP_SKB_CB(skb)->dccpd_reset_code = in dccp_v4_rcv()
947 inet_csk(sk)->icsk_af_ops = &dccp_ipv4_af_ops; in dccp_v4_init_sock()
964 .init = dccp_v4_init_sock,
1001 /* FIXME: work on tcp_poll to rename it to inet_csk_poll */
1005 /* FIXME: work on inet_listen to rename it to sock_common_listen */
1028 return -ESOCKTNOSUPPORT; in dccp_v4_init_net()
1030 return inet_ctl_sock_create(&pn->v4_ctl_sk, PF_INET, in dccp_v4_init_net()
1038 inet_ctl_sock_destroy(pn->v4_ctl_sk); in dccp_v4_exit_net()
1047 .init = dccp_v4_init_net,
1095 * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
1101 MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");