This makes 'tdb' struct more MP compliant. 'tdb_data' struct became unused and was removed.
Index: sys/net/pfkeyv2_convert.c =================================================================== RCS file: /cvs/src/sys/net/pfkeyv2_convert.c,v retrieving revision 1.72 diff -u -p -r1.72 pfkeyv2_convert.c --- sys/net/pfkeyv2_convert.c 14 Jul 2021 22:39:26 -0000 1.72 +++ sys/net/pfkeyv2_convert.c 23 Jul 2021 00:01:58 -0000 @@ -960,18 +960,21 @@ export_satype(void **p, struct tdb *tdb) void export_counter(void **p, struct tdb *tdb) { + uint64_t counters[tdb_ncounters]; struct sadb_x_counter *scnt = (struct sadb_x_counter *)*p; + counters_read(tdb->tdb_counters, counters, tdb_ncounters); + scnt->sadb_x_counter_len = sizeof(struct sadb_x_counter) / sizeof(uint64_t); scnt->sadb_x_counter_pad = 0; - scnt->sadb_x_counter_ipackets = tdb->tdb_ipackets; - scnt->sadb_x_counter_opackets = tdb->tdb_opackets; - scnt->sadb_x_counter_ibytes = tdb->tdb_ibytes; - scnt->sadb_x_counter_obytes = tdb->tdb_obytes; - scnt->sadb_x_counter_idrops = tdb->tdb_idrops; - scnt->sadb_x_counter_odrops = tdb->tdb_odrops; - scnt->sadb_x_counter_idecompbytes = tdb->tdb_idecompbytes; - scnt->sadb_x_counter_ouncompbytes = tdb->tdb_ouncompbytes; + scnt->sadb_x_counter_ipackets = counters[tdb_ipackets]; + scnt->sadb_x_counter_opackets = counters[tdb_opackets]; + scnt->sadb_x_counter_ibytes = counters[tdb_ibytes]; + scnt->sadb_x_counter_obytes = counters[tdb_obytes]; + scnt->sadb_x_counter_idrops = counters[tdb_idrops]; + scnt->sadb_x_counter_odrops = counters[tdb_odrops]; + scnt->sadb_x_counter_idecompbytes = counters[tdb_idecompbytes]; + scnt->sadb_x_counter_ouncompbytes = counters[tdb_ouncompbytes]; *p += sizeof(struct sadb_x_counter); } Index: sys/netinet/ip_ah.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_ah.c,v retrieving revision 1.151 diff -u -p -r1.151 ip_ah.c --- sys/netinet/ip_ah.c 18 Jul 2021 14:38:20 -0000 1.151 +++ sys/netinet/ip_ah.c 23 Jul 2021 00:01:58 -0000 @@ -609,7 +609,7 @@ ah_input(struct mbuf *m, struct tdb *tdb /* Update the counters. */ ibytes = (m->m_pkthdr.len - skip - hl * sizeof(u_int32_t)); tdb->tdb_cur_bytes += ibytes; - tdb->tdb_ibytes += ibytes; + tdb_stat_add(tdb, tdb_ibytes, ibytes); ahstat_add(ahs_ibytes, ibytes); /* Hard expiration. */ Index: sys/netinet/ip_esp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_esp.c,v retrieving revision 1.169 diff -u -p -r1.169 ip_esp.c --- sys/netinet/ip_esp.c 18 Jul 2021 14:38:20 -0000 1.169 +++ sys/netinet/ip_esp.c 23 Jul 2021 00:01:58 -0000 @@ -426,7 +426,7 @@ esp_input(struct mbuf *m, struct tdb *td /* Update the counters */ ibytes = m->m_pkthdr.len - skip - hlen - alen; tdb->tdb_cur_bytes += ibytes; - tdb->tdb_ibytes += ibytes; + tdb_stat_add(tdb, tdb_ibytes, ibytes); espstat_add(esps_ibytes, ibytes); /* Hard expiration */ Index: sys/netinet/ip_ipcomp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_ipcomp.c,v retrieving revision 1.71 diff -u -p -r1.71 ip_ipcomp.c --- sys/netinet/ip_ipcomp.c 8 Jul 2021 21:07:19 -0000 1.71 +++ sys/netinet/ip_ipcomp.c 23 Jul 2021 00:01:58 -0000 @@ -215,7 +215,7 @@ ipcomp_input_cb(struct tdb *tdb, struct /* update the counters */ ibytes = m->m_pkthdr.len - (skip + hlen); tdb->tdb_cur_bytes += ibytes; - tdb->tdb_ibytes += ibytes; + tdb_stat_add(tdb, tdb_ibytes, ibytes); ipcompstat_add(ipcomps_ibytes, ibytes); /* Hard expiration */ Index: sys/netinet/ip_ipsp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_ipsp.c,v retrieving revision 1.242 diff -u -p -r1.242 ip_ipsp.c --- sys/netinet/ip_ipsp.c 19 Jul 2021 14:49:55 -0000 1.242 +++ sys/netinet/ip_ipsp.c 23 Jul 2021 00:01:58 -0000 @@ -830,6 +830,9 @@ tdb_alloc(u_int rdomain) tdbp->tdb_rdomain = rdomain; tdbp->tdb_rdomain_post = rdomain; + /* Initialize counters. */ + tdbp->tdb_counters = counters_alloc(tdb_ncounters); + /* Initialize timeouts. */ timeout_set_proc(&tdbp->tdb_timer_tmo, tdb_timeout, tdbp); timeout_set_proc(&tdbp->tdb_first_tmo, tdb_firstuse, tdbp); @@ -881,6 +884,8 @@ tdb_free(struct tdb *tdbp) if ((tdbp->tdb_inext) && (tdbp->tdb_inext->tdb_onext == tdbp)) tdbp->tdb_inext->tdb_onext = NULL; + + counters_free(tdbp->tdb_counters, tdb_ncounters); /* Remove expiration timeouts. */ tdbp->tdb_flags &= ~(TDBF_FIRSTUSE | TDBF_SOFT_FIRSTUSE | TDBF_TIMER | Index: sys/netinet/ip_ipsp.h =================================================================== RCS file: /cvs/src/sys/netinet/ip_ipsp.h,v retrieving revision 1.203 diff -u -p -r1.203 ip_ipsp.h --- sys/netinet/ip_ipsp.h 18 Jul 2021 18:19:22 -0000 1.203 +++ sys/netinet/ip_ipsp.h 23 Jul 2021 00:01:58 -0000 @@ -135,17 +135,6 @@ struct ipsecstat { uint64_t ipsec_noxform; /* Crypto error */ }; -struct tdb_data { - uint64_t tdd_ipackets; /* Input IPsec packets */ - uint64_t tdd_opackets; /* Output IPsec packets */ - uint64_t tdd_ibytes; /* Input bytes */ - uint64_t tdd_obytes; /* Output bytes */ - uint64_t tdd_idrops; /* Dropped on input */ - uint64_t tdd_odrops; /* Dropped on output */ - uint64_t tdd_idecompbytes; /* Input bytes, decompressed */ - uint64_t tdd_ouncompbytes; /* Output bytes, uncompressed */ -}; - #ifdef _KERNEL #include <sys/timeout.h> @@ -369,7 +358,8 @@ struct tdb { /* tunnel descriptor blo u_int64_t tdb_last_used; /* When was this SA last used */ u_int64_t tdb_last_marked;/* Last SKIPCRYPTO status change */ - struct tdb_data tdb_data; /* stats about this TDB */ + struct cpumem *tdb_counters; /* stats about this TDB */ + u_int64_t tdb_cryptoid; /* Crypto session ID */ u_int32_t tdb_spi; /* SPI */ @@ -415,15 +405,37 @@ struct tdb { /* tunnel descriptor blo TAILQ_HEAD(tdb_policy_head, ipsec_policy) tdb_policy_head; TAILQ_ENTRY(tdb) tdb_sync_entry; }; -#define tdb_ipackets tdb_data.tdd_ipackets -#define tdb_opackets tdb_data.tdd_opackets -#define tdb_ibytes tdb_data.tdd_ibytes -#define tdb_obytes tdb_data.tdd_obytes -#define tdb_idrops tdb_data.tdd_idrops -#define tdb_odrops tdb_data.tdd_odrops -#define tdb_idecompbytes tdb_data.tdd_idecompbytes -#define tdb_ouncompbytes tdb_data.tdd_ouncompbytes +enum tdb_counters { + tdb_ipackets, /* Input IPsec packets */ + tdb_opackets, /* Output IPsec packets */ + tdb_ibytes, /* Input bytes */ + tdb_obytes, /* Output bytes */ + tdb_idrops, /* Dropped on input */ + tdb_odrops, /* Dropped on output */ + tdb_idecompbytes, /* Input bytes, decompressed */ + tdb_ouncompbytes, /* Output bytes, uncompressed */ + tdb_ncounters +}; + +static inline void +tdb_stat_inc(struct tdb *tdb, enum tdb_counters c) +{ + counters_inc(tdb->tdb_counters, c); +} + +static inline void +tdb_stat_add(struct tdb *tdb, enum tdb_counters c, uint64_t v) +{ + counters_add(tdb->tdb_counters, c, v); +} + +static inline void +tdb_stat_pkt(struct tdb *tdb, enum tdb_counters pc, enum tdb_counters bc, + uint64_t bytes) +{ + counters_pkt(tdb->tdb_counters, pc, bc, bytes); +} struct tdb_ident { u_int32_t spi; Index: sys/netinet/ip_output.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_output.c,v retrieving revision 1.372 diff -u -p -r1.372 ip_output.c --- sys/netinet/ip_output.c 8 Jul 2021 15:13:14 -0000 1.372 +++ sys/netinet/ip_output.c 23 Jul 2021 00:01:58 -0000 @@ -646,7 +646,7 @@ ip_output_ipsec_send(struct tdb *tdb, st error = ipsp_process_packet(m, tdb, AF_INET, 0); if (error) { ipsecstat_inc(ipsec_odrops); - tdb->tdb_odrops++; + tdb_stat_inc(tdb, tdb_odrops); } return error; } Index: sys/netinet/ipsec_input.c =================================================================== RCS file: /cvs/src/sys/netinet/ipsec_input.c,v retrieving revision 1.176 diff -u -p -r1.176 ipsec_input.c --- sys/netinet/ipsec_input.c 21 Jul 2021 12:23:32 -0000 1.176 +++ sys/netinet/ipsec_input.c 23 Jul 2021 00:01:58 -0000 @@ -350,8 +350,7 @@ ipsec_common_input(struct mbuf *m, int s tdbp->tdb_soft_first_use); } - tdbp->tdb_ipackets++; - tdbp->tdb_ibytes += m->m_pkthdr.len; + tdb_stat_pkt(tdbp, tdb_ipackets, tdb_ibytes, m->m_pkthdr.len); /* * Call appropriate transform and return -- callback takes care of @@ -360,14 +359,14 @@ ipsec_common_input(struct mbuf *m, int s error = (*(tdbp->tdb_xform->xf_input))(m, tdbp, skip, protoff); if (error) { ipsecstat_inc(ipsec_idrops); - tdbp->tdb_idrops++; + tdb_stat_inc(tdbp, tdb_idrops); } return error; drop: ipsecstat_inc(ipsec_idrops); if (tdbp != NULL) - tdbp->tdb_idrops++; + tdb_stat_inc(tdbp, tdb_idrops); m_freem(m); return error; } @@ -408,7 +407,7 @@ ipsec_input_cb(struct cryptop *crp) if (error) { DPRINTF("crypto dispatch error %d", error); ipsecstat_inc(ipsec_idrops); - tdb->tdb_idrops++; + tdb_stat_inc(tdb, tdb_idrops); } return; } @@ -441,7 +440,7 @@ ipsec_input_cb(struct cryptop *crp) NET_UNLOCK(); if (error) { ipsecstat_inc(ipsec_idrops); - tdb->tdb_idrops++; + tdb_stat_inc(tdb, tdb_idrops); } return; @@ -450,7 +449,7 @@ ipsec_input_cb(struct cryptop *crp) droponly: ipsecstat_inc(ipsec_idrops); if (tdb != NULL) - tdb->tdb_idrops++; + tdb_stat_inc(tdb, tdb_idrops); free(tc, M_XDATA, 0); m_freem(m); crypto_freereq(crp); @@ -695,7 +694,7 @@ ipsec_common_input_cb(struct mbuf *m, st m->m_flags |= M_TUNNEL; ipsecstat_add(ipsec_idecompbytes, m->m_pkthdr.len); - tdbp->tdb_idecompbytes += m->m_pkthdr.len; + tdb_stat_add(tdbp, tdb_idecompbytes, m->m_pkthdr.len); #if NBPFILTER > 0 if ((encif = enc_getif(tdbp->tdb_rdomain_post, tdbp->tdb_tap)) != NULL) { Index: sys/netinet/ipsec_output.c =================================================================== RCS file: /cvs/src/sys/netinet/ipsec_output.c,v retrieving revision 1.83 diff -u -p -r1.83 ipsec_output.c --- sys/netinet/ipsec_output.c 21 Jul 2021 11:11:41 -0000 1.83 +++ sys/netinet/ipsec_output.c 23 Jul 2021 00:01:58 -0000 @@ -365,7 +365,7 @@ ipsp_process_packet(struct mbuf *m, stru } ipsecstat_add(ipsec_ouncompbytes, m->m_pkthdr.len); - tdb->tdb_ouncompbytes += m->m_pkthdr.len; + tdb_stat_add(tdb, tdb_ouncompbytes, m->m_pkthdr.len); /* Non expansion policy for IPCOMP */ if (tdb->tdb_sproto == IPPROTO_IPCOMP) { @@ -422,7 +422,7 @@ ipsec_output_cb(struct cryptop *crp) if (error) { DPRINTF("crypto dispatch error %d", error); ipsecstat_inc(ipsec_odrops); - tdb->tdb_odrops++; + tdb_stat_inc(tdb, tdb_odrops); } return; } @@ -455,7 +455,7 @@ ipsec_output_cb(struct cryptop *crp) NET_UNLOCK(); if (error) { ipsecstat_inc(ipsec_odrops); - tdb->tdb_odrops++; + tdb_stat_inc(tdb, tdb_odrops); } return; @@ -463,7 +463,7 @@ ipsec_output_cb(struct cryptop *crp) NET_UNLOCK(); droponly: if (tdb != NULL) - tdb->tdb_odrops++; + tdb_stat_inc(tdb, tdb_odrops); m_freem(m); free(tc, M_XDATA, 0); crypto_freereq(crp); @@ -589,8 +589,7 @@ ipsp_process_done(struct mbuf *m, struct ipsecstat_inc(ipsec_opackets); ipsecstat_add(ipsec_obytes, m->m_pkthdr.len); - tdb->tdb_opackets++; - tdb->tdb_obytes += m->m_pkthdr.len; + tdb_stat_pkt(tdb, tdb_opackets, tdb_obytes, m->m_pkthdr.len); /* If there's another (bundled) TDB to apply, do so. */ if (tdb->tdb_onext) Index: sys/netinet6/ip6_output.c =================================================================== RCS file: /cvs/src/sys/netinet6/ip6_output.c,v retrieving revision 1.258 diff -u -p -r1.258 ip6_output.c --- sys/netinet6/ip6_output.c 8 Jul 2021 15:13:14 -0000 1.258 +++ sys/netinet6/ip6_output.c 23 Jul 2021 00:01:58 -0000 @@ -2872,7 +2872,7 @@ ip6_output_ipsec_send(struct tdb *tdb, s error = ipsp_process_packet(m, tdb, AF_INET6, tunalready); if (error) { ipsecstat_inc(ipsec_odrops); - tdb->tdb_odrops++; + tdb_stat_inc(tdb, tdb_odrops); } return error; }