Lines Matching +full:no +full:- +full:reset +full:- +full:on +full:- +full:init
1 // SPDX-License-Identifier: GPL-2.0-or-later
40 * The per-net v4_ctl_sk socket is used for responding to
41 * the Out-of-the-blue (OOTB) packets. A control sock will be created
57 dp->dccps_role = DCCP_ROLE_CLIENT; in dccp_v4_connect()
60 return -EINVAL; in dccp_v4_connect()
62 if (usin->sin_family != AF_INET) in dccp_v4_connect()
63 return -EAFNOSUPPORT; in dccp_v4_connect()
65 nexthop = daddr = usin->sin_addr.s_addr; in dccp_v4_connect()
67 inet_opt = rcu_dereference_protected(inet->inet_opt, in dccp_v4_connect()
69 if (inet_opt != NULL && inet_opt->opt.srr) { in dccp_v4_connect()
71 return -EINVAL; in dccp_v4_connect()
72 nexthop = inet_opt->opt.faddr; in dccp_v4_connect()
75 orig_sport = inet->inet_sport; in dccp_v4_connect()
76 orig_dport = usin->sin_port; in dccp_v4_connect()
77 fl4 = &inet->cork.fl.u.ip4; in dccp_v4_connect()
78 rt = ip_route_connect(fl4, nexthop, inet->inet_saddr, in dccp_v4_connect()
79 RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, in dccp_v4_connect()
85 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { in dccp_v4_connect()
87 return -ENETUNREACH; in dccp_v4_connect()
90 if (inet_opt == NULL || !inet_opt->opt.srr) in dccp_v4_connect()
91 daddr = fl4->daddr; in dccp_v4_connect()
93 if (inet->inet_saddr == 0) in dccp_v4_connect()
94 inet->inet_saddr = fl4->saddr; in dccp_v4_connect()
95 sk_rcv_saddr_set(sk, inet->inet_saddr); in dccp_v4_connect()
96 inet->inet_dport = usin->sin_port; in dccp_v4_connect()
99 inet_csk(sk)->icsk_ext_hdr_len = 0; in dccp_v4_connect()
101 inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen; in dccp_v4_connect()
114 inet->inet_sport, inet->inet_dport, sk); in dccp_v4_connect()
121 sk_setup_caps(sk, &rt->dst); in dccp_v4_connect()
123 dp->dccps_iss = secure_dccp_sequence_number(inet->inet_saddr, in dccp_v4_connect()
124 inet->inet_daddr, in dccp_v4_connect()
125 inet->inet_sport, in dccp_v4_connect()
126 inet->inet_dport); in dccp_v4_connect()
127 inet->inet_id = prandom_u32(); in dccp_v4_connect()
141 sk->sk_route_caps = 0; in dccp_v4_connect()
142 inet->inet_dport = 0; in dccp_v4_connect()
162 if (sk->sk_state == DCCP_LISTEN) in dccp_do_pmtu_discovery()
173 sk->sk_err_soft = EMSGSIZE; in dccp_do_pmtu_discovery()
177 if (inet->pmtudisc != IP_PMTUDISC_DONT && in dccp_do_pmtu_discovery()
179 inet_csk(sk)->icsk_pmtu_cookie > mtu) { in dccp_do_pmtu_discovery()
185 * DCCP-Sync packets are the best choice for upward in dccp_do_pmtu_discovery()
186 * probing, since DCCP-Sync probes do not risk application in dccp_do_pmtu_discovery()
189 dccp_send_sync(sk, dp->dccps_gsr, DCCP_PKT_SYNC); in dccp_do_pmtu_discovery()
198 dst->ops->redirect(dst, sk, skb); in dccp_do_redirect()
210 if (!between48(seq, dccp_rsk(req)->dreq_iss, dccp_rsk(req)->dreq_gss)) { in dccp_req_err()
215 * There is no good way to pass the error to the newly in dccp_req_err()
219 inet_csk_reqsk_queue_drop(req->rsk_listener, req); in dccp_req_err()
233 * accesses the socket the ICMP is just dropped and for some paths there is no
239 const struct iphdr *iph = (struct iphdr *)skb->data; in dccp_v4_err()
240 const u8 offset = iph->ihl << 2; in dccp_v4_err()
244 const int type = icmp_hdr(skb)->type; in dccp_v4_err()
245 const int code = icmp_hdr(skb)->code; in dccp_v4_err()
249 struct net *net = dev_net(skb->dev); in dccp_v4_err()
257 dh = (struct dccp_hdr *)(skb->data + offset); in dccp_v4_err()
260 iph->daddr, dh->dccph_dport, in dccp_v4_err()
261 iph->saddr, ntohs(dh->dccph_sport), in dccp_v4_err()
265 return -ENOENT; in dccp_v4_err()
268 if (sk->sk_state == DCCP_TIME_WAIT) { in dccp_v4_err()
273 if (sk->sk_state == DCCP_NEW_SYN_RECV) { in dccp_v4_err()
279 /* If too many ICMPs get dropped on busy in dccp_v4_err()
285 if (sk->sk_state == DCCP_CLOSED) in dccp_v4_err()
289 if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_LISTEN) && in dccp_v4_err()
290 !between48(seq, dp->dccps_awl, dp->dccps_awh)) { in dccp_v4_err()
325 switch (sk->sk_state) { in dccp_v4_err()
330 sk->sk_err = err; in dccp_v4_err()
336 sk->sk_err_soft = err; in dccp_v4_err()
353 * --ANK (980905) in dccp_v4_err()
357 if (!sock_owned_by_user(sk) && inet->recverr) { in dccp_v4_err()
358 sk->sk_err = err; in dccp_v4_err()
360 } else /* Only an error on timeout */ in dccp_v4_err()
361 sk->sk_err_soft = err; in dccp_v4_err()
371 return csum_tcpudp_magic(src, dst, skb->len, IPPROTO_DCCP, skb->csum); in dccp_v4_csum_finish()
380 dh->dccph_checksum = dccp_v4_csum_finish(skb, in dccp_v4_send_check()
381 inet->inet_saddr, in dccp_v4_send_check()
382 inet->inet_daddr); in dccp_v4_send_check()
388 return secure_dccp_sequence_number(ip_hdr(skb)->daddr, in dccp_v4_init_sequence()
389 ip_hdr(skb)->saddr, in dccp_v4_init_sequence()
390 dccp_hdr(skb)->dccph_dport, in dccp_v4_init_sequence()
391 dccp_hdr(skb)->dccph_sport); in dccp_v4_init_sequence()
395 * The three way handshake has completed - we got a valid ACK or DATAACK -
420 sk_daddr_set(newsk, ireq->ir_rmt_addr); in dccp_v4_request_recv_sock()
421 sk_rcv_saddr_set(newsk, ireq->ir_loc_addr); in dccp_v4_request_recv_sock()
422 newinet->inet_saddr = ireq->ir_loc_addr; in dccp_v4_request_recv_sock()
423 RCU_INIT_POINTER(newinet->inet_opt, rcu_dereference(ireq->ireq_opt)); in dccp_v4_request_recv_sock()
424 newinet->mc_index = inet_iif(skb); in dccp_v4_request_recv_sock()
425 newinet->mc_ttl = ip_hdr(skb)->ttl; in dccp_v4_request_recv_sock()
426 newinet->inet_id = prandom_u32(); in dccp_v4_request_recv_sock()
439 ireq->ireq_opt = NULL; in dccp_v4_request_recv_sock()
441 newinet->inet_opt = NULL; in dccp_v4_request_recv_sock()
452 newinet->inet_opt = NULL; in dccp_v4_request_recv_sock()
466 .daddr = iph->saddr, in dccp_v4_route_skb()
467 .saddr = iph->daddr, in dccp_v4_route_skb()
469 .flowi4_proto = sk->sk_protocol, in dccp_v4_route_skb()
470 .fl4_sport = dccp_hdr(skb)->dccph_dport, in dccp_v4_route_skb()
471 .fl4_dport = dccp_hdr(skb)->dccph_sport, in dccp_v4_route_skb()
481 return &rt->dst; in dccp_v4_route_skb()
486 int err = -1; in dccp_v4_send_response()
500 dh->dccph_checksum = dccp_v4_csum_finish(skb, ireq->ir_loc_addr, in dccp_v4_send_response()
501 ireq->ir_rmt_addr); in dccp_v4_send_response()
503 err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr, in dccp_v4_send_response()
504 ireq->ir_rmt_addr, in dccp_v4_send_response()
505 rcu_dereference(ireq->ireq_opt), in dccp_v4_send_response()
506 inet_sk(sk)->tos); in dccp_v4_send_response()
522 struct net *net = dev_net(skb_dst(rxskb)->dev); in dccp_v4_ctl_send_reset()
526 /* Never send a reset in response to a reset. */ in dccp_v4_ctl_send_reset()
527 if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET) in dccp_v4_ctl_send_reset()
530 if (skb_rtable(rxskb)->rt_type != RTN_LOCAL) in dccp_v4_ctl_send_reset()
534 ctl_sk = pn->v4_ctl_sk; in dccp_v4_ctl_send_reset()
544 dccp_hdr(skb)->dccph_checksum = dccp_v4_csum_finish(skb, rxiph->saddr, in dccp_v4_ctl_send_reset()
545 rxiph->daddr); in dccp_v4_ctl_send_reset()
551 rxiph->daddr, rxiph->saddr, NULL, in dccp_v4_ctl_send_reset()
552 inet_sk(ctl_sk)->tos); in dccp_v4_ctl_send_reset()
566 dccp_feat_list_purge(&dccp_rsk(req)->dreq_featneg); in dccp_v4_reqsk_destructor()
567 kfree(rcu_dereference_protected(inet_rsk(req)->ireq_opt, 1)); in dccp_v4_reqsk_destructor()
590 const __be32 service = dccp_hdr_request(skb)->dccph_req_service; in dccp_v4_conn_request()
594 if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) in dccp_v4_conn_request()
595 return 0; /* discard, don't send a reset here */ in dccp_v4_conn_request()
598 dcb->dccpd_reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE; in dccp_v4_conn_request()
606 dcb->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY; in dccp_v4_conn_request()
628 sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr); in dccp_v4_conn_request()
629 sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr); in dccp_v4_conn_request()
630 ireq->ir_mark = inet_request_mark(sk, skb); in dccp_v4_conn_request()
631 ireq->ireq_family = AF_INET; in dccp_v4_conn_request()
632 ireq->ir_iif = sk->sk_bound_dev_if; in dccp_v4_conn_request()
637 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie in dccp_v4_conn_request()
641 dreq->dreq_isr = dcb->dccpd_seq; in dccp_v4_conn_request()
642 dreq->dreq_gsr = dreq->dreq_isr; in dccp_v4_conn_request()
643 dreq->dreq_iss = dccp_v4_init_sequence(skb); in dccp_v4_conn_request()
644 dreq->dreq_gss = dreq->dreq_iss; in dccp_v4_conn_request()
645 dreq->dreq_service = service; in dccp_v4_conn_request()
658 return -1; in dccp_v4_conn_request()
666 if (sk->sk_state == DCCP_OPEN) { /* Fast path */ in dccp_v4_do_rcv()
667 if (dccp_rcv_established(sk, skb, dh, skb->len)) in dccp_v4_do_rcv()
668 goto reset; in dccp_v4_do_rcv()
674 * If P.type == Request or P contains a valid Init Cookie option, in dccp_v4_do_rcv()
675 * (* Must scan the packet's options to check for Init in dccp_v4_do_rcv()
676 * Cookies. Only Init Cookies are processed here, in dccp_v4_do_rcv()
678 * scan need only be performed if the endpoint uses Init in dccp_v4_do_rcv()
683 * Choose S.ISS (initial seqno) or set from Init Cookies in dccp_v4_do_rcv()
685 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies in dccp_v4_do_rcv()
689 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_do_rcv()
696 if (dccp_rcv_state_process(sk, skb, dh, skb->len)) in dccp_v4_do_rcv()
697 goto reset; in dccp_v4_do_rcv()
700 reset: in dccp_v4_do_rcv()
708 * dccp_invalid_packet - check for malformed packets
720 if (skb->pkt_type != PACKET_HOST) in dccp_invalid_packet()
732 if (dh->dccph_type >= DCCP_PKT_INVALID) { in dccp_invalid_packet()
740 dccph_doff = dh->dccph_doff; in dccp_invalid_packet()
757 if ((dh->dccph_type < DCCP_PKT_DATA || in dccp_invalid_packet()
758 dh->dccph_type > DCCP_PKT_DATAACK) && dh->dccph_x == 0) { in dccp_invalid_packet()
760 dccp_packet_name(dh->dccph_type)); in dccp_invalid_packet()
769 if (cscov > skb->len) { in dccp_invalid_packet()
771 dh->dccph_cscov, skb->len); in dccp_invalid_packet()
776 * (This step is completed in the AF-dependent functions.) */ in dccp_invalid_packet()
777 skb->csum = skb_checksum(skb, 0, cscov, 0); in dccp_invalid_packet()
799 if (dccp_v4_csum_finish(skb, iph->saddr, iph->daddr)) { in dccp_v4_rcv()
806 DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh); in dccp_v4_rcv()
807 DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type; in dccp_v4_rcv()
809 dccp_pr_debug("%8.8s src=%pI4@%-5d dst=%pI4@%-5d seq=%llu", in dccp_v4_rcv()
810 dccp_packet_name(dh->dccph_type), in dccp_v4_rcv()
811 &iph->saddr, ntohs(dh->dccph_sport), in dccp_v4_rcv()
812 &iph->daddr, ntohs(dh->dccph_dport), in dccp_v4_rcv()
813 (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq); in dccp_v4_rcv()
816 DCCP_SKB_CB(skb)->dccpd_ack_seq = DCCP_PKT_WITHOUT_ACK_SEQ; in dccp_v4_rcv()
819 DCCP_SKB_CB(skb)->dccpd_ack_seq = dccp_hdr_ack_seq(skb); in dccp_v4_rcv()
821 DCCP_SKB_CB(skb)->dccpd_ack_seq); in dccp_v4_rcv()
826 dh->dccph_sport, dh->dccph_dport, 0, &refcounted); in dccp_v4_rcv()
836 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_rcv()
839 if (sk->sk_state == DCCP_TIME_WAIT) { in dccp_v4_rcv()
840 dccp_pr_debug("sk->sk_state == DCCP_TIME_WAIT: do_time_wait\n"); in dccp_v4_rcv()
845 if (sk->sk_state == DCCP_NEW_SYN_RECV) { in dccp_v4_rcv()
849 sk = req->rsk_listener; in dccp_v4_rcv()
850 if (unlikely(sk->sk_state != DCCP_LISTEN)) { in dccp_v4_rcv()
876 min_cov = dccp_sk(sk)->dccps_pcrlen; in dccp_v4_rcv()
877 if (dh->dccph_cscov && (min_cov == 0 || dh->dccph_cscov < min_cov)) { in dccp_v4_rcv()
879 dh->dccph_cscov, min_cov); in dccp_v4_rcv()
890 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4, refcounted); in dccp_v4_rcv()
897 * If no socket ... in dccp_v4_rcv()
898 * Generate Reset(No Connection) unless P.type == Reset in dccp_v4_rcv()
901 if (dh->dccph_type != DCCP_PKT_RESET) { in dccp_v4_rcv()
902 DCCP_SKB_CB(skb)->dccpd_reset_code = in dccp_v4_rcv()
938 inet_csk(sk)->icsk_af_ops = &dccp_ipv4_af_ops; in dccp_v4_init_sock()
955 .init = dccp_v4_init_sock,
992 /* FIXME: work on tcp_poll to rename it to inet_csk_poll */
996 /* FIXME: work on inet_listen to rename it to sock_common_listen */
1020 return -ESOCKTNOSUPPORT; in dccp_v4_init_net()
1022 return inet_ctl_sock_create(&pn->v4_ctl_sk, PF_INET, in dccp_v4_init_net()
1030 inet_ctl_sock_destroy(pn->v4_ctl_sk); in dccp_v4_exit_net()
1039 .init = dccp_v4_init_net,
1087 * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
1093 MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");