dxr
dxr->d = malloc(dxr_tot_size, M_DXRLPM, M_NOWAIT);
if (dxr->d == NULL) {
memcpy(dxr->d, da->d_tbl, d_size);
dxr->x = ((char *) dxr->d) + d_size;
memcpy(dxr->x, da->x_tbl, x_size);
dxr->r = ((char *) dxr->x) + x_size;
dxr->d_shift = 32 - da->d_bits;
dxr->x_shift = dxr_x;
dxr->x_mask = 0xffffffffU >> (32 - dxr_x);
memcpy(dxr->r, da->range_tbl, r_size);
struct dxr *dxr = algo_data;
return (dxr->nh_tbl[dxr_lookup(dxr, ntohl(key.addr4.s_addr))]);
struct dxr *old_dxr = old_data;
struct dxr *dxr;
dxr = malloc(sizeof(*dxr), M_DXRAUX, M_NOWAIT);
if (dxr == NULL) {
dxr->aux = da;
dxr->d = NULL;
dxr->fd = fd;
dxr->fibnum = fibnum;
*data = dxr;
struct dxr *dxr = data;
struct dxr_aux *da = dxr->aux;
free(dxr->d, M_DXRLPM);
free(dxr, M_DXRAUX);
struct dxr *dxr = __containerof(ctx, struct dxr, epoch_ctx);
dxr_destroy(dxr);
struct dxr *dxr = data;
dxr_build(dxr);
da = dxr->aux;
if (da == NULL || dxr->d == NULL)
dp->arg = dxr;
struct dxr *dxr = data;
struct dxr *new_dxr;
da = dxr->aux;
MPASS(da->fd == dxr->fd);
res = dxr_init(0, dxr->fd, data, (void **) &new_dxr);
if (fib_set_datapath_ptr(dxr->fd, &new_dp)) {
fib_set_algo_ptr(dxr->fd, new_dxr);
fib_epoch_call(epoch_dxr_destroy, &dxr->epoch_ctx);
FIB_PRINTF(LOG_NOTICE, dxr->fd, "fib_set_datapath_ptr() failed");
SYSCTL_NODE(_net_route_algo, OID_AUTO, dxr, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
dxr_lookup_##D(struct dxr *dxr, uint32_t dst) \
uint16_t *dt = dxr->d; \
struct direct_entry *xt = dxr->x; \
return (range_lookup(dxr->r, de, dst)); \
struct dxr *dxr = algo_data; \
return (dxr->nh_tbl[dxr_lookup_##D(dxr, \
dxr_lookup(struct dxr *dxr, uint32_t dst)
uint16_t *dt = dxr->d;
struct direct_entry *xt = dxr->x;
de = xt[(dt[dst >> dxr->d_shift] << dxr->x_shift) +
((dst >> DXR_RANGE_SHIFT) & dxr->x_mask)];
return (range_lookup(dxr->r, de, dst));
dxr_build(struct dxr *dxr)
struct dxr_aux *da = dxr->aux;
MPASS(dxr->d == NULL);
da = malloc(sizeof(*dxr->aux), M_DXRAUX, M_NOWAIT);
FIB_PRINTF(LOG_NOTICE, dxr->fd,
dxr->aux = da;
da->fibnum = dxr->fibnum;
da->fd = dxr->fd;
dxr->nh_tbl = fib_get_nhop_array(da->fd);