/** * @brief Validate records in prefix table */ static void rec_val(struct pfx_table *pfxt) { const int tid = getpid(); struct pfx_record rec; enum pfxv_state res; rec.min_len = 32; rec.max_len = 32; rec.prefix.ver = LRTR_IPV4; rec.prefix.u.addr4.addr = 0; printf("validating..\n"); for (uint32_t i = max_i; i >= min_i; i--) { rec.min_len = 32; rec.max_len = 32; rec.prefix.ver = LRTR_IPV4; rec.prefix.u.addr4.addr = htonl(i); pfx_table_validate(pfxt, (tid % 2), &rec.prefix, rec.min_len, &res); pfx_table_validate(pfxt, (tid % 2) + 1, &rec.prefix, rec.min_len, &res); rec.min_len = 128; rec.max_len = 128; rec.prefix.ver = LRTR_IPV6; rec.prefix.u.addr6.addr[1] = min_i + 0xFFFFFFFF; rec.prefix.u.addr6.addr[0] = htonl(i) + 0xFFFFFFFF; pfx_table_validate(pfxt, (tid % 2) + 1, &rec.prefix, rec.min_len, &res); usleep(rand() / (RAND_MAX / 20)); } }
void fill_pfx_table(struct pfx_table* pfxt){ FILE* df = fopen("pfx_records.txt", "r"); if(df == NULL){ fprintf(stderr, "cant open pfx_records.txt"); exit(EXIT_FAILURE); } char ip[256]; unsigned int pref_len; unsigned int asn; unsigned int count = 0; struct pfx_record rec; while (fscanf(df, "%s %u %u", ip, &pref_len, &asn) != EOF){ rec.max_len = pref_len; rec.min_len = pref_len; rec.asn = asn; printf("%u: IP: %s/%u %u\n", count, ip, pref_len, asn); enum ip_version ver; if (strchr("ip", ':') == NULL) ver = IPV6; else ver = IPV4; if(ip_str_to_addr(ip, &(rec.prefix)) == -1){ fprintf(stderr, "ip_str_to_addr_error\n"); exit(EXIT_FAILURE); } if(pfx_table_add(pfxt, &rec) == PFX_ERROR){ fprintf(stderr, "pfx_table_add error\n"); exit(EXIT_FAILURE); } char tmp[100]; ip_addr_to_str(&(rec.prefix), tmp, sizeof(tmp)); //printf("IP: %s/%u-%u %u\n", t, rec.min_len, rec.max_len,rec.asn); enum pfxv_state state; pfx_table_validate(pfxt, rec.asn, &(rec.prefix), rec.min_len, &state); if(state != BGP_PFXV_STATE_VALID){ printf("Error added pfx_record couldnt be validated as valid\n"); exit(EXIT_FAILURE); } count++; } printf("added %u records to the pfx_table\n", count); fclose(df); }