VLOG_DEFINE_THIS_MODULE(ofp_parse)
-#define DEFAULT_IDLE_TIMEOUT 60
-
static uint32_t
str_to_u32(const char *str)
{
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)
{
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. */
*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;