LCOV - code coverage report
Current view: top level - home/net-next/net/quic - socket.h (source / functions) Hit Total Coverage
Test: quic.info Lines: 56 56 100.0 %
Date: 2025-07-04 13:24:45 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2             : /* QUIC kernel implementation
       3             :  * (C) Copyright Red Hat Corp. 2023
       4             :  *
       5             :  * This file is part of the QUIC kernel implementation
       6             :  *
       7             :  * Written or modified by:
       8             :  *    Xin Long <lucien.xin@gmail.com>
       9             :  */
      10             : 
      11             : #ifndef __net_quic_h__
      12             : #define __net_quic_h__
      13             : 
      14             : #include <net/udp_tunnel.h>
      15             : #include <linux/quic.h>
      16             : 
      17             : #include "pnspace.h"
      18             : #include "common.h"
      19             : #include "family.h"
      20             : #include "stream.h"
      21             : #include "connid.h"
      22             : #include "crypto.h"
      23             : #include "path.h"
      24             : #include "cong.h"
      25             : 
      26             : #include "packet.h"
      27             : #include "frame.h"
      28             : 
      29             : #include "protocol.h"
      30             : #include "outqueue.h"
      31             : #include "inqueue.h"
      32             : #include "timer.h"
      33             : 
      34             : extern struct proto quic_prot;
      35             : extern struct proto quicv6_prot;
      36             : 
      37             : enum quic_state {
      38             :         QUIC_SS_CLOSED          = TCP_CLOSE,
      39             :         QUIC_SS_LISTENING       = TCP_LISTEN,
      40             :         QUIC_SS_ESTABLISHING    = TCP_SYN_RECV,
      41             :         QUIC_SS_ESTABLISHED     = TCP_ESTABLISHED,
      42             : };
      43             : 
      44             : enum quic_tsq_enum {
      45             :         QUIC_MTU_REDUCED_DEFERRED,
      46             :         QUIC_LOSS_DEFERRED,
      47             :         QUIC_SACK_DEFERRED,
      48             :         QUIC_PATH_DEFERRED,
      49             :         QUIC_PMTU_DEFERRED,
      50             :         QUIC_TSQ_DEFERRED,
      51             : };
      52             : 
      53             : enum quic_tsq_flags {
      54             :         QUIC_F_MTU_REDUCED_DEFERRED     = BIT(QUIC_MTU_REDUCED_DEFERRED),
      55             :         QUIC_F_LOSS_DEFERRED            = BIT(QUIC_LOSS_DEFERRED),
      56             :         QUIC_F_SACK_DEFERRED            = BIT(QUIC_SACK_DEFERRED),
      57             :         QUIC_F_PATH_DEFERRED            = BIT(QUIC_PATH_DEFERRED),
      58             :         QUIC_F_PMTU_DEFERRED            = BIT(QUIC_PMTU_DEFERRED),
      59             :         QUIC_F_TSQ_DEFERRED             = BIT(QUIC_TSQ_DEFERRED),
      60             : };
      61             : 
      62             : #define QUIC_DEFERRED_ALL (QUIC_F_MTU_REDUCED_DEFERRED |        \
      63             :                            QUIC_F_LOSS_DEFERRED |               \
      64             :                            QUIC_F_SACK_DEFERRED |               \
      65             :                            QUIC_F_PATH_DEFERRED |               \
      66             :                            QUIC_F_PMTU_DEFERRED |               \
      67             :                            QUIC_F_TSQ_DEFERRED)
      68             : 
      69             : struct quic_request_sock {
      70             :         struct list_head        list;
      71             : 
      72             :         struct quic_conn_id     dcid;
      73             :         struct quic_conn_id     scid;
      74             :         union quic_addr         daddr;
      75             :         union quic_addr         saddr;
      76             : 
      77             :         struct quic_conn_id     orig_dcid;
      78             :         u32                     version;
      79             :         u8                      retry;
      80             : };
      81             : 
      82             : struct quic_sock {
      83             :         struct inet_sock                inet;
      84             :         struct list_head                reqs;
      85             : 
      86             :         struct quic_config              config;
      87             :         struct quic_data                ticket;
      88             :         struct quic_data                token;
      89             :         struct quic_data                alpn;
      90             : 
      91             :         struct quic_stream_table        streams;
      92             :         struct quic_conn_id_set         source;
      93             :         struct quic_conn_id_set         dest;
      94             :         struct quic_path_group          paths;
      95             :         struct quic_cong                cong;
      96             :         struct quic_pnspace             space[QUIC_PNSPACE_MAX];
      97             :         struct quic_crypto              crypto[QUIC_CRYPTO_MAX];
      98             : 
      99             :         struct quic_outqueue            outq;
     100             :         struct quic_inqueue             inq;
     101             :         struct quic_packet              packet;
     102             :         struct quic_timer               timers[QUIC_TIMER_MAX];
     103             : };
     104             : 
     105             : struct quic6_sock {
     106             :         struct quic_sock        quic;
     107             :         struct ipv6_pinfo       inet6;
     108             : };
     109             : 
     110             : static inline struct quic_sock *quic_sk(const struct sock *sk)
     111             : {
     112             :         return (struct quic_sock *)sk;
     113             : }
     114             : 
     115        1905 : static inline struct list_head *quic_reqs(const struct sock *sk)
     116             : {
     117        1905 :         return &quic_sk(sk)->reqs;
     118             : }
     119             : 
     120         420 : static inline struct quic_config *quic_config(const struct sock *sk)
     121             : {
     122    24905519 :         return &quic_sk(sk)->config;
     123             : }
     124             : 
     125         473 : static inline struct quic_data *quic_token(const struct sock *sk)
     126             : {
     127        3573 :         return &quic_sk(sk)->token;
     128             : }
     129             : 
     130        3199 : static inline struct quic_data *quic_ticket(const struct sock *sk)
     131             : {
     132        5310 :         return &quic_sk(sk)->ticket;
     133             : }
     134             : 
     135        2043 : static inline struct quic_data *quic_alpn(const struct sock *sk)
     136             : {
     137        3161 :         return &quic_sk(sk)->alpn;
     138             : }
     139             : 
     140    21563002 : static inline struct quic_stream_table *quic_streams(const struct sock *sk)
     141             : {
     142    38134009 :         return &quic_sk(sk)->streams;
     143             : }
     144             : 
     145       11537 : static inline struct quic_conn_id_set *quic_source(const struct sock *sk)
     146             : {
     147       12524 :         return &quic_sk(sk)->source;
     148             : }
     149             : 
     150     6583092 : static inline struct quic_conn_id_set *quic_dest(const struct sock *sk)
     151             : {
     152    26592497 :         return &quic_sk(sk)->dest;
     153             : }
     154             : 
     155    24600701 : static inline struct quic_path_group *quic_paths(const struct sock *sk)
     156             : {
     157    75701469 :         return &quic_sk(sk)->paths;
     158             : }
     159             : 
     160    26487757 : static inline bool quic_is_serv(const struct sock *sk)
     161             : {
     162    26486764 :         return quic_paths(sk)->serv;
     163             : }
     164             : 
     165     7686553 : static inline struct quic_cong *quic_cong(const struct sock *sk)
     166             : {
     167    14248950 :         return &quic_sk(sk)->cong;
     168             : }
     169             : 
     170    60766142 : static inline struct quic_pnspace *quic_pnspace(const struct sock *sk, u8 level)
     171             : {
     172    88235800 :         return &quic_sk(sk)->space[level % QUIC_CRYPTO_EARLY];
     173             : }
     174             : 
     175    77902163 : static inline struct quic_crypto *quic_crypto(const struct sock *sk, u8 level)
     176             : {
     177    80030512 :         return &quic_sk(sk)->crypto[level];
     178             : }
     179             : 
     180     8310934 : static inline struct quic_outqueue *quic_outq(const struct sock *sk)
     181             : {
     182   167520704 :         return &quic_sk(sk)->outq;
     183             : }
     184             : 
     185      551574 : static inline struct quic_inqueue *quic_inq(const struct sock *sk)
     186             : {
     187    20314353 :         return &quic_sk(sk)->inq;
     188             : }
     189             : 
     190             : static inline struct quic_packet *quic_packet(const struct sock *sk)
     191             : {
     192   164802645 :         return &quic_sk(sk)->packet;
     193             : }
     194             : 
     195    13940203 : static inline void *quic_timer(const struct sock *sk, u8 type)
     196             : {
     197    13935727 :         return (void *)&quic_sk(sk)->timers[type];
     198             : }
     199             : 
     200        6570 : static inline bool quic_is_establishing(struct sock *sk)
     201             : {
     202        6570 :         return sk->sk_state == QUIC_SS_ESTABLISHING;
     203             : }
     204             : 
     205    13295109 : static inline bool quic_is_established(struct sock *sk)
     206             : {
     207    13293374 :         return sk->sk_state == QUIC_SS_ESTABLISHED;
     208             : }
     209             : 
     210     6858920 : static inline bool quic_is_listen(struct sock *sk)
     211             : {
     212     6858920 :         return sk->sk_state == QUIC_SS_LISTENING;
     213             : }
     214             : 
     215     9279716 : static inline bool quic_is_closed(struct sock *sk)
     216             : {
     217     9279716 :         return sk->sk_state == QUIC_SS_CLOSED;
     218             : }
     219             : 
     220        3619 : static inline void quic_set_state(struct sock *sk, int state)
     221             : {
     222        3619 :         struct net *net = sock_net(sk);
     223        3619 :         int mib;
     224             : 
     225        3619 :         if (sk->sk_state == state)
     226             :                 return;
     227             : 
     228        3230 :         if (state == QUIC_SS_ESTABLISHED) {
     229        1986 :                 mib = quic_is_serv(sk) ? QUIC_MIB_CONN_PASSIVEESTABS
     230         993 :                                        : QUIC_MIB_CONN_ACTIVEESTABS;
     231         993 :                 QUIC_INC_STATS(net, mib);
     232         993 :                 QUIC_INC_STATS(net, QUIC_MIB_CONN_CURRENTESTABS);
     233        2237 :         } else if (quic_is_established(sk)) {
     234         993 :                 QUIC_DEC_STATS(net, QUIC_MIB_CONN_CURRENTESTABS);
     235             :         }
     236             : 
     237        3230 :         if (state == QUIC_SS_CLOSED)
     238        1118 :                 sk->sk_prot->unhash(sk);
     239             : 
     240        3230 :         inet_sk_set_state(sk, state);
     241        3230 :         sk->sk_state_change(sk);
     242             : }
     243             : 
     244             : struct sock *quic_listen_sock_lookup(struct sk_buff *skb, union quic_addr *sa, union quic_addr *da,
     245             :                                      struct quic_data *alpns);
     246             : struct sock *quic_sock_lookup(struct sk_buff *skb, union quic_addr *sa, union quic_addr *da,
     247             :                               struct quic_conn_id *dcid);
     248             : bool quic_accept_sock_exists(struct sock *sk, struct sk_buff *skb);
     249             : 
     250             : int quic_request_sock_enqueue(struct sock *sk, struct quic_conn_id *odcid, u8 retry);
     251             : bool quic_request_sock_exists(struct sock *sk);
     252             : 
     253             : #endif /* __net_quic_h__ */

Generated by: LCOV version 1.14