2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-30 22:05:19 +00:00

NSH: Minor bugfixes

- Fix 2 incorrect length checks
- Remove unnecessary limit of MD length to 16 bytes
- Remove incorrect comments stating MD2 was not supported
- Pad metadata in encap_nsh with zeroes if not multiple of 4 bytes

Signed-off-by: Jan Scheurich <jan.scheurich@ericsson.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
This commit is contained in:
Jan Scheurich
2017-11-07 15:48:39 +01:00
committed by Ben Pfaff
parent ea36b04688
commit 7edef47b48
4 changed files with 17 additions and 14 deletions

View File

@@ -793,15 +793,15 @@ struct ovs_action_push_eth {
struct ovs_key_ethernet addresses;
};
#define OVS_ENCAP_NSH_MAX_MD_LEN 16
#define OVS_ENCAP_NSH_MAX_MD_LEN 248
/*
* struct ovs_action_encap_nsh - %OVS_ACTION_ATTR_ENCAP_NSH
* @flags: NSH header flags.
* @mdtype: NSH metadata type.
* @mdlen: Length of NSH metadata in bytes.
* @mdlen: Length of NSH metadata in bytes, including padding.
* @np: NSH next_protocol: Inner packet type.
* @path_hdr: NSH service path id and service index.
* @metadata: NSH metadata for MD type 1 or 2
* @metadata: NSH context metadata, padded to 4-bytes
*/
struct ovs_action_encap_nsh {
uint8_t flags;

View File

@@ -540,7 +540,7 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key)
/* Check if it is long enough for NSH header, doesn't support
* MD type 2 yet
*/
if (OVS_UNLIKELY(*sizep < NSH_M_TYPE1_LEN)) {
if (OVS_UNLIKELY(*sizep < NSH_BASE_HDR_LEN)) {
return false;
}
@@ -557,10 +557,6 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key)
return false;
}
if (length != NSH_M_TYPE1_LEN) {
return false;
}
key->flags = flags;
key->mdtype = nsh->md_type;
key->np = nsh->next_proto;
@@ -571,14 +567,17 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key)
switch (key->mdtype) {
case NSH_M_TYPE1:
if (length != NSH_M_TYPE1_LEN) {
return false;
}
for (size_t i = 0; i < 4; i++) {
key->c[i] = get_16aligned_be32(&nsh->md1.c[i]);
}
break;
case NSH_M_TYPE2:
/* Don't support MD type 2 yet, so return false */
default:
return false;
/* We don't parse other context headers yet. */
break;
}
data_pull(datap, sizep, length);

View File

@@ -1864,12 +1864,17 @@ parse_odp_encap_nsh_action(const char *s, struct ofpbuf *actions)
else if (encap_nsh.mdtype == NSH_M_TYPE2) {
struct ofpbuf b;
char buf[512];
size_t mdlen;
size_t mdlen, padding;
if (ovs_scan_len(s, &n, "md2=0x%511[0-9a-fA-F]", buf)) {
ofpbuf_use_stub(&b, encap_nsh.metadata,
OVS_ENCAP_NSH_MAX_MD_LEN);
ofpbuf_put_hex(&b, buf, &mdlen);
encap_nsh.mdlen = mdlen;
/* Pad metadata to 4 bytes. */
padding = PAD_SIZE(mdlen, 4);
if (padding > 0) {
ofpbuf_push_zeros(&b, padding);
}
encap_nsh.mdlen = mdlen + padding;
ofpbuf_uninit(&b);
}
continue;

View File

@@ -439,8 +439,7 @@ encap_nsh(struct dp_packet *packet, const struct ovs_action_encap_nsh *encap)
break;
case NSH_M_TYPE2: {
/* The MD2 metadata in encap is already padded to 4 bytes. */
size_t len = ROUND_UP(encap->mdlen, 4);
memcpy(&nsh->md2, encap->metadata, len);
memcpy(&nsh->md2, encap->metadata, encap->mdlen);
break;
}
default: