/* * npfctl_table: add, remove or query entries in the specified table. * * For maximum performance, interface is avoiding proplib(3)'s overhead. */ int npfctl_table(void *data) { npf_ioctl_table_t *nct = data; npf_tableset_t *tblset; int error; npf_core_enter(); /* XXXSMP */ tblset = npf_core_tableset(); switch (nct->nct_action) { case NPF_IOCTL_TBLENT_ADD: error = npf_table_insert(tblset, nct->nct_tid, nct->nct_alen, &nct->nct_addr, nct->nct_mask); break; case NPF_IOCTL_TBLENT_REM: error = npf_table_remove(tblset, nct->nct_tid, nct->nct_alen, &nct->nct_addr, nct->nct_mask); break; default: error = npf_table_lookup(tblset, nct->nct_tid, nct->nct_alen, &nct->nct_addr); } npf_core_exit(); /* XXXSMP */ return error; }
/* * npfctl_table: add, remove or query entries in the specified table. * * For maximum performance, interface is avoiding proplib(3)'s overhead. */ int npfctl_table(void *data) { const npf_ioctl_table_t *nct = data; char tname[NPF_TABLE_MAXNAMELEN]; npf_tableset_t *ts; npf_table_t *t; int s, error; error = copyinstr(nct->nct_name, tname, sizeof(tname), NULL); if (error) { return error; } s = npf_config_read_enter(); /* XXX */ ts = npf_config_tableset(); if ((t = npf_tableset_getbyname(ts, tname)) == NULL) { npf_config_read_exit(s); return EINVAL; } switch (nct->nct_cmd) { case NPF_CMD_TABLE_LOOKUP: error = npf_table_lookup(t, nct->nct_data.ent.alen, &nct->nct_data.ent.addr); break; case NPF_CMD_TABLE_ADD: error = npf_table_insert(t, nct->nct_data.ent.alen, &nct->nct_data.ent.addr, nct->nct_data.ent.mask); break; case NPF_CMD_TABLE_REMOVE: error = npf_table_remove(t, nct->nct_data.ent.alen, &nct->nct_data.ent.addr, nct->nct_data.ent.mask); break; case NPF_CMD_TABLE_LIST: error = npf_table_list(t, nct->nct_data.buf.buf, nct->nct_data.buf.len); break; case NPF_CMD_TABLE_FLUSH: error = npf_table_flush(t); break; default: error = EINVAL; break; } npf_config_read_exit(s); return error; }