1 1.3 christos /* $NetBSD: sent.c,v 1.4 2025/09/05 21:16:29 christos Exp $ */ 2 1.2 christos 3 1.1 lukem /* sent.c - deal with data sent subsystem */ 4 1.2 christos /* $OpenLDAP$ */ 5 1.1 lukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 1.1 lukem * 7 1.4 christos * Copyright 2001-2024 The OpenLDAP Foundation. 8 1.1 lukem * Portions Copyright 2001-2003 Pierangelo Masarati. 9 1.1 lukem * All rights reserved. 10 1.1 lukem * 11 1.1 lukem * Redistribution and use in source and binary forms, with or without 12 1.1 lukem * modification, are permitted only as authorized by the OpenLDAP 13 1.1 lukem * Public License. 14 1.1 lukem * 15 1.1 lukem * A copy of this license is available in file LICENSE in the 16 1.1 lukem * top-level directory of the distribution or, alternatively, at 17 1.1 lukem * <http://www.OpenLDAP.org/license.html>. 18 1.1 lukem */ 19 1.1 lukem /* ACKNOWLEDGEMENTS: 20 1.1 lukem * This work was initially developed by Pierangelo Masarati for inclusion 21 1.1 lukem * in OpenLDAP Software. 22 1.1 lukem */ 23 1.1 lukem 24 1.2 christos #include <sys/cdefs.h> 25 1.3 christos __RCSID("$NetBSD: sent.c,v 1.4 2025/09/05 21:16:29 christos Exp $"); 26 1.2 christos 27 1.1 lukem #include "portable.h" 28 1.1 lukem 29 1.1 lukem #include <stdio.h> 30 1.1 lukem #include <ac/string.h> 31 1.1 lukem 32 1.1 lukem #include "slap.h" 33 1.1 lukem #include "back-monitor.h" 34 1.1 lukem 35 1.1 lukem static int 36 1.1 lukem monitor_subsys_sent_destroy( 37 1.1 lukem BackendDB *be, 38 1.1 lukem monitor_subsys_t *ms ); 39 1.1 lukem 40 1.1 lukem static int 41 1.1 lukem monitor_subsys_sent_update( 42 1.1 lukem Operation *op, 43 1.1 lukem SlapReply *rs, 44 1.1 lukem Entry *e ); 45 1.1 lukem 46 1.1 lukem enum { 47 1.1 lukem MONITOR_SENT_BYTES = 0, 48 1.1 lukem MONITOR_SENT_PDU, 49 1.1 lukem MONITOR_SENT_ENTRIES, 50 1.1 lukem MONITOR_SENT_REFERRALS, 51 1.1 lukem 52 1.1 lukem MONITOR_SENT_LAST 53 1.1 lukem }; 54 1.1 lukem 55 1.1 lukem struct monitor_sent_t { 56 1.1 lukem struct berval rdn; 57 1.1 lukem struct berval nrdn; 58 1.1 lukem } monitor_sent[] = { 59 1.1 lukem { BER_BVC("cn=Bytes"), BER_BVNULL }, 60 1.1 lukem { BER_BVC("cn=PDU"), BER_BVNULL }, 61 1.1 lukem { BER_BVC("cn=Entries"), BER_BVNULL }, 62 1.1 lukem { BER_BVC("cn=Referrals"), BER_BVNULL }, 63 1.1 lukem { BER_BVNULL, BER_BVNULL } 64 1.1 lukem }; 65 1.1 lukem 66 1.1 lukem int 67 1.1 lukem monitor_subsys_sent_init( 68 1.1 lukem BackendDB *be, 69 1.1 lukem monitor_subsys_t *ms ) 70 1.1 lukem { 71 1.1 lukem monitor_info_t *mi; 72 1.1 lukem 73 1.4 christos Entry *e_sent; 74 1.1 lukem monitor_entry_t *mp; 75 1.1 lukem int i; 76 1.1 lukem 77 1.1 lukem assert( be != NULL ); 78 1.1 lukem 79 1.1 lukem ms->mss_destroy = monitor_subsys_sent_destroy; 80 1.1 lukem ms->mss_update = monitor_subsys_sent_update; 81 1.1 lukem 82 1.1 lukem mi = ( monitor_info_t * )be->be_private; 83 1.1 lukem 84 1.1 lukem if ( monitor_cache_get( mi, &ms->mss_ndn, &e_sent ) ) { 85 1.1 lukem Debug( LDAP_DEBUG_ANY, 86 1.1 lukem "monitor_subsys_sent_init: " 87 1.1 lukem "unable to get entry \"%s\"\n", 88 1.3 christos ms->mss_ndn.bv_val ); 89 1.1 lukem return( -1 ); 90 1.1 lukem } 91 1.1 lukem 92 1.1 lukem for ( i = 0; i < MONITOR_SENT_LAST; i++ ) { 93 1.1 lukem struct berval nrdn, bv; 94 1.1 lukem Entry *e; 95 1.1 lukem 96 1.1 lukem e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, 97 1.1 lukem &monitor_sent[i].rdn, mi->mi_oc_monitorCounterObject, 98 1.2 christos NULL, NULL ); 99 1.1 lukem 100 1.1 lukem if ( e == NULL ) { 101 1.1 lukem Debug( LDAP_DEBUG_ANY, 102 1.1 lukem "monitor_subsys_sent_init: " 103 1.1 lukem "unable to create entry \"%s,%s\"\n", 104 1.1 lukem monitor_sent[ i ].rdn.bv_val, 105 1.3 christos ms->mss_ndn.bv_val ); 106 1.1 lukem return( -1 ); 107 1.1 lukem } 108 1.1 lukem 109 1.1 lukem /* steal normalized RDN */ 110 1.1 lukem dnRdn( &e->e_nname, &nrdn ); 111 1.1 lukem ber_dupbv( &monitor_sent[ i ].nrdn, &nrdn ); 112 1.1 lukem 113 1.1 lukem BER_BVSTR( &bv, "0" ); 114 1.2 christos attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL ); 115 1.1 lukem 116 1.1 lukem mp = monitor_entrypriv_create(); 117 1.1 lukem if ( mp == NULL ) { 118 1.1 lukem return -1; 119 1.1 lukem } 120 1.1 lukem e->e_private = ( void * )mp; 121 1.1 lukem mp->mp_info = ms; 122 1.1 lukem mp->mp_flags = ms->mss_flags \ 123 1.1 lukem | MONITOR_F_SUB | MONITOR_F_PERSISTENT; 124 1.1 lukem 125 1.4 christos if ( monitor_cache_add( mi, e, e_sent ) ) { 126 1.1 lukem Debug( LDAP_DEBUG_ANY, 127 1.1 lukem "monitor_subsys_sent_init: " 128 1.1 lukem "unable to add entry \"%s,%s\"\n", 129 1.1 lukem monitor_sent[ i ].rdn.bv_val, 130 1.3 christos ms->mss_ndn.bv_val ); 131 1.1 lukem return( -1 ); 132 1.1 lukem } 133 1.1 lukem } 134 1.1 lukem 135 1.1 lukem monitor_cache_release( mi, e_sent ); 136 1.1 lukem 137 1.1 lukem return( 0 ); 138 1.1 lukem } 139 1.1 lukem 140 1.1 lukem static int 141 1.1 lukem monitor_subsys_sent_destroy( 142 1.1 lukem BackendDB *be, 143 1.1 lukem monitor_subsys_t *ms ) 144 1.1 lukem { 145 1.1 lukem int i; 146 1.1 lukem 147 1.1 lukem for ( i = 0; i < MONITOR_SENT_LAST; i++ ) { 148 1.1 lukem if ( !BER_BVISNULL( &monitor_sent[ i ].nrdn ) ) { 149 1.1 lukem ch_free( monitor_sent[ i ].nrdn.bv_val ); 150 1.1 lukem } 151 1.1 lukem } 152 1.1 lukem 153 1.1 lukem return 0; 154 1.1 lukem } 155 1.1 lukem 156 1.1 lukem static int 157 1.1 lukem monitor_subsys_sent_update( 158 1.1 lukem Operation *op, 159 1.1 lukem SlapReply *rs, 160 1.1 lukem Entry *e ) 161 1.1 lukem { 162 1.1 lukem monitor_info_t *mi = ( monitor_info_t *)op->o_bd->be_private; 163 1.1 lukem 164 1.1 lukem struct berval nrdn; 165 1.1 lukem ldap_pvt_mp_t n; 166 1.1 lukem Attribute *a; 167 1.1 lukem slap_counters_t *sc; 168 1.1 lukem int i; 169 1.1 lukem 170 1.1 lukem assert( mi != NULL ); 171 1.1 lukem assert( e != NULL ); 172 1.1 lukem 173 1.1 lukem dnRdn( &e->e_nname, &nrdn ); 174 1.1 lukem 175 1.1 lukem for ( i = 0; i < MONITOR_SENT_LAST; i++ ) { 176 1.1 lukem if ( dn_match( &nrdn, &monitor_sent[ i ].nrdn ) ) { 177 1.1 lukem break; 178 1.1 lukem } 179 1.1 lukem } 180 1.1 lukem 181 1.1 lukem if ( i == MONITOR_SENT_LAST ) { 182 1.1 lukem return SLAP_CB_CONTINUE; 183 1.1 lukem } 184 1.1 lukem 185 1.1 lukem ldap_pvt_thread_mutex_lock(&slap_counters.sc_mutex); 186 1.1 lukem switch ( i ) { 187 1.1 lukem case MONITOR_SENT_ENTRIES: 188 1.1 lukem ldap_pvt_mp_init_set( n, slap_counters.sc_entries ); 189 1.1 lukem for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) { 190 1.1 lukem ldap_pvt_thread_mutex_lock( &sc->sc_mutex ); 191 1.1 lukem ldap_pvt_mp_add( n, sc->sc_entries ); 192 1.1 lukem ldap_pvt_thread_mutex_unlock( &sc->sc_mutex ); 193 1.1 lukem } 194 1.1 lukem break; 195 1.1 lukem 196 1.1 lukem case MONITOR_SENT_REFERRALS: 197 1.1 lukem ldap_pvt_mp_init_set( n, slap_counters.sc_refs ); 198 1.1 lukem for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) { 199 1.1 lukem ldap_pvt_thread_mutex_lock( &sc->sc_mutex ); 200 1.1 lukem ldap_pvt_mp_add( n, sc->sc_refs ); 201 1.1 lukem ldap_pvt_thread_mutex_unlock( &sc->sc_mutex ); 202 1.1 lukem } 203 1.1 lukem break; 204 1.1 lukem 205 1.1 lukem case MONITOR_SENT_PDU: 206 1.1 lukem ldap_pvt_mp_init_set( n, slap_counters.sc_pdu ); 207 1.1 lukem for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) { 208 1.1 lukem ldap_pvt_thread_mutex_lock( &sc->sc_mutex ); 209 1.1 lukem ldap_pvt_mp_add( n, sc->sc_pdu ); 210 1.1 lukem ldap_pvt_thread_mutex_unlock( &sc->sc_mutex ); 211 1.1 lukem } 212 1.1 lukem break; 213 1.1 lukem 214 1.1 lukem case MONITOR_SENT_BYTES: 215 1.1 lukem ldap_pvt_mp_init_set( n, slap_counters.sc_bytes ); 216 1.1 lukem for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) { 217 1.1 lukem ldap_pvt_thread_mutex_lock( &sc->sc_mutex ); 218 1.1 lukem ldap_pvt_mp_add( n, sc->sc_bytes ); 219 1.1 lukem ldap_pvt_thread_mutex_unlock( &sc->sc_mutex ); 220 1.1 lukem } 221 1.1 lukem break; 222 1.1 lukem 223 1.1 lukem default: 224 1.1 lukem assert(0); 225 1.1 lukem } 226 1.1 lukem ldap_pvt_thread_mutex_unlock(&slap_counters.sc_mutex); 227 1.1 lukem 228 1.1 lukem a = attr_find( e->e_attrs, mi->mi_ad_monitorCounter ); 229 1.1 lukem assert( a != NULL ); 230 1.1 lukem 231 1.1 lukem /* NOTE: no minus sign is allowed in the counters... */ 232 1.1 lukem UI2BV( &a->a_vals[ 0 ], n ); 233 1.1 lukem ldap_pvt_mp_clear( n ); 234 1.1 lukem 235 1.1 lukem /* FIXME: touch modifyTimestamp? */ 236 1.1 lukem 237 1.1 lukem return SLAP_CB_CONTINUE; 238 1.1 lukem } 239 1.1 lukem 240