LCOV - code coverage report
Current view: top level - waltz/mib - fd_netdev_tbl.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 12 133 9.0 %
Date: 2025-03-20 12:08:36 Functions: 2 9 22.2 %

          Line data    Source code
       1             : #include "fd_netdev_tbl.h"
       2             : #include "../../util/fd_util.h"
       3             : 
       4             : struct fd_netdev_tbl_private {
       5             :   ulong               magic;
       6             :   ulong               dev_off;
       7             :   ulong               bond_off;
       8             :   fd_netdev_tbl_hdr_t hdr;
       9             : };
      10             : 
      11             : FD_FN_CONST ulong
      12           3 : fd_netdev_tbl_align( void ) {
      13           3 :   return FD_NETDEV_TBL_ALIGN;
      14           3 : }
      15             : 
      16             : FD_FN_CONST ulong
      17             : fd_netdev_tbl_footprint( ulong dev_max,
      18           6 :                          ulong bond_max ) {
      19           6 :   if( FD_UNLIKELY( dev_max ==0UL || dev_max >USHORT_MAX ) ) return 0UL;
      20           6 :   if( FD_UNLIKELY( bond_max==0UL || bond_max>USHORT_MAX ) ) return 0UL;
      21           6 :   return FD_LAYOUT_FINI( FD_LAYOUT_APPEND( FD_LAYOUT_APPEND( FD_LAYOUT_APPEND( FD_LAYOUT_INIT, \
      22           6 :       alignof(fd_netdev_tbl_t),  sizeof(fd_netdev_tbl_t)             ),   \
      23           6 :       alignof(fd_netdev_t),      sizeof(fd_netdev_t)      * dev_max  ),   \
      24           6 :       alignof(fd_netdev_bond_t), sizeof(fd_netdev_bond_t) * bond_max ),   \
      25           6 :       FD_NETDEV_TBL_ALIGN );
      26           6 : }
      27             : 
      28             : void *
      29             : fd_netdev_tbl_new( void * shmem,
      30             :                    ulong  dev_max,
      31           0 :                    ulong  bond_max ) {
      32             : 
      33           0 :   if( FD_UNLIKELY( !shmem ) ) {
      34           0 :     FD_LOG_WARNING(( "NULL shmem" ));
      35           0 :     return NULL;
      36           0 :   }
      37             : 
      38           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, FD_NETDEV_TBL_ALIGN ) ) ) {
      39           0 :     FD_LOG_WARNING(( "misaligned shmem" ));
      40           0 :     return NULL;
      41           0 :   }
      42             : 
      43           0 :   if( FD_UNLIKELY( !dev_max || dev_max>USHORT_MAX ) ) {
      44           0 :     FD_LOG_WARNING(( "invalid dev_max" ));
      45           0 :     return NULL;
      46           0 :   }
      47             : 
      48           0 :   if( FD_UNLIKELY( !bond_max || bond_max>USHORT_MAX ) ) {
      49           0 :     FD_LOG_WARNING(( "invalid bond_max" ));
      50           0 :     return NULL;
      51           0 :   }
      52             : 
      53           0 :   FD_SCRATCH_ALLOC_INIT( l, shmem );
      54           0 :   fd_netdev_tbl_t *  tbl  = FD_SCRATCH_ALLOC_APPEND( l, alignof(fd_netdev_tbl_t),  sizeof(fd_netdev_tbl_t) );
      55           0 :   fd_netdev_t *      dev  = FD_SCRATCH_ALLOC_APPEND( l, alignof(fd_netdev_t),      sizeof(fd_netdev_t)      * dev_max  );
      56           0 :   fd_netdev_bond_t * bond = FD_SCRATCH_ALLOC_APPEND( l, alignof(fd_netdev_bond_t), sizeof(fd_netdev_bond_t) * bond_max );
      57           0 :   FD_SCRATCH_ALLOC_FINI( l, FD_NETDEV_TBL_ALIGN );
      58             : 
      59           0 :   *tbl = (fd_netdev_tbl_t) {
      60           0 :     .magic    = FD_NETDEV_TBL_MAGIC,
      61           0 :     .dev_off  = (ulong)dev  - (ulong)tbl,
      62           0 :     .bond_off = (ulong)bond - (ulong)tbl,
      63           0 :     .hdr = {
      64           0 :       .dev_max  = (ushort)dev_max,
      65           0 :       .bond_max = (ushort)bond_max,
      66           0 :       .dev_cnt  = 0,
      67           0 :       .bond_cnt = 0,
      68           0 :     }
      69           0 :   };
      70             : 
      71           0 :   fd_netdev_tbl_join_t join[1];
      72           0 :   fd_netdev_tbl_join( join, shmem );
      73           0 :   fd_netdev_tbl_reset( join );
      74           0 :   fd_netdev_tbl_leave( join );
      75             : 
      76           0 :   return tbl;
      77           0 : }
      78             : 
      79             : fd_netdev_tbl_join_t *
      80             : fd_netdev_tbl_join( void * ljoin,
      81           0 :                     void * shtbl ) {
      82             : 
      83           0 :   if( FD_UNLIKELY( !shtbl ) ) {
      84           0 :     FD_LOG_WARNING(( "NULL shtbl" ));
      85           0 :     return NULL;
      86           0 :   }
      87             : 
      88           0 :   fd_netdev_tbl_join_t * join = ljoin;
      89           0 :   fd_netdev_tbl_t *      tbl  = shtbl;
      90             : 
      91           0 :   if( FD_UNLIKELY( tbl->magic!=FD_NETDEV_TBL_MAGIC ) ) {
      92           0 :     FD_LOG_WARNING(( "bad magic" ));
      93           0 :     return NULL;
      94           0 :   }
      95             : 
      96           0 :   *join = (fd_netdev_tbl_join_t) {
      97           0 :     .hdr      = &tbl->hdr,
      98           0 :     .dev_tbl  = (fd_netdev_t      *)( (ulong)tbl + tbl->dev_off  ),
      99           0 :     .bond_tbl = (fd_netdev_bond_t *)( (ulong)tbl + tbl->bond_off ),
     100           0 :   };
     101             : 
     102           0 :   return join;
     103           0 : }
     104             : 
     105             : void *
     106           0 : fd_netdev_tbl_leave( fd_netdev_tbl_join_t * join ) {
     107           0 :   return join;
     108           0 : }
     109             : 
     110             : void *
     111           0 : fd_netdev_tbl_delete( void * shtbl ) {
     112             : 
     113           0 :   if( FD_UNLIKELY( !shtbl ) ) {
     114           0 :     FD_LOG_WARNING(( "NULL shtbl" ));
     115           0 :     return NULL;
     116           0 :   }
     117             : 
     118           0 :   fd_netdev_tbl_t * tbl = shtbl;
     119           0 :   tbl->magic = 0UL;
     120           0 :   return tbl;
     121           0 : }
     122             : 
     123             : void
     124           0 : fd_netdev_tbl_reset( fd_netdev_tbl_join_t * tbl ) {
     125           0 :   tbl->hdr->dev_cnt  = 0;
     126           0 :   tbl->hdr->bond_cnt = 0;
     127           0 :   for( ulong j=0UL; j<(tbl->hdr->dev_max); j++ ) {
     128           0 :     tbl->dev_tbl[j] = (fd_netdev_t) {
     129           0 :       .master_idx    = -1,
     130           0 :       .slave_tbl_idx = -1
     131           0 :     };
     132           0 :   }
     133           0 :   fd_memset( tbl->bond_tbl, 0, sizeof(fd_netdev_bond_t) * tbl->hdr->bond_max );
     134           0 : }
     135             : 
     136             : #if FD_HAS_HOSTED
     137             : 
     138             : #include <errno.h>
     139             : #include <stdio.h>
     140             : #include "../../util/net/fd_eth.h"
     141             : 
     142           0 : #define WRAP_PRINT(file,str) if( FD_UNLIKELY( fputs( (str), (file) )<0 ) ) return errno
     143           0 : #define WRAP_PRINTF(file,...) if( FD_UNLIKELY( fprintf( (file), __VA_ARGS__ )<0 ) ) return errno
     144             : 
     145             : int
     146             : fd_netdev_tbl_fprintf( fd_netdev_tbl_join_t const * tbl,
     147           0 :                        void *                       file_ ) {
     148           0 :   FILE * file = file_;
     149           0 :   for( ulong j=0UL; j<(tbl->hdr->dev_cnt); j++ ) {
     150           0 :     fd_netdev_t const * dev = &tbl->dev_tbl[j];
     151           0 :     if( !dev->oper_status ) continue;
     152           0 :     WRAP_PRINTF( file,
     153           0 :         "%lu: %s: mtu %u state (%i-%s)",
     154           0 :         j, dev->name, dev->mtu,
     155           0 :         dev->oper_status, fd_oper_status_cstr( dev->oper_status ) );
     156           0 :     if( dev->slave_tbl_idx>=0 ) {
     157           0 :       WRAP_PRINT( file, " master" );
     158           0 :     }
     159           0 :     WRAP_PRINTF( file,
     160           0 :         "\n    link " FD_ETH_MAC_FMT "\n",
     161           0 :         FD_ETH_MAC_FMT_ARGS( dev->mac_addr ) );
     162           0 :     if( dev->slave_tbl_idx>=0 && tbl->bond_tbl[ dev->slave_tbl_idx ].slave_cnt ) {
     163           0 :       fd_netdev_bond_t * bond = &tbl->bond_tbl[ dev->slave_tbl_idx ];
     164           0 :       WRAP_PRINTF( file, "    slaves (%u):", bond->slave_cnt );
     165           0 :       for( ulong k=0UL; k<(bond->slave_cnt); k++ ) {
     166           0 :         WRAP_PRINTF( file, " %u-%s", bond->slave_idx[k], tbl->dev_tbl[ bond->slave_idx[k] ].name );
     167           0 :       }
     168           0 :       WRAP_PRINT( file, "\n" );
     169           0 :     }
     170           0 :   }
     171           0 :   return 0;
     172           0 : }
     173             : 
     174             : #undef WRAP_PRINT
     175             : #undef WRAP_PRINTF
     176             : 
     177             : #endif /* FD_HAS_HOSTED */
     178             : 
     179             : char const *
     180           0 : fd_oper_status_cstr( uint oper_status ) {
     181           0 :   switch( oper_status ) {
     182           0 :   case FD_OPER_STATUS_UP:               return "up";
     183           0 :   case FD_OPER_STATUS_DOWN:             return "down";
     184           0 :   case FD_OPER_STATUS_TESTING:          return "testing";
     185           0 :   case FD_OPER_STATUS_DORMANT:          return "dormant";
     186           0 :   case FD_OPER_STATUS_NOT_PRESENT:      return "not present";
     187           0 :   case FD_OPER_STATUS_LOWER_LAYER_DOWN: return "lower layer down";
     188           0 :   case FD_OPER_STATUS_UNKNOWN: /* fallthrough */
     189           0 :   default:
     190           0 :     return "unknown";
     191           0 :   }
     192           0 : }

Generated by: LCOV version 1.14