lagopus_result_t match_trace(const void *pac, size_t pac_size, char *str, size_t max_len) { int n, i; struct match *packet = (struct match *) pac; if (pac_size == sizeof(struct match)) { /* Trace packet. */ TRACE_STR_ADD(n, str, max_len, "match ["); if (packet != NULL) { TRACE_STR_ADD(n, str, max_len, "MATCH: %s(%d) mask:%d len:%d val:", oxm_ofb_match_fields_str(OXM_FIELD_TYPE(packet->oxm_field)), OXM_FIELD_TYPE(packet->oxm_field), packet->oxm_field & 1, packet->oxm_length); for (i = 0; i < packet->oxm_length; i++) { TRACE_STR_ADD(n, str, max_len, "%02x ", *(packet->oxm_value + i)); } } else { TRACE_STR_ADD(n, str, max_len, "NULL"); } TRACE_STR_ADD(n, str, max_len, "]"); } else { return LAGOPUS_RESULT_OUT_OF_RANGE; } return LAGOPUS_RESULT_OK; }
static struct match * get_match_in_port(struct match_list *match_list, uint32_t *port) { struct match *match; TAILQ_FOREACH(match, match_list, entry) { if (OXM_FIELD_TYPE(match->oxm_field) == OFPXMT_OFB_IN_PORT) { OS_MEMCPY(port, match->oxm_value, sizeof(*port)); break; } } return match; }
static struct match * get_match_ip_proto(struct match_list *match_list, uint8_t *proto) { struct match *match; TAILQ_FOREACH(match, match_list, entry) { if (OXM_FIELD_TYPE(match->oxm_field) == OFPXMT_OFB_IP_PROTO) { *proto = *match->oxm_value; break; } } return match; }
static lagopus_result_t get_match_metadata(const struct match_list *match_list, uint64_t *metadata, uint64_t *mask) { const struct match *match; TAILQ_FOREACH(match, match_list, entry) { if (match->oxm_field == (OFPXMT_OFB_METADATA << 1) + 1) { OS_MEMCPY(metadata, match->oxm_value, sizeof(*metadata)); OS_MEMCPY(mask, &match->oxm_value[8], sizeof(*mask)); break; } if (OXM_FIELD_TYPE(match->oxm_field) == OFPXMT_OFB_METADATA) { OS_MEMCPY(metadata, match->oxm_value, sizeof(*metadata)); *mask = 0xffffffffffffffff; break; } } if (match == NULL) { return LAGOPUS_RESULT_NOT_FOUND; } return LAGOPUS_RESULT_OK; }
static lagopus_result_t get_match_ipv4_dst(const struct match_list *match_list, uint32_t *ipv4_dst, uint32_t *mask) { const struct match *match; TAILQ_FOREACH(match, match_list, entry) { if (match->oxm_field == (OFPXMT_OFB_IPV4_DST << 1) + 1) { OS_MEMCPY(ipv4_dst, match->oxm_value, sizeof(*ipv4_dst)); OS_MEMCPY(mask, &match->oxm_value[4], sizeof(*mask)); break; } if (OXM_FIELD_TYPE(match->oxm_field) == OFPXMT_OFB_IPV4_DST) { OS_MEMCPY(ipv4_dst, match->oxm_value, sizeof(*ipv4_dst)); *mask = 0xffffffff; break; } } if (match == NULL) { return LAGOPUS_RESULT_NOT_FOUND; } return LAGOPUS_RESULT_OK; }