util.h (5390B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * General utility routines 8 */ 9 10 #ifndef _SHR_UTIL_H 11 #define _SHR_UTIL_H 12 13 #include <sal/types.h> 14 #include <sal/core/time.h> 15 #include <sal/core/dpc.h> 16 #include <sal/core/sync.h> 17 18 extern unsigned short _shr_swap16(unsigned short val); 19 extern unsigned int _shr_swap32(unsigned int val); 20 21 extern int _shr_popcount(unsigned int); 22 23 extern uint8 _shr_bit_rev8(uint8 n); 24 extern uint16 _shr_bit_rev16(uint16 n); 25 extern uint32 _shr_bit_rev32(uint32 n); 26 extern uint32 _shr_bit_rev_by_byte_word32(uint32 n); 27 28 extern unsigned short _shr_crc16(int start, unsigned char *p, int n); 29 extern unsigned short _shr_crc16b(int crc, unsigned char *data, int nbits); 30 extern unsigned short _shr_crc16bd15(int crc, unsigned char *data, int nbits); 31 32 #define _SHR_CRC32_CORRECT 0xe320bbde 33 extern unsigned int _shr_crc32(unsigned int accum, unsigned char *data, 34 int len); 35 unsigned int _shr_crc32b(unsigned int crc, unsigned char *data, int nbits); 36 unsigned int _shr_crc32bd15(unsigned int crc, unsigned char *data, int nbits); 37 38 uint16 _shr_crc16_ccitt(int crc, unsigned char *data, int len); 39 uint32 _shr_crc32_castagnoli(unsigned int crc, unsigned char *data, int len); 40 uint32 _shr_crc32_ethernet(unsigned int crc, unsigned char *data, int len); 41 uint32 _shr_crc32_koopman(unsigned int crc, unsigned char *data, int len); 42 43 uint16 _shr_crc16_draco_array(uint32 *hash_words, int n); 44 uint16 _shr_crc16_ccitt_array(uint32 *hash_words, int n); 45 uint32 _shr_crc32_castagnoli_array(uint32 *hash_words, int n); 46 uint32 _shr_crc32_ethernet_array(uint32 *hash_words, int n); 47 uint32 _shr_crc32_koopman_array(uint32 *hash_words, int n); 48 49 void _shr_sort(void *base, int count, int size, 50 int (*compar)(void *, void *)); 51 int _shr_bsearch(void *base, int count, int size, 52 void *target, int (*compar)(void *, void *)); 53 54 void _shr_format_integer(char *buf, unsigned int n, int min_digits, int base); 55 void _shr_format_long_integer(char *buf, unsigned int *val, int nval); 56 57 void _shr_format_uint64_hexa_string(uint64 value, char* uint64_hexa_string); 58 59 int _shr_isxdigit(char c); 60 61 extern unsigned int _shr_ctoi(const char *s); 62 extern sal_vaddr_t _shr_ctoa(const char *s); 63 64 extern int _shr_div_exp10(int d1, int d2, int exp10); 65 extern int _shr_atof_exp10(const char *s, int exp10); 66 67 extern uint32 _shr_div32r(uint32 d1, uint32 d2); 68 extern char *_shr_scale_uint64(uint64 d64, int base, int prec, uint32 *d32); 69 70 extern unsigned short _shr_ip_chksum(unsigned int length, unsigned char *data); 71 72 /* WARNING: SIDE EFFECTS; AVOID EXPRESSIONS IN THESE MACROS */ 73 74 75 /* unsigned char *buf, unsigned short val */ 76 #define _SHR_PACK_SHORT(buf, val) \ 77 do { \ 78 (buf)[0] = (val) >> 8; \ 79 (buf)[1] = (val); \ 80 } while (0) 81 82 /* unsigned char *buf, unsigned long val */ 83 #define _SHR_PACK_LONG(buf, val) \ 84 do { \ 85 (buf)[0] = (val) >> 24; \ 86 (buf)[1] = (val) >> 16; \ 87 (buf)[2] = (val) >> 8; \ 88 (buf)[3] = (val); \ 89 } while (0) 90 91 /* unsigned char *buf, unsigned short val */ 92 #define _SHR_UNPACK_SHORT(buf, val) (val) = (((buf)[0] << 8) | (buf)[1]) 93 94 /* unsigned char *buf, unsigned long val */ 95 #define _SHR_UNPACK_LONG(buf, val) \ 96 (val) = (((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]) 97 98 int _shr_parse_macaddr(char *str, uint8 *macaddr); 99 int _shr_parse_ipaddr(char *s, sal_ip_addr_t *ipaddr); 100 101 uint16 _shr_uint16_read(uint8* buffer); 102 void _shr_uint16_write(uint8* buffer, const uint16 value); 103 104 uint32 _shr_uint32_read(uint8* buffer); 105 void _shr_uint32_write(uint8* buffer, const uint32 value); 106 107 uint64 _shr_uint64_read(uint8* buffer); 108 void _shr_uint64_write(uint8* buffer, const uint64 value); 109 110 int64 _shr_int64_read(uint8* buffer); 111 void _shr_int64_write(uint8* buffer, const int64 value); 112 113 /* To check if particular flag is set */ 114 #define _SHR_IS_FLAG_SET(flags, flag_bit) (((flags) & (flag_bit)) ? 1 : 0) 115 116 /* 117 * XOR two booleans. 118 */ 119 #define _SHR_XOR_BOOL(a, b) ((a && !b) || (!a && b)) 120 /* Repeating Delayed Procedure Call: 121 * Wrapper on top of SAL DPC layer to provide a safe mechanism for 122 * scheduling / unscheduling repeated calls to a function. 123 */ 124 125 /* shr_rdpc_fn_t should return the time interval until the next call, or 0 to indicate it should stop */ 126 typedef sal_usecs_t (*shr_rdpc_fn_t)(void **, void **, void **, void **); 127 128 typedef struct shr_rdpc_s { 129 shr_rdpc_fn_t func; 130 sal_mutex_t call_count_lock; 131 int run_count; 132 int running; 133 } shr_rdpc_t; 134 135 extern int shr_rdpc_callback_create(shr_rdpc_t *rdpc, shr_rdpc_fn_t func); 136 extern int shr_rdpc_callback_created(shr_rdpc_t *rdpc); 137 extern int shr_rdpc_callback_start(shr_rdpc_t *rdpc, sal_usecs_t first_interval, void *, void *, void *, void *); 138 extern int shr_rdpc_callback_stop(shr_rdpc_t *rdpc); 139 extern int shr_rdpc_callback_finished(shr_rdpc_t *rdpc); 140 extern int shr_rdpc_callback_destroy(shr_rdpc_t *rdpc); 141 142 143 #endif /* !_SHR_UTIL_H */