X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Flearning-switch.c;h=3bcb9610a5644338641bd82c1d9d0e5d1ee5716b;hb=816fd533f85923c03cf8d9d6450bd9a0845d5160;hp=269f0301d2ee6c6ad87c696622b57536f8d2f744;hpb=b85145b59fab7efa236cdabd6ef0bda87f373d19;p=openvswitch diff --git a/lib/learning-switch.c b/lib/learning-switch.c index 269f0301..3bcb9610 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -29,6 +29,7 @@ #include "hmap.h" #include "mac-learning.h" #include "ofpbuf.h" +#include "ofp-errors.h" #include "ofp-parse.h" #include "ofp-print.h" #include "ofp-util.h" @@ -106,8 +107,9 @@ lswitch_create(struct rconn *rconn, const struct lswitch_config *cfg) if (cfg->wildcards == UINT32_MAX) { /* Try to wildcard as many fields as possible, but we cannot * wildcard all fields. We need in_port to detect moves. We need - * Ethernet source and dest and VLAN to do L2 learning. */ - ofpfw = (OFPFW_DL_TYPE | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL + * Ethernet source and dest and VLAN VID to do L2 learning. */ + ofpfw = (OFPFW_DL_TYPE | OFPFW_DL_VLAN_PCP + | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | OFPFW_NW_TOS | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST); } else { @@ -148,7 +150,7 @@ lswitch_create(struct rconn *rconn, const struct lswitch_config *cfg) } } } - + return sw; } @@ -224,7 +226,7 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn, /* Nothing to do. */ break; - case OFPUTIL_INVALID: + case OFPUTIL_MSG_INVALID: case OFPUTIL_OFPT_HELLO: case OFPUTIL_OFPT_ERROR: case OFPUTIL_OFPT_ECHO_REPLY: @@ -256,6 +258,8 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn, case OFPUTIL_NXT_ROLE_REPLY: case OFPUTIL_NXT_FLOW_MOD_TABLE_ID: case OFPUTIL_NXT_SET_FLOW_FORMAT: + case OFPUTIL_NXT_SET_PACKET_IN_FORMAT: + case OFPUTIL_NXT_PACKET_IN: case OFPUTIL_NXT_FLOW_MOD: case OFPUTIL_NXT_FLOW_REMOVED: case OFPUTIL_NXST_FLOW_REQUEST: @@ -418,7 +422,7 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, pkt_ofs = offsetof(struct ofp_packet_in, data); pkt_len = ntohs(opi->header.length) - pkt_ofs; ofpbuf_use_const(&pkt, opi->data, pkt_len); - flow_extract(&pkt, 0, in_port, &flow); + flow_extract(&pkt, 0, 0, in_port, &flow); /* Choose output port. */ out_port = lswitch_choose_destination(sw, &flow);