Changeset View
Changeset View
Standalone View
Standalone View
sbin/ipfw/tables.c
Context not available. | |||||
#include <string.h> | #include <string.h> | ||||
#include <sysexits.h> | #include <sysexits.h> | ||||
#include <net/ethernet.h> | |||||
#include <net/if.h> | #include <net/if.h> | ||||
#include <netinet/in.h> | #include <netinet/in.h> | ||||
#include <netinet/ip_fw.h> | #include <netinet/ip_fw.h> | ||||
Context not available. | |||||
static struct _s_x tabletypes[] = { | static struct _s_x tabletypes[] = { | ||||
{ "addr", IPFW_TABLE_ADDR }, | { "addr", IPFW_TABLE_ADDR }, | ||||
{ "mac", IPFW_TABLE_MAC }, | |||||
{ "iface", IPFW_TABLE_INTERFACE }, | { "iface", IPFW_TABLE_INTERFACE }, | ||||
{ "number", IPFW_TABLE_NUMBER }, | { "number", IPFW_TABLE_NUMBER }, | ||||
{ "flow", IPFW_TABLE_FLOW }, | { "flow", IPFW_TABLE_FLOW }, | ||||
Context not available. | |||||
char *p, *pp; | char *p, *pp; | ||||
int mask, af; | int mask, af; | ||||
struct in6_addr *paddr, tmp; | struct in6_addr *paddr, tmp; | ||||
struct ether_addr *mac; | |||||
struct tflow_entry *tfe; | struct tflow_entry *tfe; | ||||
uint32_t key, *pkey; | uint32_t key, *pkey; | ||||
uint16_t port; | uint16_t port; | ||||
Context not available. | |||||
af = AF_INET; | af = AF_INET; | ||||
} | } | ||||
break; | break; | ||||
case IPFW_TABLE_MAC: | |||||
/* Remove / if exists */ | |||||
if ((p = strchr(arg, '/')) != NULL) { | |||||
*p = '\0'; | |||||
mask = atoi(p + 1); | |||||
} | |||||
if (p != NULL && mask > 8 * ETHER_ADDR_LEN) | |||||
errx(EX_DATAERR, "bad MAC mask width: %s", | |||||
p + 1); | |||||
if ((mac = ether_aton(arg)) == NULL) | |||||
errx(EX_DATAERR, "Incorrect MAC address"); | |||||
memcpy(tentry->k.mac, mac->octet, ETHER_ADDR_LEN); | |||||
masklen = p ? mask : 8 * ETHER_ADDR_LEN; | |||||
af = AF_LINK; | |||||
break; | |||||
case IPFW_TABLE_INTERFACE: | case IPFW_TABLE_INTERFACE: | ||||
/* Assume interface name. Copy significant data only */ | /* Assume interface name. Copy significant data only */ | ||||
mask = MIN(strlen(arg), IF_NAMESIZE - 1); | mask = MIN(strlen(arg), IF_NAMESIZE - 1); | ||||
Context not available. | |||||
{ | { | ||||
char tbuf[128], pval[128]; | char tbuf[128], pval[128]; | ||||
const char *comma; | const char *comma; | ||||
const u_char *mac; | |||||
void *paddr; | void *paddr; | ||||
struct tflow_entry *tfe; | struct tflow_entry *tfe; | ||||
Context not available. | |||||
inet_ntop(tent->subtype, &tent->k, tbuf, sizeof(tbuf)); | inet_ntop(tent->subtype, &tent->k, tbuf, sizeof(tbuf)); | ||||
printf("%s/%u %s\n", tbuf, tent->masklen, pval); | printf("%s/%u %s\n", tbuf, tent->masklen, pval); | ||||
break; | break; | ||||
case IPFW_TABLE_MAC: | |||||
/* MAC prefixes */ | |||||
mac = tent->k.mac; | |||||
printf("%02x:%02x:%02x:%02x:%02x:%02x/%u %s\n", | |||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], | |||||
tent->masklen, pval); | |||||
break; | |||||
case IPFW_TABLE_INTERFACE: | case IPFW_TABLE_INTERFACE: | ||||
/* Interface names */ | /* Interface names */ | ||||
printf("%s %s\n", tent->k.iface, pval); | printf("%s %s\n", tent->k.iface, pval); | ||||
Context not available. |