示例#1
0
/**
 * @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));
    }
}
示例#2
0
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);
}