Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}