int kr_nsrep_update_rtt(struct kr_nsrep *ns, unsigned score, kr_nsrep_lru_t *cache) { if (!ns || !cache || ns->addr.ip.sa_family == AF_UNSPEC) { return kr_error(EINVAL); } char *addr = kr_nsrep_inaddr(ns->addr); size_t addr_len = kr_nsrep_inaddr_len(ns->addr); unsigned *cur = lru_set(cache, addr, addr_len); if (!cur) { return kr_error(ENOMEM); } /* Score limits */ if (score > KR_NS_MAX_SCORE) { score = KR_NS_MAX_SCORE; } if (score <= KR_NS_GLUED) { score = KR_NS_GLUED + 1; } /* Set initial value or smooth over last two measurements */ if (*cur != 0) { *cur = (*cur + score) / 2; } else { /* First measurement, reset */ *cur = score; } return kr_ok(); }
int kr_nsrep_update_rep(struct kr_nsrep *ns, unsigned reputation, kr_nsrep_lru_t *cache) { if (!ns || !cache ) { return kr_error(EINVAL); } /* Store in the struct */ ns->reputation = reputation; /* Store reputation in the LRU cache */ unsigned *cur = lru_set(cache, (const char *)ns->name, knot_dname_size(ns->name)); if (!cur) { return kr_error(ENOMEM); } *cur = reputation; return kr_ok(); }
int kr_nsrep_update_rtt(struct kr_nsrep *ns, const struct sockaddr *addr, unsigned score, kr_nsrep_lru_t *cache) { if (!ns || !cache || ns->addr[0].ip.sa_family == AF_UNSPEC) { return kr_error(EINVAL); } const char *addr_in = kr_nsrep_inaddr(ns->addr[0]); size_t addr_len = kr_nsrep_inaddr_len(ns->addr[0]); if (addr) { /* Caller provided specific address */ if (addr->sa_family == AF_INET) { addr_in = (const char *)&((struct sockaddr_in *)addr)->sin_addr; addr_len = sizeof(struct in_addr); } else if (addr->sa_family == AF_INET6) { addr_in = (const char *)&((struct sockaddr_in6 *)addr)->sin6_addr; addr_len = sizeof(struct in6_addr); } } unsigned *cur = lru_set(cache, addr_in, addr_len); if (!cur) { return kr_error(ENOMEM); } /* Score limits */ if (score > KR_NS_MAX_SCORE) { score = KR_NS_MAX_SCORE; } if (score <= KR_NS_GLUED) { score = KR_NS_GLUED + 1; } /* Set initial value or smooth over last two measurements */ if (*cur != 0) { *cur = (*cur + score) / 2; } else { /* First measurement, reset */ *cur = score; } return kr_ok(); }
/****************************** LOCAL FUNCTIONS *******************************/ int main () { int32_t i_ret_val = -1; PAL_RET_E e_pal_ret = ePAL_RET_FAILURE; bool b_pal_init = false; PAL_LOGGER_INIT_PARAMS_X x_logger_param = { false }; LRU_RET_E e_lru_ret = eLRU_RET_FAILURE; LRU_HDL hl_lru_hdl = NULL; LRU_INIT_PARAMS_X x_lru_init_params = {0}; LRU_NODE_DATA_X x_node_data = {eHM_KEY_TYPE_INVALID}; uint8_t uca_str_buf[1024] = {0}; int i_command = -1; int i_ret = -1; bool b_exit = false; x_logger_param.b_enable_console_logging = true; x_logger_param.e_level = eLOG_LEVEL_HIGH; pal_logger_env_init (&x_logger_param); e_pal_ret = pal_env_init (); if (ePAL_RET_SUCCESS != e_pal_ret) { LRU_TEST_LOG ("pal_env_init failed: %d", e_pal_ret); goto CLEAN_RETURN; } b_pal_init = true; LRU_TEST_LOG ("pal_env_init success"); x_lru_init_params.ui_max_size_bytes = (1 * 1024 * 1024); e_lru_ret = lru_init(&hl_lru_hdl, &x_lru_init_params); if ((eLRU_RET_SUCCESS != e_lru_ret) || (NULL == hl_lru_hdl)) { LRU_TEST_LOG ("lru_create failed: %d, %p", e_lru_ret, hl_lru_hdl); goto CLEAN_RETURN; } LRU_TEST_LOG ("lru_create success: %d, %p", e_lru_ret, hl_lru_hdl); while (1) { printf ("Commands:\n\t1. Add\n\t2. Search\n\t3. Delete" "\n\t4. Delete All\n\t5. Exit\n" "Enter Command: "); fflush (stdout); PAL_GET_INT32_FROM_CONSOLE(&i_command); if (4 != i_command && 5 != i_command && 6 != i_command) { printf ("Enter String: "); fflush (stdout); PAL_GET_STRING_FROM_CONSOLE(uca_str_buf, sizeof(uca_str_buf)); } switch (i_command) { case 1: { (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data)); x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING; x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf; x_node_data.x_hm_node.p_data = malloc (100); x_node_data.x_hm_node.ui_data_size = 100; e_lru_ret = lru_set (hl_lru_hdl, &x_node_data); if (eLRU_RET_SUCCESS != e_lru_ret) { LRU_TEST_LOG ("lru_set failed: %d, %p", e_lru_ret, hl_lru_hdl); } else { LRU_TEST_LOG ("lru_set success: %d, %p", e_lru_ret, hl_lru_hdl); lru_print (hl_lru_hdl); } break; } case 2: { (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data)); x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING; x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf; e_lru_ret = lru_has (hl_lru_hdl, &x_node_data); if (eLRU_RET_NODE_FOUND == e_lru_ret) { LRU_TEST_LOG("Key \"%s\" Found: %p", uca_str_buf, x_node_data.x_hm_node.p_data); } else { LRU_TEST_LOG("Key \"%s\" Not Found: %d", uca_str_buf, e_lru_ret); } break; } case 3: { (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data)); x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING; x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf; e_lru_ret = lru_delete (hl_lru_hdl, &x_node_data); if (eLRU_RET_SUCCESS == e_lru_ret) { LRU_TEST_LOG("Key \"%s\" Deleted", uca_str_buf); } else { LRU_TEST_LOG("Key \"%s\" Not Found: %d", uca_str_buf, e_lru_ret); } lru_print (hl_lru_hdl); break; } case 4: { e_lru_ret = lru_delete_all (hl_lru_hdl); lru_print (hl_lru_hdl); break; } case 5: { b_exit = true; break; } } if (true == b_exit) { break; } } CLEAN_RETURN: if (NULL != hl_lru_hdl) { lru_deinit(hl_lru_hdl); } if (true == b_pal_init) { e_pal_ret = pal_env_deinit(); if (ePAL_RET_SUCCESS != e_pal_ret) { LRU_TEST_LOG("pal_env_deinit failed: %d", e_pal_ret); } else { LRU_TEST_LOG("pal_env_deinit success"); } } return i_ret_val; }