| 2476 | } |
| 2477 | |
| 2478 | int |
| 2479 | ff_rss_tbl_init(void) |
| 2480 | { |
| 2481 | uint32_t ori_idx, idx, ori_daddr_idx, daddr_idx; |
| 2482 | uint32_t daddr, saddr; |
| 2483 | uint16_t sport; |
| 2484 | int prev_dport, stat, i, j, k; |
| 2485 | void *sc; |
| 2486 | struct ff_dpdk_if_context ctx; |
| 2487 | |
| 2488 | memset(ff_rss_tbl, 0, sizeof(ff_rss_tbl)); |
| 2489 | |
| 2490 | sc = ff_veth_get_softc(&ctx); |
| 2491 | if (sc == NULL) { |
| 2492 | ff_log(FF_LOG_ERR, FF_LOGTYPE_FSTACK_LIB, "ff_veth_get_softc failed\n"); |
| 2493 | return -1; |
| 2494 | } |
| 2495 | |
| 2496 | for (i = 0; i < ff_global_cfg.dpdk.rss_check_cfgs->nb_rss_tbl; i++) { |
| 2497 | struct ff_rss_tbl_cfg *rcc = &ff_global_cfg.dpdk.rss_check_cfgs->rss_tbl_cfgs[i]; |
| 2498 | |
| 2499 | ctx.port_id = rcc->port_id; |
| 2500 | daddr = rcc->daddr; |
| 2501 | saddr = rcc->saddr; |
| 2502 | sport = rcc->sport; |
| 2503 | |
| 2504 | /* Use DIR D to avoid getting the same idx while FF_RSS_TBL_MAX_DIP_MASK is very small*/ |
| 2505 | ori_idx = idx = ((saddr + (uint32_t)((uint8_t *)&saddr)[3]) ^ sport) & \ |
| 2506 | FF_RSS_TBL_MAX_SADDR_SPORT_ENTRIES_MASK; |
| 2507 | ori_daddr_idx = daddr_idx = (daddr + (uint32_t)((uint8_t *)&daddr)[3]) & \ |
| 2508 | FF_RSS_TBL_MAX_DIP_MASK; |
| 2509 | |
| 2510 | do { |
| 2511 | if (ff_rss_tbl[idx].saddr == INADDR_ANY || |
| 2512 | (ff_rss_tbl[idx].saddr == saddr && |
| 2513 | ff_rss_tbl[idx].sport == sport)) { |
| 2514 | break; |
| 2515 | } |
| 2516 | |
| 2517 | if (ff_rss_tbl[idx].saddr != saddr || |
| 2518 | ff_rss_tbl[idx].sport != sport) { |
| 2519 | idx++; |
| 2520 | idx &= FF_RSS_TBL_MAX_SADDR_SPORT_ENTRIES_MASK; |
| 2521 | } |
| 2522 | } while (idx != ori_idx); |
| 2523 | |
| 2524 | if (idx == ori_idx && |
| 2525 | ((ff_rss_tbl[idx].saddr != INADDR_ANY) && |
| 2526 | (ff_rss_tbl[idx].saddr != saddr || |
| 2527 | ff_rss_tbl[idx].sport != sport))) { |
| 2528 | ff_log(FF_LOG_WARNING, FF_LOGTYPE_FSTACK_LIB, "There are too many 2-tuble(> %d) of saddrs(max %d) * sport(max %d)," |
| 2529 | " this 4-tuple rss_tbl config will be ignored," |
| 2530 | " idx %d, port_id %u, daddr "NIPQUAD_FMT", saddr "NIPQUAD_FMT", sport %u\n", |
| 2531 | FF_RSS_TBL_MAX_SADDR_SPORT_ENTRIES, FF_RSS_TBL_MAX_SADDR, FF_RSS_TBL_MAX_SPORT, |
| 2532 | i, ctx.port_id, NIPQUAD(daddr), NIPQUAD(saddr), ntohs(sport)); |
| 2533 | goto IGNORE; |
| 2534 | //ff_veth_free_softc(sc); |
| 2535 | //return -1; |
no test coverage detected