X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-parse.c;h=312eaaaaff1842d9583a7892313a088a533de5f7;hb=0cc96e48ab2fc573c3b7b69fe5a034bb29dde578;hp=9068772f898dce8b7ad9fd9ef701126817f0ebf3;hpb=f22716dcca299b863dd72eb193fb1283c5f686da;p=openvswitch diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 9068772f..312eaaaa 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -33,8 +33,6 @@ VLOG_DEFINE_THIS_MODULE(ofp_parse) -#define DEFAULT_IDLE_TIMEOUT 60 - static uint32_t str_to_u32(const char *str) { @@ -144,6 +142,14 @@ put_output_action(struct ofpbuf *b, uint16_t port) return oao; } +static void +put_enqueue_action(struct ofpbuf *b, uint16_t port, uint32_t queue) +{ + struct ofp_action_enqueue *oae = put_action(b, sizeof *oae, OFPAT_ENQUEUE); + oae->port = htons(port); + oae->queue_id = htonl(queue); +} + static void put_dl_addr_action(struct ofpbuf *b, uint16_t type, const char *addr) { @@ -255,8 +261,21 @@ str_to_action(char *str, struct ofpbuf *b) nast->vendor = htonl(NX_VENDOR_ID); nast->subtype = htons(NXAST_SET_TUNNEL); nast->tun_id = htonl(str_to_u32(arg)); + } else if (!strcasecmp(act, "drop_spoofed_arp")) { + struct nx_action_header *nah; + nah = put_action(b, sizeof *nah, OFPAT_VENDOR); + nah->vendor = htonl(NX_VENDOR_ID); + nah->subtype = htons(NXAST_DROP_SPOOFED_ARP); } else if (!strcasecmp(act, "output")) { put_output_action(b, str_to_u32(arg)); + } else if (!strcasecmp(act, "enqueue")) { + char *sp = NULL; + char *port_s = strtok_r(arg, ":q", &sp); + char *queue = strtok_r(NULL, "", &sp); + if (port_s == NULL || queue == NULL) { + ovs_fatal(0, "\"enqueue\" syntax is \"enqueue:PORT:QUEUE\""); + } + put_enqueue_action(b, str_to_u32(port_s), str_to_u32(queue)); } else if (!strcasecmp(act, "drop")) { /* A drop action in OpenFlow occurs by just not setting * an action. */ @@ -381,7 +400,7 @@ parse_ofp_str(char *string, struct ofp_match *match, struct ofpbuf *actions, *priority = OFP_DEFAULT_PRIORITY; } if (idle_timeout) { - *idle_timeout = DEFAULT_IDLE_TIMEOUT; + *idle_timeout = OFP_FLOW_PERMANENT; } if (hard_timeout) { *hard_timeout = OFP_FLOW_PERMANENT;