<div dir="ltr">branch can also be downloaded from :<div><br></div><div><a href="https://github.com/alexw-nicira/alexw-ovs/branches/ofp_odp_naming">https://github.com/alexw-nicira/alexw-ovs/branches/ofp_odp_naming</a><br></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 18, 2013 at 10:32 AM, Alex Wang <span dir="ltr">&lt;<a href="mailto:alexw@nicira.com" target="_blank">alexw@nicira.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Currently datapath ports and openflow ports are both represented by unsigned<br>
integers of various sizes. With implicit casts, etc. it is easy to mix them<br>
up and use one where the other is expected. This commit creates two typedefs<br>
ofp_port_t and odp_port_t. Both of these two types are marked by<br>
&quot;__attribute__((bitwise))&quot; so that Sparse can be used to detect any misuse.<br>
<br>
Signed-off-by: Alex Wang &lt;<a href="mailto:alexw@nicira.com">alexw@nicira.com</a>&gt;<br>
<br>
---<br>
<br>
v1 -&gt; v2:<br>
- Adds ofp_to_u16 / odp_to_u32 functions for conversion from ofp/odp_port_t<br>
  to corresponding uint types<br>
- Adds uint_to_ofp / uint_to_odp functions for conversion from uint variables<br>
  to corresponding ofp_port_t, odp_port_t types<br>
- Rebases to current master<br>
<br>
SOME DESIGN IDEAS:<br>
<br>
include/openvswitch/types.h :<br>
- Typedefs ofp_port_t, odp_port_t and ofp11_port_t<br>
<br>
include/openflow/openflow-1.0.h, openflow-1.1.h :<br>
- Defines Openflow related macros e.g. OFPP_NONE, OFPP_MAX<br>
<br>
lib/dpif-linux.c, dpif-netdev.c :<br>
- Explicitly casts odp_port_t to uint32_t, since the odp_port variable is used<br>
  as array index<br>
- The MAX_PORT macro is not converted to odp_port_t, since it is compared with<br>
  other UINT types and used as array size<br>
<br>
lib/flow.h, flow.c :<br>
- Defines &quot;union flow_in_port&quot;, which can be ofp_port_t, odp_port_t or<br>
  ofp11_port_t. And each &quot;struct flow&quot; contains a &quot;union flow_in_port in_port&quot;<br>
- Defines ofp/odp_port_t related utility functions, e.g. ofp_htons, odp_htonl<br>
- The in_port argument of &quot;flow_extract()&quot; function is changed to of type<br>
  &quot;union flow_in_port *&quot;, since it is called with both odp/ofp port number<br>
<br>
lib/odp-util.c, ofp-util.c :<br>
- Nasty, a lot of conversions between Openflow protocol data structures and<br>
  internal abstract data structures. Also a lot of explicity cast using<br>
  OVS_FORCE macro<br>
<br>
ofproto/ofproto.c ofproto-dpif.c, vswitch/bridge.c :<br>
- A lot of changes in struct element and function headers. Convert from uint<br>
  to corresponding ofp/odp_port_t type<br>
<br>
---<br>
 include/linux/openvswitch.h     |    2 +-<br>
 include/openflow/openflow-1.0.h |   56 ++++++++-----<br>
 include/openflow/openflow-1.1.h |    4 +-<br>
 include/openvswitch/types.h     |    6 ++<br>
 lib/bundle.c                    |   22 ++---<br>
 lib/bundle.h                    |    6 +-<br>
 lib/dpif-linux.c                |   60 +++++++------<br>
 lib/dpif-linux.h                |    4 +-<br>
 lib/dpif-netdev.c               |   88 ++++++++++---------<br>
 lib/dpif-provider.h             |   10 +--<br>
 lib/dpif.c                      |   22 ++---<br>
 lib/dpif.h                      |   14 ++--<br>
 lib/flow.c                      |    8 +-<br>
 lib/flow.h                      |  177 +++++++++++++++++++++++++++++++++++++--<br>
 lib/learn.c                     |    4 +-<br>
 lib/learning-switch.c           |   30 ++++---<br>
 lib/mac-learning.h              |    2 +-<br>
 lib/match.c                     |   10 +--<br>
 lib/match.h                     |    2 +-<br>
 lib/meta-flow.c                 |   35 ++++----<br>
 lib/meta-flow.h                 |    2 +-<br>
 lib/nx-match.c                  |    6 +-<br>
 lib/odp-util.c                  |   10 ++-<br>
 lib/odp-util.h                  |    4 +-<br>
 lib/ofp-actions.c               |   34 ++++----<br>
 lib/ofp-actions.h               |   12 +--<br>
 lib/ofp-parse.c                 |   12 +--<br>
 lib/ofp-print.c                 |   17 ++--<br>
 lib/ofp-util.c                  |  144 ++++++++++++++++---------------<br>
 lib/ofp-util.h                  |   34 ++++----<br>
 lib/sflow.h                     |    2 +<br>
 lib/sflow_api.h                 |    6 +-<br>
 lib/sflow_poller.c              |    4 +-<br>
 ofproto/connmgr.c               |    4 +-<br>
 ofproto/connmgr.h               |    6 +-<br>
 ofproto/in-band.c               |    4 +-<br>
 ofproto/in-band.h               |    3 +-<br>
 ofproto/netflow.c               |   12 +--<br>
 ofproto/netflow.h               |   10 +--<br>
 ofproto/ofproto-dpif-sflow.c    |   17 ++--<br>
 ofproto/ofproto-dpif-sflow.h    |    9 +-<br>
 ofproto/ofproto-dpif-xlate.c    |   89 ++++++++++----------<br>
 ofproto/ofproto-dpif-xlate.h    |    2 +-<br>
 ofproto/ofproto-dpif.c          |  136 ++++++++++++++++--------------<br>
 ofproto/ofproto-dpif.h          |   17 ++--<br>
 ofproto/ofproto-provider.h      |   18 ++--<br>
 ofproto/ofproto.c               |  102 ++++++++++++----------<br>
 ofproto/ofproto.h               |   37 ++++----<br>
 ofproto/pinsched.c              |    9 +-<br>
 ofproto/pinsched.h              |    3 +-<br>
 ofproto/pktbuf.c                |   10 +--<br>
 ofproto/pktbuf.h                |    4 +-<br>
 ofproto/tunnel.c                |   12 +--<br>
 ofproto/tunnel.h                |    8 +-<br>
 tests/test-bundle.c             |   16 ++--<br>
 tests/test-classifier.c         |   12 +--<br>
 tests/test-flows.c              |    5 +-<br>
 tests/test-odp.c                |    2 +-<br>
 utilities/ovs-dpctl.c           |   14 ++--<br>
 utilities/ovs-ofctl.c           |   19 +++--<br>
 vswitchd/bridge.c               |   52 +++++++-----<br>
 61 files changed, 867 insertions(+), 614 deletions(-)<br>
<br>
diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h<br>
index e890fd8..add1287 100644<br>
--- a/include/linux/openvswitch.h<br>
+++ b/include/linux/openvswitch.h<br>
@@ -116,7 +116,7 @@ struct ovs_vport_stats {<br>
 };<br>
<br>
 /* Fixed logical ports. */<br>
-#define OVSP_LOCAL      ((__u32)0)<br>
+#define OVSP_LOCAL      ((OVS_FORCE odp_port_t) 0)<br>
<br>
 /* Packet transfer. */<br>
<br>
diff --git a/include/openflow/openflow-1.0.h b/include/openflow/openflow-1.0.h<br>
index c30fa92..439cc91 100644<br>
--- a/include/openflow/openflow-1.0.h<br>
+++ b/include/openflow/openflow-1.0.h<br>
@@ -28,28 +28,40 @@<br>
  * 0xff00...0xfff7  &quot;reserved&quot; but not assigned a meaning by OpenFlow 1.0<br>
  * 0xfff8...0xffff  &quot;reserved&quot; OFPP_* ports with assigned meanings<br>
  */<br>
-enum ofp_port {<br>
-    /* Ranges. */<br>
-    OFPP_MAX        = 0xff00,   /* Maximum number of physical switch ports. */<br>
-    OFPP_FIRST_RESV = 0xfff8,   /* First assigned reserved port number. */<br>
-    OFPP_LAST_RESV  = 0xffff,   /* Last assigned reserved port number. */<br>
-<br>
-    /* Reserved output &quot;ports&quot;. */<br>
-    OFPP_IN_PORT    = 0xfff8,  /* Send the packet out the input port.  This<br>
-                                  virtual port must be explicitly used<br>
-                                  in order to send back out of the input<br>
-                                  port. */<br>
-    OFPP_TABLE      = 0xfff9,  /* Perform actions in flow table.<br>
-                                  NB: This can only be the destination<br>
-                                  port for packet-out messages. */<br>
-    OFPP_NORMAL     = 0xfffa,  /* Process with normal L2/L3 switching. */<br>
-    OFPP_FLOOD      = 0xfffb,  /* All physical ports except input port and<br>
-                                  those disabled by STP. */<br>
-    OFPP_ALL        = 0xfffc,  /* All physical ports except input port. */<br>
-    OFPP_CONTROLLER = 0xfffd,  /* Send to controller. */<br>
-    OFPP_LOCAL      = 0xfffe,  /* Local openflow &quot;port&quot;. */<br>
-    OFPP_NONE       = 0xffff   /* Not associated with a physical port. */<br>
-};<br>
+<br>
+/* Ranges. */<br>
+/* Maximum number of physical switch ports. */<br>
+#define OFPP_MAX        ((OVS_FORCE ofp_port_t) 0xff00)<br>
+<br>
+/* First assigned reserved port number. */<br>
+#define OFPP_FIRST_RESV ((OVS_FORCE ofp_port_t) 0xfff8)<br>
+<br>
+/* Last assigned reserved port number. */<br>
+#define OFPP_LAST_RESV  ((OVS_FORCE ofp_port_t) 0xffff)<br>
+<br>
+/* Reserved output &quot;ports&quot;. */<br>
+/* Send the packet out the input port.  This virtual port must be explicitly<br>
+ * used in order to send back out of the input port. */<br>
+#define OFPP_IN_PORT    ((OVS_FORCE ofp_port_t) 0xfff8)<br>
+<br>
+/* Perform actions in flow table. NB: This can only be the destination port<br>
+ * for packet-out messages. */<br>
+#define OFPP_TABLE      ((OVS_FORCE ofp_port_t) 0xfff9)<br>
+<br>
+/* Process with normal L2/L3 switching. */<br>
+#define OFPP_NORMAL     ((OVS_FORCE ofp_port_t) 0xfffa)<br>
+<br>
+/* All physical ports except input port and those disabled by STP. */<br>
+#define OFPP_FLOOD      ((OVS_FORCE ofp_port_t) 0xfffb)<br>
+<br>
+/* All physical ports except input port. */<br>
+#define OFPP_ALL        ((OVS_FORCE ofp_port_t) 0xfffc)<br>
+/* Send to controller. */<br>
+#define OFPP_CONTROLLER ((OVS_FORCE ofp_port_t) 0xfffd)<br>
+/* Local openflow &quot;port&quot;. */<br>
+#define OFPP_LOCAL      ((OVS_FORCE ofp_port_t) 0xfffe)<br>
+/* Not associated with a physical port. */<br>
+#define OFPP_NONE       ((OVS_FORCE ofp_port_t) 0xffff)<br>
<br>
 /* OpenFlow 1.0 specific capabilities supported by the datapath (struct<br>
  * ofp_switch_features, member capabilities). */<br>
diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h<br>
index ec94cee..6ed2400 100644<br>
--- a/include/openflow/openflow-1.1.h<br>
+++ b/include/openflow/openflow-1.1.h<br>
@@ -67,8 +67,8 @@<br>
  * an OpenFlow 1.0 reserved port number to or from, respectively, the<br>
  * corresponding OpenFlow 1.1 reserved port number.<br>
  */<br>
-#define OFPP11_MAX    0xffffff00<br>
-#define OFPP11_OFFSET (OFPP11_MAX - OFPP_MAX)<br>
+#define OFPP11_MAX    ((OVS_FORCE ofp11_port_t) 0xffffff00)<br>
+#define OFPP11_OFFSET 0xffff0000    /* OFPP11_MAX - OFPP_MAX */<br>
<br>
 /* Reserved wildcard port used only for flow mod (delete) and flow stats<br>
  * requests. Selects all flows regardless of output port<br>
diff --git a/include/openvswitch/types.h b/include/openvswitch/types.h<br>
index 72caa5c..7e1e59d 100644<br>
--- a/include/openvswitch/types.h<br>
+++ b/include/openvswitch/types.h<br>
@@ -60,4 +60,10 @@ typedef struct {<br>
         ovs_be32 hi, lo;<br>
 } ovs_32aligned_be64;<br>
<br>
+/* ofp_port_t represents the port number of a OpenFlow switch.<br>
+ * odp_port_t represents the port number on the datapath. */<br>
+typedef uint16_t OVS_BITWISE ofp_port_t;<br>
+typedef uint32_t OVS_BITWISE odp_port_t;<br>
+typedef uint32_t OVS_BITWISE ofp11_port_t;<br>
+<br>
 #endif /* openvswitch/types.h */<br>
diff --git a/lib/bundle.c b/lib/bundle.c<br>
index b3821e8..248f2af 100644<br>
--- a/lib/bundle.c<br>
+++ b/lib/bundle.c<br>
@@ -35,14 +35,14 @@<br>
<br>
 VLOG_DEFINE_THIS_MODULE(bundle);<br>
<br>
-static uint16_t<br>
+static ofp_port_t<br>
 execute_ab(const struct ofpact_bundle *bundle,<br>
-           bool (*slave_enabled)(uint16_t ofp_port, void *aux), void *aux)<br>
+           bool (*slave_enabled)(ofp_port_t ofp_port, void *aux), void *aux)<br>
 {<br>
     size_t i;<br>
<br>
     for (i = 0; i &lt; bundle-&gt;n_slaves; i++) {<br>
-        uint16_t slave = bundle-&gt;slaves[i];<br>
+        ofp_port_t slave = bundle-&gt;slaves[i];<br>
         if (slave_enabled(slave, aux)) {<br>
             return slave;<br>
         }<br>
@@ -51,10 +51,10 @@ execute_ab(const struct ofpact_bundle *bundle,<br>
     return OFPP_NONE;<br>
 }<br>
<br>
-static uint16_t<br>
+static ofp_port_t<br>
 execute_hrw(const struct ofpact_bundle *bundle,<br>
             const struct flow *flow, struct flow_wildcards *wc,<br>
-            bool (*slave_enabled)(uint16_t ofp_port, void *aux), void *aux)<br>
+            bool (*slave_enabled)(ofp_port_t ofp_port, void *aux), void *aux)<br>
 {<br>
     uint32_t flow_hash, best_hash;<br>
     int best, i;<br>
@@ -85,10 +85,10 @@ execute_hrw(const struct ofpact_bundle *bundle,<br>
  * calculate the result.  Uses &#39;slave_enabled&#39; to determine if the slave<br>
  * designated by &#39;ofp_port&#39; is up.  Returns the chosen slave, or<br>
  * OFPP_NONE if none of the slaves are acceptable. */<br>
-uint16_t<br>
+ofp_port_t<br>
 bundle_execute(const struct ofpact_bundle *bundle,<br>
                const struct flow *flow, struct flow_wildcards *wc,<br>
-               bool (*slave_enabled)(uint16_t ofp_port, void *aux), void *aux)<br>
+               bool (*slave_enabled)(ofp_port_t ofp_port, void *aux), void *aux)<br>
 {<br>
     switch (bundle-&gt;algorithm) {<br>
     case NX_BD_ALG_HRW:<br>
@@ -186,7 +186,7 @@ bundle_from_openflow(const struct nx_action_bundle *nab,<br>
 }<br>
<br>
 enum ofperr<br>
-bundle_check(const struct ofpact_bundle *bundle, int max_ports,<br>
+bundle_check(const struct ofpact_bundle *bundle, ofp_port_t max_ports,<br>
              const struct flow *flow)<br>
 {<br>
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);<br>
@@ -200,7 +200,7 @@ bundle_check(const struct ofpact_bundle *bundle, int max_ports,<br>
     }<br>
<br>
     for (i = 0; i &lt; bundle-&gt;n_slaves; i++) {<br>
-        uint16_t ofp_port = bundle-&gt;slaves[i];<br>
+        ofp_port_t ofp_port = bundle-&gt;slaves[i];<br>
         enum ofperr error;<br>
<br>
         error = ofputil_check_output_port(ofp_port, max_ports);<br>
@@ -246,7 +246,7 @@ bundle_to_nxast(const struct ofpact_bundle *bundle, struct ofpbuf *openflow)<br>
<br>
     slaves = ofpbuf_put_zeros(openflow, slaves_len);<br>
     for (i = 0; i &lt; bundle-&gt;n_slaves; i++) {<br>
-        slaves[i] = htons(bundle-&gt;slaves[i]);<br>
+        slaves[i] = ofp_htons(bundle-&gt;slaves[i]);<br>
     }<br>
 }<br>
<br>
@@ -271,7 +271,7 @@ bundle_parse__(const char *s, char **save_ptr,<br>
     bundle = ofpact_put_BUNDLE(ofpacts);<br>
<br>
     for (;;) {<br>
-        uint16_t slave_port;<br>
+        ofp_port_t slave_port;<br>
         char *slave;<br>
<br>
         slave = strtok_r(NULL, &quot;, []&quot;, save_ptr);<br>
diff --git a/lib/bundle.h b/lib/bundle.h<br>
index 2619aeb..3e92374 100644<br>
--- a/lib/bundle.h<br>
+++ b/lib/bundle.h<br>
@@ -35,13 +35,13 @@ struct ofpbuf;<br>
  *<br>
  * See include/openflow/nicira-ext.h for NXAST_BUNDLE specification. */<br>
<br>
-uint16_t bundle_execute(const struct ofpact_bundle *, const struct flow *,<br>
+ofp_port_t bundle_execute(const struct ofpact_bundle *, const struct flow *,<br>
                         struct flow_wildcards *wc,<br>
-                        bool (*slave_enabled)(uint16_t ofp_port, void *aux),<br>
+                        bool (*slave_enabled)(ofp_port_t ofp_port, void *aux),<br>
                         void *aux);<br>
 enum ofperr bundle_from_openflow(const struct nx_action_bundle *,<br>
                                  struct ofpbuf *ofpact);<br>
-enum ofperr bundle_check(const struct ofpact_bundle *, int max_ports,<br>
+enum ofperr bundle_check(const struct ofpact_bundle *, ofp_port_t max_ports,<br>
                          const struct flow *);<br>
 void bundle_to_nxast(const struct ofpact_bundle *, struct ofpbuf *of10);<br>
 void bundle_parse(const char *, struct ofpbuf *ofpacts);<br>
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c<br>
index 1383b58..f8302fc 100644<br>
--- a/lib/dpif-linux.c<br>
+++ b/lib/dpif-linux.c<br>
@@ -167,7 +167,7 @@ static int dpif_linux_init(void);<br>
 static void open_dpif(const struct dpif_linux_dp *, struct dpif **);<br>
 static bool dpif_linux_nln_parse(struct ofpbuf *, void *);<br>
 static void dpif_linux_port_changed(const void *vport, void *dpif);<br>
-static uint32_t dpif_linux_port_get_pid(const struct dpif *, uint32_t port_no);<br>
+static uint32_t dpif_linux_port_get_pid(const struct dpif *, odp_port_t port_no);<br>
<br>
 static void dpif_linux_vport_to_ofpbuf(const struct dpif_linux_vport *,<br>
                                        struct ofpbuf *);<br>
@@ -259,7 +259,7 @@ open_dpif(const struct dpif_linux_dp *dp, struct dpif **dpifp)<br>
 static void<br>
 destroy_channels(struct dpif_linux *dpif)<br>
 {<br>
-    int i;<br>
+    unsigned int i;<br>
<br>
     if (dpif-&gt;epoll_fd &lt; 0) {<br>
         return;<br>
@@ -278,7 +278,7 @@ destroy_channels(struct dpif_linux *dpif)<br>
         dpif_linux_vport_init(&amp;vport_request);<br>
         vport_request.cmd = OVS_VPORT_CMD_SET;<br>
         vport_request.dp_ifindex = dpif-&gt;dp_ifindex;<br>
-        vport_request.port_no = i;<br>
+        vport_request.port_no = uint_to_odp(i);<br>
         vport_request.upcall_pid = &amp;upcall_pid;<br>
         dpif_linux_vport_transact(&amp;vport_request, NULL, NULL);<br>
<br>
@@ -298,9 +298,10 @@ destroy_channels(struct dpif_linux *dpif)<br>
 }<br>
<br>
 static int<br>
-add_channel(struct dpif_linux *dpif, uint32_t port_no, struct nl_sock *sock)<br>
+add_channel(struct dpif_linux *dpif, odp_port_t port_no, struct nl_sock *sock)<br>
 {<br>
     struct epoll_event event;<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
<br>
     if (dpif-&gt;epoll_fd &lt; 0) {<br>
         return 0;<br>
@@ -308,9 +309,9 @@ add_channel(struct dpif_linux *dpif, uint32_t port_no, struct nl_sock *sock)<br>
<br>
     /* We assume that the datapath densely chooses port numbers, which<br>
      * can therefore be used as an index into an array of channels. */<br>
-    if (port_no &gt;= dpif-&gt;uc_array_size) {<br>
-        int new_size = port_no + 1;<br>
-        int i;<br>
+    if (port_idx &gt;= dpif-&gt;uc_array_size) {<br>
+        uint32_t new_size = port_idx + 1;<br>
+        uint32_t i;<br>
<br>
         if (new_size &gt; MAX_PORTS) {<br>
             VLOG_WARN_RL(&amp;error_rl, &quot;%s: datapath port %&quot;PRIu32&quot; too big&quot;,<br>
@@ -331,29 +332,31 @@ add_channel(struct dpif_linux *dpif, uint32_t port_no, struct nl_sock *sock)<br>
<br>
     memset(&amp;event, 0, sizeof event);<br>
     event.events = EPOLLIN;<br>
-    event.data.u32 = port_no;<br>
+    event.data.u32 = port_idx;<br>
     if (epoll_ctl(dpif-&gt;epoll_fd, EPOLL_CTL_ADD, nl_sock_fd(sock),<br>
                   &amp;event) &lt; 0) {<br>
         return errno;<br>
     }<br>
<br>
-    nl_sock_destroy(dpif-&gt;channels[port_no].sock);<br>
-    dpif-&gt;channels[port_no].sock = sock;<br>
-    dpif-&gt;channels[port_no].last_poll = LLONG_MIN;<br>
+    nl_sock_destroy(dpif-&gt;channels[port_idx].sock);<br>
+    dpif-&gt;channels[port_idx].sock = sock;<br>
+    dpif-&gt;channels[port_idx].last_poll = LLONG_MIN;<br>
<br>
     return 0;<br>
 }<br>
<br>
 static void<br>
-del_channel(struct dpif_linux *dpif, uint32_t port_no)<br>
+del_channel(struct dpif_linux *dpif, odp_port_t port_no)<br>
 {<br>
     struct dpif_channel *ch;<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
<br>
-    if (dpif-&gt;epoll_fd &lt; 0 || port_no &gt;= dpif-&gt;uc_array_size) {<br>
+    if (dpif-&gt;epoll_fd &lt; 0<br>
+        || port_idx &gt;= dpif-&gt;uc_array_size) {<br>
         return;<br>
     }<br>
<br>
-    ch = &amp;dpif-&gt;channels[port_no];<br>
+    ch = &amp;dpif-&gt;channels[port_idx];<br>
     if (!ch-&gt;sock) {<br>
         return;<br>
     }<br>
@@ -480,7 +483,7 @@ netdev_to_ovs_vport_type(const struct netdev *netdev)<br>
<br>
 static int<br>
 dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,<br>
-                    uint32_t *port_nop)<br>
+                    odp_port_t *port_nop)<br>
 {<br>
     struct dpif_linux *dpif = dpif_linux_cast(dpif_);<br>
     const struct netdev_tunnel_config *tnl_cfg;<br>
@@ -539,7 +542,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,<br>
         VLOG_DBG(&quot;%s: assigning port %&quot;PRIu32&quot; to netlink pid %&quot;PRIu32,<br>
                  dpif_name(dpif_), reply.port_no, upcall_pid);<br>
     } else {<br>
-        if (error == EBUSY &amp;&amp; *port_nop != UINT32_MAX) {<br>
+        if (error == EBUSY &amp;&amp; *port_nop != OVSP_NONE) {<br>
             VLOG_INFO(&quot;%s: requested port %&quot;PRIu32&quot; is in use&quot;,<br>
                       dpif_name(dpif_), *port_nop);<br>
         }<br>
@@ -571,7 +574,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,<br>
 }<br>
<br>
 static int<br>
-dpif_linux_port_del(struct dpif *dpif_, uint32_t port_no)<br>
+dpif_linux_port_del(struct dpif *dpif_, odp_port_t port_no)<br>
 {<br>
     struct dpif_linux *dpif = dpif_linux_cast(dpif_);<br>
     struct dpif_linux_vport vport;<br>
@@ -589,7 +592,7 @@ dpif_linux_port_del(struct dpif *dpif_, uint32_t port_no)<br>
 }<br>
<br>
 static int<br>
-dpif_linux_port_query__(const struct dpif *dpif, uint32_t port_no,<br>
+dpif_linux_port_query__(const struct dpif *dpif, odp_port_t port_no,<br>
                         const char *port_name, struct dpif_port *dpif_port)<br>
 {<br>
     struct dpif_linux_vport request;<br>
@@ -620,7 +623,7 @@ dpif_linux_port_query__(const struct dpif *dpif, uint32_t port_no,<br>
 }<br>
<br>
 static int<br>
-dpif_linux_port_query_by_number(const struct dpif *dpif, uint32_t port_no,<br>
+dpif_linux_port_query_by_number(const struct dpif *dpif, odp_port_t port_no,<br>
                                 struct dpif_port *dpif_port)<br>
 {<br>
     return dpif_linux_port_query__(dpif, port_no, NULL, dpif_port);<br>
@@ -633,23 +636,24 @@ dpif_linux_port_query_by_name(const struct dpif *dpif, const char *devname,<br>
     return dpif_linux_port_query__(dpif, 0, devname, dpif_port);<br>
 }<br>
<br>
-static int<br>
+static odp_port_t<br>
 dpif_linux_get_max_ports(const struct dpif *dpif OVS_UNUSED)<br>
 {<br>
-    return MAX_PORTS;<br>
+    return uint_to_odp(MAX_PORTS);<br>
 }<br>
<br>
 static uint32_t<br>
-dpif_linux_port_get_pid(const struct dpif *dpif_, uint32_t port_no)<br>
+dpif_linux_port_get_pid(const struct dpif *dpif_, odp_port_t port_no)<br>
 {<br>
     struct dpif_linux *dpif = dpif_linux_cast(dpif_);<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
<br>
     if (dpif-&gt;epoll_fd &lt; 0) {<br>
         return 0;<br>
     } else {<br>
         /* The UINT32_MAX &quot;reserved&quot; port number uses the &quot;ovs-system&quot;&#39;s<br>
          * channel, since it is not heavily loaded. */<br>
-        int idx = (port_no &gt;= dpif-&gt;uc_array_size) ? 0 : port_no;<br>
+        uint32_t idx = port_idx &gt;= dpif-&gt;uc_array_size ? 0 : port_idx;<br>
         return nl_sock_pid(dpif-&gt;channels[idx].sock);<br>
     }<br>
 }<br>
@@ -1553,7 +1557,8 @@ dpif_linux_vport_from_ofpbuf(struct dpif_linux_vport *vport,<br>
<br>
     vport-&gt;cmd = genl-&gt;cmd;<br>
     vport-&gt;dp_ifindex = ovs_header-&gt;dp_ifindex;<br>
-    vport-&gt;port_no = nl_attr_get_u32(a[OVS_VPORT_ATTR_PORT_NO]);<br>
+    vport-&gt;port_no = uint_to_odp(<br>
+                         nl_attr_get_u32(a[OVS_VPORT_ATTR_PORT_NO]));<br>
     vport-&gt;type = nl_attr_get_u32(a[OVS_VPORT_ATTR_TYPE]);<br>
     vport-&gt;name = nl_attr_get_string(a[OVS_VPORT_ATTR_NAME]);<br>
     if (a[OVS_VPORT_ATTR_UPCALL_PID]) {<br>
@@ -1583,8 +1588,9 @@ dpif_linux_vport_to_ofpbuf(const struct dpif_linux_vport *vport,<br>
     ovs_header = ofpbuf_put_uninit(buf, sizeof *ovs_header);<br>
     ovs_header-&gt;dp_ifindex = vport-&gt;dp_ifindex;<br>
<br>
-    if (vport-&gt;port_no != UINT32_MAX) {<br>
-        nl_msg_put_u32(buf, OVS_VPORT_ATTR_PORT_NO, vport-&gt;port_no);<br>
+    if (vport-&gt;port_no != OVSP_NONE) {<br>
+        nl_msg_put_u32(buf, OVS_VPORT_ATTR_PORT_NO,<br>
+                       odp_to_u32(vport-&gt;port_no));<br>
     }<br>
<br>
     if (vport-&gt;type != OVS_VPORT_TYPE_UNSPEC) {<br>
@@ -1615,7 +1621,7 @@ void<br>
 dpif_linux_vport_init(struct dpif_linux_vport *vport)<br>
 {<br>
     memset(vport, 0, sizeof *vport);<br>
-    vport-&gt;port_no = UINT32_MAX;<br>
+    vport-&gt;port_no = OVSP_NONE;<br>
 }<br>
<br>
 /* Executes &#39;request&#39; in the kernel datapath.  If the command fails, returns a<br>
diff --git a/lib/dpif-linux.h b/lib/dpif-linux.h<br>
index 81062aa..492e543 100644<br>
--- a/lib/dpif-linux.h<br>
+++ b/lib/dpif-linux.h<br>
@@ -22,6 +22,8 @@<br>
 #include &lt;stdint.h&gt;<br>
 #include &lt;linux/openvswitch.h&gt;<br>
<br>
+#include &quot;flow.h&quot;<br>
+<br>
 struct ofpbuf;<br>
<br>
 struct dpif_linux_vport {<br>
@@ -30,7 +32,7 @@ struct dpif_linux_vport {<br>
<br>
     /* ovs_vport header. */<br>
     int dp_ifindex;<br>
-    uint32_t port_no;                      /* UINT32_MAX if unknown. */<br>
+    odp_port_t port_no;                    /* OVSP_NONE if unknown. */<br>
     enum ovs_vport_type type;<br>
<br>
     /* Attributes.<br>
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c<br>
index 52aedb6..58435d7 100644<br>
--- a/lib/dpif-netdev.c<br>
+++ b/lib/dpif-netdev.c<br>
@@ -104,7 +104,7 @@ struct dp_netdev {<br>
<br>
 /* A port in a netdev-based datapath. */<br>
 struct dp_netdev_port {<br>
-    int port_no;                /* Index into dp_netdev&#39;s &#39;ports&#39;. */<br>
+    odp_port_t port_no;         /* Index into dp_netdev&#39;s &#39;ports&#39;. */<br>
     struct list node;           /* Element in dp_netdev&#39;s &#39;port_list&#39;. */<br>
     struct netdev *netdev;<br>
     struct netdev_saved_flags *sf;<br>
@@ -141,15 +141,15 @@ static struct shash dp_netdevs = SHASH_INITIALIZER(&amp;dp_netdevs);<br>
 /* Maximum port MTU seen so far. */<br>
 static int max_mtu = ETH_PAYLOAD_MAX;<br>
<br>
-static int get_port_by_number(struct dp_netdev *, uint32_t port_no,<br>
+static int get_port_by_number(struct dp_netdev *, odp_port_t port_no,<br>
                               struct dp_netdev_port **portp);<br>
 static int get_port_by_name(struct dp_netdev *, const char *devname,<br>
                             struct dp_netdev_port **portp);<br>
 static void dp_netdev_free(struct dp_netdev *);<br>
 static void dp_netdev_flow_flush(struct dp_netdev *);<br>
 static int do_add_port(struct dp_netdev *, const char *devname,<br>
-                       const char *type, uint32_t port_no);<br>
-static int do_del_port(struct dp_netdev *, uint32_t port_no);<br>
+                       const char *type, odp_port_t port_no);<br>
+static int do_del_port(struct dp_netdev *, odp_port_t port_no);<br>
 static int dpif_netdev_open(const struct dpif_class *, const char *name,<br>
                             bool create, struct dpif **);<br>
 static int dp_netdev_output_userspace(struct dp_netdev *, const struct ofpbuf *,<br>
@@ -218,10 +218,12 @@ create_dpif_netdev(struct dp_netdev *dp)<br>
     return &amp;dpif-&gt;dpif;<br>
 }<br>
<br>
-static int<br>
+/* Choose an unused, non-zero port number and return it on success.<br>
+ * Return 0 on failure. */<br>
+static uint32_t<br>
 choose_port(struct dp_netdev *dp, const char *name)<br>
 {<br>
-    int port_no;<br>
+    uint32_t port_no;<br>
<br>
     if (dp-&gt;class != &amp;dpif_netdev_class) {<br>
         const char *p;<br>
@@ -254,7 +256,7 @@ choose_port(struct dp_netdev *dp, const char *name)<br>
         }<br>
     }<br>
<br>
-    return -1;<br>
+    return 0;<br>
 }<br>
<br>
 static int<br>
@@ -379,13 +381,14 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats)<br>
<br>
 static int<br>
 do_add_port(struct dp_netdev *dp, const char *devname, const char *type,<br>
-            uint32_t port_no)<br>
+            odp_port_t port_no)<br>
 {<br>
     struct netdev_saved_flags *sf;<br>
     struct dp_netdev_port *port;<br>
     struct netdev *netdev;<br>
     struct netdev_rx *rx;<br>
     const char *open_type;<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
     int mtu;<br>
     int error;<br>
<br>
@@ -429,7 +432,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,<br>
     }<br>
<br>
     list_push_back(&amp;dp-&gt;port_list, &amp;port-&gt;node);<br>
-    dp-&gt;ports[port_no] = port;<br>
+    dp-&gt;ports[port_idx] = port;<br>
     dp-&gt;serial++;<br>
<br>
     return 0;<br>
@@ -437,53 +440,56 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,<br>
<br>
 static int<br>
 dpif_netdev_port_add(struct dpif *dpif, struct netdev *netdev,<br>
-                     uint32_t *port_nop)<br>
+                     odp_port_t *port_nop)<br>
 {<br>
     struct dp_netdev *dp = get_dp_netdev(dpif);<br>
     char namebuf[NETDEV_VPORT_NAME_BUFSIZE];<br>
     const char *dpif_port;<br>
-    int port_no;<br>
+    uint32_t port_no = odp_to_u32(*port_nop);<br>
<br>
     dpif_port = netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf);<br>
-    if (*port_nop != UINT32_MAX) {<br>
-        if (*port_nop &gt;= MAX_PORTS) {<br>
+    if (port_no != UINT32_MAX) {<br>
+        if (port_no &gt;= MAX_PORTS) {<br>
             return EFBIG;<br>
-        } else if (dp-&gt;ports[*port_nop]) {<br>
+        } else if (dp-&gt;ports[port_no]) {<br>
             return EBUSY;<br>
         }<br>
-        port_no = *port_nop;<br>
     } else {<br>
         port_no = choose_port(dp, dpif_port);<br>
     }<br>
     if (port_no &gt;= 0) {<br>
-        *port_nop = port_no;<br>
-        return do_add_port(dp, dpif_port, netdev_get_type(netdev), port_no);<br>
+        *port_nop = uint_to_odp(port_no);<br>
+        return do_add_port(dp, dpif_port, netdev_get_type(netdev), *port_nop);<br>
     }<br>
     return EFBIG;<br>
 }<br>
<br>
 static int<br>
-dpif_netdev_port_del(struct dpif *dpif, uint32_t port_no)<br>
+dpif_netdev_port_del(struct dpif *dpif, odp_port_t port_no)<br>
 {<br>
     struct dp_netdev *dp = get_dp_netdev(dpif);<br>
-    return port_no == OVSP_LOCAL ? EINVAL : do_del_port(dp, port_no);<br>
+    return (port_no == OVSP_LOCAL ?<br>
+                       EINVAL : do_del_port(dp, port_no));<br>
 }<br>
<br>
 static bool<br>
-is_valid_port_number(uint32_t port_no)<br>
+is_valid_port_number(odp_port_t port_no)<br>
 {<br>
-    return port_no &lt; MAX_PORTS;<br>
+    uint32_t port_no_ = odp_to_u32(port_no);<br>
+    return port_no_ &lt; MAX_PORTS;<br>
 }<br>
<br>
 static int<br>
 get_port_by_number(struct dp_netdev *dp,<br>
-                   uint32_t port_no, struct dp_netdev_port **portp)<br>
+                   odp_port_t port_no, struct dp_netdev_port **portp)<br>
 {<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
+<br>
     if (!is_valid_port_number(port_no)) {<br>
         *portp = NULL;<br>
         return EINVAL;<br>
     } else {<br>
-        *portp = dp-&gt;ports[port_no];<br>
+        *portp = dp-&gt;ports[port_idx];<br>
         return *portp ? 0 : ENOENT;<br>
     }<br>
 }<br>
@@ -504,9 +510,10 @@ get_port_by_name(struct dp_netdev *dp,<br>
 }<br>
<br>
 static int<br>
-do_del_port(struct dp_netdev *dp, uint32_t port_no)<br>
+do_del_port(struct dp_netdev *dp, odp_port_t port_no)<br>
 {<br>
     struct dp_netdev_port *port;<br>
+    uint32_t port_idx = odp_to_u32(port_no);<br>
     int error;<br>
<br>
     error = get_port_by_number(dp, port_no, &amp;port);<br>
@@ -515,7 +522,7 @@ do_del_port(struct dp_netdev *dp, uint32_t port_no)<br>
     }<br>
<br>
     list_remove(&amp;port-&gt;node);<br>
-    dp-&gt;ports[port-&gt;port_no] = NULL;<br>
+    dp-&gt;ports[port_idx] = NULL;<br>
     dp-&gt;serial++;<br>
<br>
     netdev_close(port-&gt;netdev);<br>
@@ -537,7 +544,7 @@ answer_port_query(const struct dp_netdev_port *port,<br>
 }<br>
<br>
 static int<br>
-dpif_netdev_port_query_by_number(const struct dpif *dpif, uint32_t port_no,<br>
+dpif_netdev_port_query_by_number(const struct dpif *dpif, odp_port_t port_no,<br>
                                  struct dpif_port *dpif_port)<br>
 {<br>
     struct dp_netdev *dp = get_dp_netdev(dpif);<br>
@@ -566,10 +573,10 @@ dpif_netdev_port_query_by_name(const struct dpif *dpif, const char *devname,<br>
     return error;<br>
 }<br>
<br>
-static int<br>
+static odp_port_t<br>
 dpif_netdev_get_max_ports(const struct dpif *dpif OVS_UNUSED)<br>
 {<br>
-    return MAX_PORTS;<br>
+    return uint_to_odp(MAX_PORTS);<br>
 }<br>
<br>
 static void<br>
@@ -599,7 +606,7 @@ dpif_netdev_flow_flush(struct dpif *dpif)<br>
 }<br>
<br>
 struct dp_netdev_port_state {<br>
-    uint32_t port_no;<br>
+    odp_port_t port_no;<br>
     char *name;<br>
 };<br>
<br>
@@ -616,17 +623,18 @@ dpif_netdev_port_dump_next(const struct dpif *dpif, void *state_,<br>
 {<br>
     struct dp_netdev_port_state *state = state_;<br>
     struct dp_netdev *dp = get_dp_netdev(dpif);<br>
-    uint32_t port_no;<br>
+    uint32_t port_idx;<br>
<br>
-    for (port_no = state-&gt;port_no; port_no &lt; MAX_PORTS; port_no++) {<br>
-        struct dp_netdev_port *port = dp-&gt;ports[port_no];<br>
+    for (port_idx = odp_to_u32(state-&gt;port_no);<br>
+         port_idx &lt; MAX_PORTS; port_idx++) {<br>
+        struct dp_netdev_port *port = dp-&gt;ports[port_idx];<br>
         if (port) {<br>
             free(state-&gt;name);<br>
             state-&gt;name = xstrdup(netdev_get_name(port-&gt;netdev));<br>
             dpif_port-&gt;name = state-&gt;name;<br>
             dpif_port-&gt;type = port-&gt;type;<br>
             dpif_port-&gt;port_no = port-&gt;port_no;<br>
-            state-&gt;port_no = port_no + 1;<br>
+            state-&gt;port_no = uint_to_odp(port_idx + 1);<br>
             return 0;<br>
         }<br>
     }<br>
@@ -708,9 +716,7 @@ dpif_netdev_flow_from_nlattrs(const struct nlattr *key, uint32_t key_len,<br>
         return EINVAL;<br>
     }<br>
<br>
-    if (flow-&gt;in_port &lt; OFPP_MAX<br>
-        ? flow-&gt;in_port &gt;= MAX_PORTS<br>
-        : flow-&gt;in_port != OFPP_LOCAL &amp;&amp; flow-&gt;in_port != OFPP_NONE) {<br>
+    if (flow-&gt;in_port.port32 &gt;= MAX_PORTS) {<br>
         return EINVAL;<br>
     }<br>
<br>
@@ -898,7 +904,7 @@ dpif_netdev_flow_dump_next(const struct dpif *dpif, void *state_,<br>
         struct ofpbuf buf;<br>
<br>
         ofpbuf_use_stack(&amp;buf, &amp;state-&gt;keybuf, sizeof state-&gt;keybuf);<br>
-        odp_flow_key_from_flow(&amp;buf, &amp;flow-&gt;key, flow-&gt;key.in_port);<br>
+        odp_flow_key_from_flow(&amp;buf, &amp;flow-&gt;key, flow-&gt;key.in_port.odp_port);<br>
<br>
         *key = buf.data;<br>
         *key_len = buf.size;<br>
@@ -948,7 +954,7 @@ dpif_netdev_execute(struct dpif *dpif, const struct dpif_execute *execute)<br>
     ofpbuf_reserve(&amp;copy, DP_NETDEV_HEADROOM);<br>
     ofpbuf_put(&amp;copy, execute-&gt;packet-&gt;data, execute-&gt;packet-&gt;size);<br>
<br>
-    flow_extract(&amp;copy, 0, 0, NULL, -1, &amp;key);<br>
+    flow_extract(&amp;copy, 0, 0, NULL, NULL, &amp;key);<br>
     error = dpif_netdev_flow_from_nlattrs(execute-&gt;key, execute-&gt;key_len,<br>
                                           &amp;key);<br>
     if (!error) {<br>
@@ -1043,11 +1049,13 @@ dp_netdev_port_input(struct dp_netdev *dp, struct dp_netdev_port *port,<br>
 {<br>
     struct dp_netdev_flow *flow;<br>
     struct flow key;<br>
+    union flow_in_port in_port_;<br>
<br>
     if (packet-&gt;size &lt; ETH_HEADER_LEN) {<br>
         return;<br>
     }<br>
-    flow_extract(packet, skb_priority, skb_mark, tnl, port-&gt;port_no, &amp;key);<br>
+    in_port_.odp_port = port-&gt;port_no;<br>
+    flow_extract(packet, skb_priority, skb_mark, tnl, &amp;in_port_, &amp;key);<br>
     flow = dp_netdev_lookup_flow(dp, &amp;key);<br>
     if (flow) {<br>
         dp_netdev_flow_used(flow, packet);<br>
@@ -1134,7 +1142,7 @@ dp_netdev_output_userspace(struct dp_netdev *dp, const struct ofpbuf *packet,<br>
         ofpbuf_init(buf, buf_size);<br>
<br>
         /* Put ODP flow. */<br>
-        odp_flow_key_from_flow(buf, flow, flow-&gt;in_port);<br>
+        odp_flow_key_from_flow(buf, flow, flow-&gt;in_port.odp_port);<br>
         upcall-&gt;key = buf-&gt;data;<br>
         upcall-&gt;key_len = buf-&gt;size;<br>
<br>
diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h<br>
index bea822f..6af6733 100644<br>
--- a/lib/dpif-provider.h<br>
+++ b/lib/dpif-provider.h<br>
@@ -127,10 +127,10 @@ struct dpif_class {<br>
      * port number.  Returns EBUSY if caller attempted to choose a port<br>
      * number, and it was in use. */<br>
     int (*port_add)(struct dpif *dpif, struct netdev *netdev,<br>
-                    uint32_t *port_no);<br>
+                    odp_port_t *port_no);<br>
<br>
     /* Removes port numbered &#39;port_no&#39; from &#39;dpif&#39;. */<br>
-    int (*port_del)(struct dpif *dpif, uint32_t port_no);<br>
+    int (*port_del)(struct dpif *dpif, odp_port_t port_no);<br>
<br>
     /* Queries &#39;dpif&#39; for a port with the given &#39;port_no&#39; or &#39;devname&#39;.<br>
      * If &#39;port&#39; is not null, stores information about the port into<br>
@@ -139,14 +139,14 @@ struct dpif_class {<br>
      * If &#39;port&#39; is not null, the caller takes ownership of data in<br>
      * &#39;port&#39; and must free it with dpif_port_destroy() when it is no<br>
      * longer needed. */<br>
-    int (*port_query_by_number)(const struct dpif *dpif, uint32_t port_no,<br>
+    int (*port_query_by_number)(const struct dpif *dpif, odp_port_t port_no,<br>
                                 struct dpif_port *port);<br>
     int (*port_query_by_name)(const struct dpif *dpif, const char *devname,<br>
                               struct dpif_port *port);<br>
<br>
     /* Returns one greater than the largest port number accepted in flow<br>
      * actions. */<br>
-    int (*get_max_ports)(const struct dpif *dpif);<br>
+    odp_port_t (*get_max_ports)(const struct dpif *dpif);<br>
<br>
     /* Returns the Netlink PID value to supply in OVS_ACTION_ATTR_USERSPACE<br>
      * actions as the OVS_USERSPACE_ATTR_PID attribute&#39;s value, for use in<br>
@@ -162,7 +162,7 @@ struct dpif_class {<br>
      *<br>
      * A dpif provider that doesn&#39;t have meaningful Netlink PIDs can use NULL<br>
      * for this function.  This is equivalent to always returning 0. */<br>
-    uint32_t (*port_get_pid)(const struct dpif *dpif, uint32_t port_no);<br>
+    uint32_t (*port_get_pid)(const struct dpif *dpif, odp_port_t port_no);<br>
<br>
     /* Attempts to begin dumping the ports in a dpif.  On success, returns 0<br>
      * and initializes &#39;*statep&#39; with any data needed for iteration.  On<br>
diff --git a/lib/dpif.c b/lib/dpif.c<br>
index 6aa52d5..0b616b0 100644<br>
--- a/lib/dpif.c<br>
+++ b/lib/dpif.c<br>
@@ -434,18 +434,18 @@ dpif_port_open_type(const char *datapath_type, const char *port_type)<br>
 }<br>
<br>
 /* Attempts to add &#39;netdev&#39; as a port on &#39;dpif&#39;.  If &#39;port_nop&#39; is<br>
- * non-null and its value is not UINT32_MAX, then attempts to use the<br>
+ * non-null and its value is not OVSP_NONE, then attempts to use the<br>
  * value as the port number.<br>
  *<br>
  * If successful, returns 0 and sets &#39;*port_nop&#39; to the new port&#39;s port<br>
  * number (if &#39;port_nop&#39; is non-null).  On failure, returns a positive<br>
- * errno value and sets &#39;*port_nop&#39; to UINT32_MAX (if &#39;port_nop&#39; is<br>
+ * errno value and sets &#39;*port_nop&#39; to OVSP_NONE (if &#39;port_nop&#39; is<br>
  * non-null). */<br>
 int<br>
-dpif_port_add(struct dpif *dpif, struct netdev *netdev, uint32_t *port_nop)<br>
+dpif_port_add(struct dpif *dpif, struct netdev *netdev, odp_port_t *port_nop)<br>
 {<br>
     const char *netdev_name = netdev_get_name(netdev);<br>
-    uint32_t port_no = UINT32_MAX;<br>
+    odp_port_t port_no = OVSP_NONE;<br>
     int error;<br>
<br>
     COVERAGE_INC(dpif_port_add);<br>
@@ -461,7 +461,7 @@ dpif_port_add(struct dpif *dpif, struct netdev *netdev, uint32_t *port_nop)<br>
     } else {<br>
         VLOG_WARN_RL(&amp;error_rl, &quot;%s: failed to add %s as port: %s&quot;,<br>
                      dpif_name(dpif), netdev_name, strerror(error));<br>
-        port_no = UINT32_MAX;<br>
+        port_no = OVSP_NONE;<br>
     }<br>
     if (port_nop) {<br>
         *port_nop = port_no;<br>
@@ -472,7 +472,7 @@ dpif_port_add(struct dpif *dpif, struct netdev *netdev, uint32_t *port_nop)<br>
 /* Attempts to remove &#39;dpif&#39;&#39;s port number &#39;port_no&#39;.  Returns 0 if successful,<br>
  * otherwise a positive errno value. */<br>
 int<br>
-dpif_port_del(struct dpif *dpif, uint32_t port_no)<br>
+dpif_port_del(struct dpif *dpif, odp_port_t port_no)<br>
 {<br>
     int error;<br>
<br>
@@ -530,7 +530,7 @@ dpif_port_exists(const struct dpif *dpif, const char *devname)<br>
  * The caller owns the data in &#39;port&#39; and must free it with<br>
  * dpif_port_destroy() when it is no longer needed. */<br>
 int<br>
-dpif_port_query_by_number(const struct dpif *dpif, uint32_t port_no,<br>
+dpif_port_query_by_number(const struct dpif *dpif, odp_port_t port_no,<br>
                           struct dpif_port *port)<br>
 {<br>
     int error = dpif-&gt;dpif_class-&gt;port_query_by_number(dpif, port_no, port);<br>
@@ -576,7 +576,7 @@ dpif_port_query_by_name(const struct dpif *dpif, const char *devname,<br>
<br>
 /* Returns one greater than the maximum port number accepted in flow<br>
  * actions. */<br>
-int<br>
+odp_port_t<br>
 dpif_get_max_ports(const struct dpif *dpif)<br>
 {<br>
     return dpif-&gt;dpif_class-&gt;get_max_ports(dpif);<br>
@@ -586,7 +586,7 @@ dpif_get_max_ports(const struct dpif *dpif)<br>
  * as the OVS_USERSPACE_ATTR_PID attribute&#39;s value, for use in flows whose<br>
  * packets arrived on port &#39;port_no&#39;.<br>
  *<br>
- * A &#39;port_no&#39; of UINT32_MAX is a special case: it returns a reserved PID, not<br>
+ * A &#39;port_no&#39; of OVSP_NONE is a special case: it returns a reserved PID, not<br>
  * allocated to any port, that the client may use for special purposes.<br>
  *<br>
  * The return value is only meaningful when DPIF_UC_ACTION has been enabled in<br>
@@ -595,7 +595,7 @@ dpif_get_max_ports(const struct dpif *dpif)<br>
  * update all of the flows that it installed that contain<br>
  * OVS_ACTION_ATTR_USERSPACE actions. */<br>
 uint32_t<br>
-dpif_port_get_pid(const struct dpif *dpif, uint32_t port_no)<br>
+dpif_port_get_pid(const struct dpif *dpif, odp_port_t port_no)<br>
 {<br>
     return (dpif-&gt;dpif_class-&gt;port_get_pid<br>
             ? (dpif-&gt;dpif_class-&gt;port_get_pid)(dpif, port_no)<br>
@@ -607,7 +607,7 @@ dpif_port_get_pid(const struct dpif *dpif, uint32_t port_no)<br>
  * result is null-terminated.  On failure, returns a positive errno value and<br>
  * makes &#39;name&#39; the empty string. */<br>
 int<br>
-dpif_port_get_name(struct dpif *dpif, uint32_t port_no,<br>
+dpif_port_get_name(struct dpif *dpif, odp_port_t port_no,<br>
                    char *name, size_t name_size)<br>
 {<br>
     struct dpif_port port;<br>
diff --git a/lib/dpif.h b/lib/dpif.h<br>
index fd05b2f..12e5ad0 100644<br>
--- a/lib/dpif.h<br>
+++ b/lib/dpif.h<br>
@@ -377,8 +377,8 @@ int dpif_get_dp_stats(const struct dpif *, struct dpif_dp_stats *);<br>
<br>
 const char *dpif_port_open_type(const char *datapath_type,<br>
                                 const char *port_type);<br>
-int dpif_port_add(struct dpif *, struct netdev *, uint32_t *port_nop);<br>
-int dpif_port_del(struct dpif *, uint32_t port_no);<br>
+int dpif_port_add(struct dpif *, struct netdev *, odp_port_t *port_nop);<br>
+int dpif_port_del(struct dpif *, odp_port_t port_no);<br>
<br>
 /* A port within a datapath.<br>
  *<br>
@@ -386,19 +386,19 @@ int dpif_port_del(struct dpif *, uint32_t port_no);<br>
 struct dpif_port {<br>
     char *name;                 /* Network device name, e.g. &quot;eth0&quot;. */<br>
     char *type;                 /* Network device type, e.g. &quot;system&quot;. */<br>
-    uint32_t port_no;           /* Port number within datapath. */<br>
+    odp_port_t port_no;         /* Port number within datapath. */<br>
 };<br>
 void dpif_port_clone(struct dpif_port *, const struct dpif_port *);<br>
 void dpif_port_destroy(struct dpif_port *);<br>
 bool dpif_port_exists(const struct dpif *dpif, const char *devname);<br>
-int dpif_port_query_by_number(const struct dpif *, uint32_t port_no,<br>
+int dpif_port_query_by_number(const struct dpif *, odp_port_t port_no,<br>
                               struct dpif_port *);<br>
 int dpif_port_query_by_name(const struct dpif *, const char *devname,<br>
                             struct dpif_port *);<br>
-int dpif_port_get_name(struct dpif *, uint32_t port_no,<br>
+int dpif_port_get_name(struct dpif *, odp_port_t port_no,<br>
                        char *name, size_t name_size);<br>
-int dpif_get_max_ports(const struct dpif *);<br>
-uint32_t dpif_port_get_pid(const struct dpif *, uint32_t port_no);<br>
+odp_port_t dpif_get_max_ports(const struct dpif *);<br>
+uint32_t dpif_port_get_pid(const struct dpif *, odp_port_t port_no);<br>
<br>
 struct dpif_port_dump {<br>
     const struct dpif *dpif;<br>
diff --git a/lib/flow.c b/lib/flow.c<br>
index d38e3ab..cbb32c2 100644<br>
--- a/lib/flow.c<br>
+++ b/lib/flow.c<br>
@@ -337,7 +337,7 @@ invalid:<br>
 }<br>
<br>
 /* Initializes &#39;flow&#39; members from &#39;packet&#39;, &#39;skb_priority&#39;, &#39;tnl&#39;, and<br>
- * &#39;ofp_in_port&#39;.<br>
+ * &#39;in_port&#39;.<br>
  *<br>
  * Initializes &#39;packet&#39; header pointers as follows:<br>
  *<br>
@@ -357,7 +357,7 @@ invalid:<br>
  */<br>
 void<br>
 flow_extract(struct ofpbuf *packet, uint32_t skb_priority, uint32_t skb_mark,<br>
-             const struct flow_tnl *tnl, uint16_t ofp_in_port,<br>
+             const struct flow_tnl *tnl, const union flow_in_port *in_port,<br>
              struct flow *flow)<br>
 {<br>
     struct ofpbuf b = *packet;<br>
@@ -371,7 +371,7 @@ flow_extract(struct ofpbuf *packet, uint32_t skb_priority, uint32_t skb_mark,<br>
         ovs_assert(tnl != &amp;flow-&gt;tunnel);<br>
         flow-&gt;tunnel = *tnl;<br>
     }<br>
-    flow-&gt;in_port = ofp_in_port;<br>
+    flow-&gt;in_port = in_port ? *in_port : flow-&gt;in_port;<br>
     flow-&gt;skb_priority = skb_priority;<br>
     flow-&gt;skb_mark = skb_mark;<br>
<br>
@@ -498,7 +498,7 @@ flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)<br>
     fmd-&gt;tun_dst = flow-&gt;tunnel.ip_dst;<br>
     fmd-&gt;metadata = flow-&gt;metadata;<br>
     memcpy(fmd-&gt;regs, flow-&gt;regs, sizeof fmd-&gt;regs);<br>
-    fmd-&gt;in_port = flow-&gt;in_port;<br>
+    fmd-&gt;in_port = flow-&gt;in_port.ofp_port;<br>
 }<br>
<br>
 char *<br>
diff --git a/lib/flow.h b/lib/flow.h<br>
index b07b9ed..081dd5a 100644<br>
--- a/lib/flow.h<br>
+++ b/lib/flow.h<br>
@@ -68,6 +68,13 @@ struct flow_tnl {<br>
     uint8_t ip_ttl;<br>
 };<br>
<br>
+union flow_in_port {           /* Input port union. The port can be either */<br>
+    ofp_port_t   ofp_port;     /* OpenFlow port number or the datapath port */<br>
+    odp_port_t   odp_port;     /* number. */<br>
+    ofp11_port_t ofp11_port;   /* For the OpenFlow-1.1 or above protocols. */<br>
+    uint32_t     port32;       /* For using in arithmetic opertions */<br>
+};<br>
+<br>
 /*<br>
 * A flow in the network.<br>
 *<br>
@@ -82,14 +89,12 @@ struct flow {<br>
     struct in6_addr ipv6_src;   /* IPv6 source address. */<br>
     struct in6_addr ipv6_dst;   /* IPv6 destination address. */<br>
     struct in6_addr nd_target;  /* IPv6 neighbor discovery (ND) target. */<br>
+    union flow_in_port in_port; /* Input port union.*/<br>
     uint32_t skb_priority;      /* Packet priority for QoS. */<br>
     uint32_t regs[FLOW_N_REGS]; /* Registers. */<br>
     ovs_be32 nw_src;            /* IPv4 source address. */<br>
     ovs_be32 nw_dst;            /* IPv4 destination address. */<br>
     ovs_be32 ipv6_label;        /* IPv6 flow label. */<br>
-    uint32_t in_port;           /* Input port. OpenFlow port number<br>
-                                   unless in DPIF code, in which case it<br>
-                                   is the datapath port number. */<br>
     uint32_t skb_mark;          /* Packet mark. */<br>
     ovs_be32 mpls_lse;          /* MPLS label stack entry. */<br>
     uint16_t mpls_depth;        /* Depth of MPLS stack. */<br>
@@ -122,11 +127,12 @@ struct flow_metadata {<br>
     ovs_be32 tun_dst;                /* Tunnel outer IPv4 dst addr */<br>
     ovs_be64 metadata;               /* OpenFlow 1.1+ metadata field. */<br>
     uint32_t regs[FLOW_N_REGS];      /* Registers. */<br>
-    uint16_t in_port;                /* OpenFlow port or zero. */<br>
+    ofp_port_t in_port;              /* OpenFlow port or zero. */<br>
 };<br>
<br>
 void flow_extract(struct ofpbuf *, uint32_t priority, uint32_t mark,<br>
-                  const struct flow_tnl *, uint16_t in_port, struct flow *);<br>
+                  const struct flow_tnl *, const union flow_in_port *in_port,<br>
+                  struct flow *);<br>
<br>
 void flow_zero_wildcards(struct flow *, const struct flow_wildcards *);<br>
 void flow_get_metadata(const struct flow *, struct flow_metadata *);<br>
@@ -170,6 +176,167 @@ flow_hash(const struct flow *flow, uint32_t basis)<br>
     return hash_words((const uint32_t *) flow, sizeof *flow / 4, basis);<br>
 }<br>
<br>
+/* ofp/odp port related utility functions. */<br>
+static inline uint16_t ofp_to_u16(const ofp_port_t ofp_port);<br>
+static inline uint32_t odp_to_u32(const odp_port_t odp_port);<br>
+static inline uint32_t ofp11_to_u32(const ofp11_port_t ofp11_port);<br>
+static inline ofp_port_t uint_to_ofp(const unsigned int port);<br>
+static inline odp_port_t uint_to_odp(const unsigned int port);<br>
+static inline ofp11_port_t uint_to_ofp11(const unsigned int port);<br>
+<br>
+static inline ovs_be16 ofp_htons(ofp_port_t ofp_port);<br>
+static inline ovs_be32 odp_htonl(odp_port_t odp_port);<br>
+static inline ovs_be32 ofp11_htonl(ofp11_port_t ofp11_port);<br>
+static inline ofp_port_t ofp_ntohs(ovs_be16 netshort);<br>
+static inline odp_port_t odp_ntohl(ovs_be32 netlong);<br>
+static inline ofp11_port_t ofp11_ntohl(ovs_be32 netlong);<br>
+<br>
+static inline uint32_t hash_ofp_port(ofp_port_t ofp_port,<br>
+                                     uint32_t basis);<br>
+static inline uint32_t hash_odp_port(odp_port_t odp_port_t,<br>
+                                     uint32_t basis);<br>
+static inline uint32_t hash_ofp11_port(ofp11_port_t ofp11_port,<br>
+                                       uint32_t basis);<br>
+<br>
+static inline void ofp_port_increment(ofp_port_t *ofp_portp,<br>
+                                      uint16_t incr);<br>
+static inline void odp_port_increment(odp_port_t *odp_portp,<br>
+                                      uint32_t incr);<br>
+<br>
+static inline int ofp11_port_to_ofp_port(ofp11_port_t ofp11_port,<br>
+                                         ofp_port_t *ofp_portp);<br>
+static inline void ofp_port_to_ofp11_port(ofp_port_t ofp_port,<br>
+                                          ofp11_port_t *ofp11_portp);<br>
+<br>
+static inline uint16_t<br>
+ofp_to_u16(const ofp_port_t ofp_port)<br>
+{<br>
+    return (OVS_FORCE uint16_t) ofp_port;<br>
+}<br>
+<br>
+static inline uint32_t<br>
+odp_to_u32(const odp_port_t odp_port)<br>
+{<br>
+    return (OVS_FORCE uint32_t) odp_port;<br>
+}<br>
+<br>
+static inline uint32_t<br>
+ofp11_to_u32(const ofp11_port_t ofp11_port)<br>
+{<br>
+    return (OVS_FORCE uint32_t) ofp11_port;<br>
+}<br>
+<br>
+static inline ofp_port_t<br>
+uint_to_ofp(const unsigned int port)<br>
+{<br>
+    return (OVS_FORCE ofp_port_t) port;<br>
+}<br>
+<br>
+static inline odp_port_t<br>
+uint_to_odp(const unsigned int port)<br>
+{<br>
+    return (OVS_FORCE odp_port_t) port;<br>
+}<br>
+<br>
+static inline ofp11_port_t<br>
+uint_to_ofp11(const unsigned int port)<br>
+{<br>
+    return (OVS_FORCE ofp11_port_t) port;<br>
+}<br>
+<br>
+static inline ovs_be16<br>
+ofp_htons(ofp_port_t ofp_port)<br>
+{<br>
+    return htons(ofp_to_u16(ofp_port));<br>
+}<br>
+<br>
+static inline ovs_be32<br>
+odp_htonl(odp_port_t odp_port)<br>
+{<br>
+    return htonl(odp_to_u32(odp_port));<br>
+}<br>
+<br>
+static inline ovs_be32<br>
+ofp11_htonl(ofp11_port_t ofp11_port)<br>
+{<br>
+    return htonl(ofp11_to_u32(ofp11_port));<br>
+}<br>
+<br>
+static inline ofp_port_t<br>
+ofp_ntohs(ovs_be16 netshort)<br>
+{<br>
+    return uint_to_ofp(ntohs(netshort));<br>
+}<br>
+<br>
+static inline odp_port_t<br>
+odp_ntohl(ovs_be32 netlong)<br>
+{<br>
+    return uint_to_odp(ntohl(netlong));<br>
+}<br>
+<br>
+static inline ofp11_port_t<br>
+ofp11_ntohl(ovs_be32 netlong)<br>
+{<br>
+    return uint_to_ofp11(ntohl(netlong));<br>
+}<br>
+<br>
+static inline uint32_t<br>
+hash_ofp_port(ofp_port_t ofp_port, uint32_t basis)<br>
+{<br>
+    return hash_int(ofp_to_u16(ofp_port), basis);<br>
+}<br>
+<br>
+static inline uint32_t<br>
+hash_odp_port(odp_port_t odp_port, uint32_t basis)<br>
+{<br>
+    return hash_int(odp_to_u32(odp_port), basis);<br>
+}<br>
+<br>
+static inline uint32_t<br>
+hash_ofp11_port(ofp11_port_t ofp11_port, uint32_t basis)<br>
+{<br>
+    return hash_int(ofp11_to_u32(ofp11_port), basis);<br>
+}<br>
+<br>
+static inline void<br>
+ofp_port_increment(ofp_port_t *ofp_portp, uint16_t incr)<br>
+{<br>
+    *ofp_portp = uint_to_ofp(ofp_to_u16(*ofp_portp) + incr);<br>
+}<br>
+<br>
+static inline void<br>
+odp_port_increment(odp_port_t *odp_portp, uint32_t incr)<br>
+{<br>
+    *odp_portp = uint_to_odp(odp_to_u32(*odp_portp) + incr);<br>
+}<br>
+<br>
+/* Convert ofp11_port to ofp_port. Return 0 on success and set *ofp_portp<br>
+ * to the corresponding ofp_port number. Return -1 on failure. */<br>
+static inline int<br>
+ofp11_port_to_ofp_port(ofp11_port_t ofp11_port, ofp_port_t *ofp_portp)<br>
+{<br>
+    if (ofp11_to_u32(ofp11_port) &lt; ofp_to_u16(OFPP_MAX)) {<br>
+        *ofp_portp = (OVS_FORCE ofp_port_t) ofp11_port;<br>
+    } else if (ofp11_to_u32(ofp11_port) &gt;= ofp11_to_u32(OFPP11_MAX)) {<br>
+        *ofp_portp = uint_to_ofp(ofp11_to_u32(ofp11_port) - OFPP11_OFFSET);<br>
+    } else {<br>
+        return -1;<br>
+    }<br>
+    return 0;<br>
+}<br>
+<br>
+/* Convert ofp_port to ofp11_port. This function is always successful and sets<br>
+ * *ofp11_portp to the corresponding ofp11_port number. */<br>
+static inline void<br>
+ofp_port_to_ofp11_port(ofp_port_t ofp_port, ofp11_port_t *ofp11_portp)<br>
+{<br>
+    if (ofp_to_u16(ofp_port) &lt; ofp_to_u16(OFPP_MAX)) {<br>
+        *ofp11_portp = (OVS_FORCE ofp11_port_t) ofp_port;<br>
+    } else {<br>
+        *ofp11_portp = uint_to_ofp11(ofp_to_u16(ofp_port) + OFPP11_OFFSET);<br>
+    }<br>
+}<br>
+<br>
 uint32_t flow_hash_in_minimask(const struct flow *, const struct minimask *,<br>
                                uint32_t basis);<br>
<br>
diff --git a/lib/learn.c b/lib/learn.c<br>
index 606ea9e..fa1182a 100644<br>
--- a/lib/learn.c<br>
+++ b/lib/learn.c<br>
@@ -355,9 +355,9 @@ learn_execute(const struct ofpact_learn *learn, const struct flow *flow,<br>
         case NX_LEARN_DST_OUTPUT:<br>
             if (spec-&gt;n_bits &lt;= 16<br>
                 || is_all_zeros(value.u8, sizeof value - 2)) {<br>
-                uint16_t port = ntohs(value.be16[7]);<br>
+                ofp_port_t port = ofp_ntohs(value.be16[7]);<br>
<br>
-                if (port &lt; OFPP_MAX<br>
+                if (ofp_to_u16(port) &lt; ofp_to_u16(OFPP_MAX)<br>
                     || port == OFPP_IN_PORT<br>
                     || port == OFPP_FLOOD<br>
                     || port == OFPP_LOCAL<br>
diff --git a/lib/learning-switch.c b/lib/learning-switch.c<br>
index ab37dcc..9930ebf 100644<br>
--- a/lib/learning-switch.c<br>
+++ b/lib/learning-switch.c<br>
@@ -48,7 +48,7 @@ VLOG_DEFINE_THIS_MODULE(learning_switch);<br>
<br>
 struct lswitch_port {<br>
     struct hmap_node hmap_node; /* Hash node for port number. */<br>
-    uint16_t port_no;           /* OpenFlow port number, in host byte order. */<br>
+    ofp_port_t port_no;         /* OpenFlow port number, in host byte order. */<br>
     uint32_t queue_id;          /* OpenFlow queue number. */<br>
 };<br>
<br>
@@ -460,26 +460,27 @@ process_switch_features(struct lswitch *sw, struct ofp_header *oh)<br>
         if (lp &amp;&amp; hmap_node_is_null(&amp;lp-&gt;hmap_node)) {<br>
             lp-&gt;port_no = port.port_no;<br>
             hmap_insert(&amp;sw-&gt;queue_numbers, &amp;lp-&gt;hmap_node,<br>
-                        hash_int(lp-&gt;port_no, 0));<br>
+                        hash_ofp_port(lp-&gt;port_no, 0));<br>
         }<br>
     }<br>
     return 0;<br>
 }<br>
<br>
-static uint16_t<br>
+static ofp_port_t<br>
 lswitch_choose_destination(struct lswitch *sw, const struct flow *flow)<br>
 {<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
<br>
     /* Learn the source MAC. */<br>
     if (mac_learning_may_learn(sw-&gt;ml, flow-&gt;dl_src, 0)) {<br>
         struct mac_entry *mac = mac_learning_insert(sw-&gt;ml, flow-&gt;dl_src, 0);<br>
-        if (mac_entry_is_new(mac) || mac-&gt;port.ofp_port != flow-&gt;in_port) {<br>
+        if (mac_entry_is_new(mac)<br>
+            || mac-&gt;port.ofp_port != flow-&gt;in_port.ofp_port) {<br>
             VLOG_DBG_RL(&amp;rl, &quot;%016llx: learned that &quot;ETH_ADDR_FMT&quot; is on &quot;<br>
                         &quot;port %&quot;PRIu16, sw-&gt;datapath_id,<br>
-                        ETH_ADDR_ARGS(flow-&gt;dl_src), flow-&gt;in_port);<br>
+                        ETH_ADDR_ARGS(flow-&gt;dl_src), flow-&gt;in_port.ofp_port);<br>
<br>
-            mac-&gt;port.ofp_port = flow-&gt;in_port;<br>
+            mac-&gt;port.ofp_port = flow-&gt;in_port.ofp_port;<br>
             mac_learning_changed(sw-&gt;ml, mac);<br>
         }<br>
     }<br>
@@ -496,7 +497,7 @@ lswitch_choose_destination(struct lswitch *sw, const struct flow *flow)<br>
         mac = mac_learning_lookup(sw-&gt;ml, flow-&gt;dl_dst, 0, NULL);<br>
         if (mac) {<br>
             out_port = mac-&gt;port.ofp_port;<br>
-            if (out_port == flow-&gt;in_port) {<br>
+            if (out_port == flow-&gt;in_port.ofp_port) {<br>
                 /* Don&#39;t send a packet back out its input port. */<br>
                 return OFPP_NONE;<br>
             }<br>
@@ -512,11 +513,11 @@ lswitch_choose_destination(struct lswitch *sw, const struct flow *flow)<br>
 }<br>
<br>
 static uint32_t<br>
-get_queue_id(const struct lswitch *sw, uint16_t in_port)<br>
+get_queue_id(const struct lswitch *sw, ofp_port_t in_port)<br>
 {<br>
     const struct lswitch_port *port;<br>
<br>
-    HMAP_FOR_EACH_WITH_HASH (port, hmap_node, hash_int(in_port, 0),<br>
+    HMAP_FOR_EACH_WITH_HASH (port, hmap_node, hash_ofp_port(in_port, 0),<br>
                              &amp;sw-&gt;queue_numbers) {<br>
         if (port-&gt;port_no == in_port) {<br>
             return port-&gt;queue_id;<br>
@@ -531,7 +532,7 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh)<br>
 {<br>
     struct ofputil_packet_in pi;<br>
     uint32_t queue_id;<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
<br>
     uint64_t ofpacts_stub[64 / 8];<br>
     struct ofpbuf ofpacts;<br>
@@ -541,6 +542,7 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh)<br>
<br>
     struct ofpbuf pkt;<br>
     struct flow flow;<br>
+    union flow_in_port in_port_;<br>
<br>
     error = ofputil_decode_packet_in(&amp;pi, oh);<br>
     if (error) {<br>
@@ -558,7 +560,8 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh)<br>
<br>
     /* Extract flow data from &#39;opi&#39; into &#39;flow&#39;. */<br>
     ofpbuf_use_const(&amp;pkt, pi.packet, pi.packet_len);<br>
-    flow_extract(&amp;pkt, 0, 0, NULL, pi.fmd.in_port, &amp;flow);<br>
+    in_port_.ofp_port = pi.fmd.in_port;<br>
+    flow_extract(&amp;pkt, 0, 0, NULL, &amp;in_port_, &amp;flow);<br>
     flow.tunnel.tun_id = pi.fmd.tun_id;<br>
<br>
     /* Choose output port. */<br>
@@ -569,7 +572,8 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh)<br>
     ofpbuf_use_stack(&amp;ofpacts, ofpacts_stub, sizeof ofpacts_stub);<br>
     if (out_port == OFPP_NONE) {<br>
         /* No actions. */<br>
-    } else if (queue_id == UINT32_MAX || out_port &gt;= OFPP_MAX) {<br>
+    } else if (queue_id == UINT32_MAX<br>
+               || ofp_to_u16(out_port) &gt;= ofp_to_u16(OFPP_MAX)) {<br>
         ofpact_put_OUTPUT(&amp;ofpacts)-&gt;port = out_port;<br>
     } else {<br>
         struct ofpact_enqueue *enqueue = ofpact_put_ENQUEUE(&amp;ofpacts);<br>
diff --git a/lib/mac-learning.h b/lib/mac-learning.h<br>
index 1cbacfe..9feca00 100644<br>
--- a/lib/mac-learning.h<br>
+++ b/lib/mac-learning.h<br>
@@ -49,7 +49,7 @@ struct mac_entry {<br>
     /* Learned port. */<br>
     union {<br>
         void *p;<br>
-        uint16_t ofp_port;<br>
+        ofp_port_t ofp_port;<br>
     } port;<br>
 };<br>
<br>
diff --git a/lib/match.c b/lib/match.c<br>
index 512253e..4ee8ed6 100644<br>
--- a/lib/match.c<br>
+++ b/lib/match.c<br>
@@ -271,10 +271,10 @@ match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask)<br>
 }<br>
<br>
 void<br>
-match_set_in_port(struct match *match, uint16_t ofp_port)<br>
+match_set_in_port(struct match *match, ofp_port_t ofp_port)<br>
 {<br>
-    match-&gt;wc.masks.in_port = UINT16_MAX;<br>
-    match-&gt;flow.in_port = ofp_port;<br>
+    match-&gt;wc.masks.in_port.ofp_port = OFPP_NONE;<br>
+    match-&gt;flow.in_port.ofp_port = ofp_port;<br>
 }<br>
<br>
 void<br>
@@ -916,9 +916,9 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)<br>
                       ntohll(f-&gt;metadata), ntohll(wc-&gt;masks.metadata));<br>
         break;<br>
     }<br>
-    if (wc-&gt;masks.in_port) {<br>
+    if (wc-&gt;masks.in_port.ofp_port) {<br>
         ds_put_cstr(s, &quot;in_port=&quot;);<br>
-        ofputil_format_port(f-&gt;in_port, s);<br>
+        ofputil_format_port(f-&gt;in_port.ofp_port, s);<br>
         ds_put_char(s, &#39;,&#39;);<br>
     }<br>
     if (wc-&gt;masks.vlan_tci) {<br>
diff --git a/lib/match.h b/lib/match.h<br>
index d435aa4..0ea1f2d 100644<br>
--- a/lib/match.h<br>
+++ b/lib/match.h<br>
@@ -60,7 +60,7 @@ void match_set_tun_tos(struct match *match, uint8_t tos);<br>
 void match_set_tun_tos_masked(struct match *match, uint8_t tos, uint8_t mask);<br>
 void match_set_tun_flags(struct match *match, uint16_t flags);<br>
 void match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask);<br>
-void match_set_in_port(struct match *, uint16_t ofp_port);<br>
+void match_set_in_port(struct match *, ofp_port_t ofp_port);<br>
 void match_set_skb_mark(struct match *, uint32_t skb_mark);<br>
 void match_set_skb_priority(struct match *, uint32_t skb_priority);<br>
 void match_set_dl_type(struct match *, ovs_be16);<br>
diff --git a/lib/meta-flow.c b/lib/meta-flow.c<br>
index f9e044d..8e623ee 100644<br>
--- a/lib/meta-flow.c<br>
+++ b/lib/meta-flow.c<br>
@@ -698,7 +698,7 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)<br>
         return !wc-&gt;masks.metadata;<br>
     case MFF_IN_PORT:<br>
     case MFF_IN_PORT_OXM:<br>
-        return !wc-&gt;masks.in_port;<br>
+        return !wc-&gt;masks.in_port.ofp_port;<br>
     case MFF_SKB_PRIORITY:<br>
         return !wc-&gt;masks.skb_priority;<br>
     case MFF_SKB_MARK:<br>
@@ -937,7 +937,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)<br>
         return true;<br>
<br>
     case MFF_IN_PORT_OXM: {<br>
-        uint16_t port;<br>
+        ofp_port_t port;<br>
         return !ofputil_port_from_ofp11(value-&gt;be32, &amp;port);<br>
     }<br>
<br>
@@ -1011,11 +1011,10 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,<br>
         break;<br>
<br>
     case MFF_IN_PORT:<br>
-        value-&gt;be16 = htons(flow-&gt;in_port);<br>
+        value-&gt;be16 = ofp_htons(flow-&gt;in_port.ofp_port);<br>
         break;<br>
-<br>
     case MFF_IN_PORT_OXM:<br>
-        value-&gt;be32 = ofputil_port_to_ofp11(flow-&gt;in_port);<br>
+        value-&gt;be32 = ofputil_port_to_ofp11(flow-&gt;in_port.ofp_port);<br>
         break;<br>
<br>
     case MFF_SKB_PRIORITY:<br>
@@ -1198,11 +1197,11 @@ mf_set_value(const struct mf_field *mf,<br>
         break;<br>
<br>
     case MFF_IN_PORT:<br>
-        match_set_in_port(match, ntohs(value-&gt;be16));<br>
+        match_set_in_port(match, ofp_ntohs(value-&gt;be16));<br>
         break;<br>
<br>
     case MFF_IN_PORT_OXM: {<br>
-        uint16_t port;<br>
+        ofp_port_t port;<br>
         ofputil_port_from_ofp11(value-&gt;be32, &amp;port);<br>
         match_set_in_port(match, port);<br>
         break;<br>
@@ -1387,13 +1386,13 @@ mf_set_flow_value(const struct mf_field *mf,<br>
         break;<br>
<br>
     case MFF_IN_PORT:<br>
-        flow-&gt;in_port = ntohs(value-&gt;be16);<br>
+        flow-&gt;in_port.ofp_port = ofp_ntohs(value-&gt;be16);<br>
         break;<br>
<br>
     case MFF_IN_PORT_OXM: {<br>
-        uint16_t port;<br>
+        ofp_port_t port;<br>
         ofputil_port_from_ofp11(value-&gt;be32, &amp;port);<br>
-        flow-&gt;in_port = port;<br>
+        flow-&gt;in_port.ofp_port = port;<br>
         break;<br>
     }<br>
<br>
@@ -1594,8 +1593,8 @@ mf_set_wild(const struct mf_field *mf, struct match *match)<br>
<br>
     case MFF_IN_PORT:<br>
     case MFF_IN_PORT_OXM:<br>
-        match-&gt;flow.in_port = 0;<br>
-        match-&gt;wc.masks.in_port = 0;<br>
+        match-&gt;flow.in_port.ofp_port = 0;<br>
+        match-&gt;wc.masks.in_port.ofp_port = 0;<br>
         break;<br>
<br>
     case MFF_SKB_PRIORITY:<br>
@@ -2012,7 +2011,7 @@ mf_random_value(const struct mf_field *mf, union mf_value *value)<br>
         break;<br>
<br>
     case MFF_IN_PORT_OXM:<br>
-        value-&gt;be32 = ofputil_port_to_ofp11(ntohs(value-&gt;be16));<br>
+        value-&gt;be32 = ofputil_port_to_ofp11(ofp_ntohs(value-&gt;be16));<br>
         break;<br>
<br>
     case MFF_IPV6_LABEL:<br>
@@ -2203,12 +2202,12 @@ static char *<br>
 mf_from_ofp_port_string(const struct mf_field *mf, const char *s,<br>
                         ovs_be16 *valuep, ovs_be16 *maskp)<br>
 {<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
<br>
     ovs_assert(mf-&gt;n_bytes == sizeof(ovs_be16));<br>
<br>
     if (ofputil_port_from_string(s, &amp;port)) {<br>
-        *valuep = htons(port);<br>
+        *valuep = ofp_htons(port);<br>
         *maskp = htons(UINT16_MAX);<br>
         return NULL;<br>
     }<br>
@@ -2219,7 +2218,7 @@ static char *<br>
 mf_from_ofp_port_string32(const struct mf_field *mf, const char *s,<br>
                           ovs_be32 *valuep, ovs_be32 *maskp)<br>
 {<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
<br>
     ovs_assert(mf-&gt;n_bytes == sizeof(ovs_be32));<br>
     if (ofputil_port_from_string(s, &amp;port)) {<br>
@@ -2475,7 +2474,7 @@ mf_format(const struct mf_field *mf,<br>
     switch (mf-&gt;string) {<br>
     case MFS_OFP_PORT_OXM:<br>
         if (!mask) {<br>
-            uint16_t port;<br>
+            ofp_port_t port;<br>
             ofputil_port_from_ofp11(value-&gt;be32, &amp;port);<br>
             ofputil_format_port(port, s);<br>
             break;<br>
@@ -2483,7 +2482,7 @@ mf_format(const struct mf_field *mf,<br>
         /* fall through */<br>
     case MFS_OFP_PORT:<br>
         if (!mask) {<br>
-            ofputil_format_port(ntohs(value-&gt;be16), s);<br>
+            ofputil_format_port(ofp_ntohs(value-&gt;be16), s);<br>
             break;<br>
         }<br>
         /* fall through */<br>
diff --git a/lib/meta-flow.h b/lib/meta-flow.h<br>
index a85a193..dc54899 100644<br>
--- a/lib/meta-flow.h<br>
+++ b/lib/meta-flow.h<br>
@@ -276,7 +276,7 @@ struct mf_field {<br>
     uint32_t nxm_header;        /* An NXM_* (or OXM_*) constant. */<br>
     const char *nxm_name;       /* The nxm_header constant&#39;s name. */<br>
     uint32_t oxm_header;        /* An OXM_* (or NXM_*) constant. */<br>
-    const char *oxm_name;          /* The oxm_header constant&#39;s name */<br>
+    const char *oxm_name;       /* The oxm_header constant&#39;s name */<br>
 };<br>
<br>
 /* The representation of a field&#39;s value. */<br>
diff --git a/lib/nx-match.c b/lib/nx-match.c<br>
index ecdaa65..99e938d 100644<br>
--- a/lib/nx-match.c<br>
+++ b/lib/nx-match.c<br>
@@ -568,12 +568,12 @@ nx_put_raw(struct ofpbuf *b, bool oxm, const struct match *match,<br>
     BUILD_ASSERT_DECL(FLOW_WC_SEQ == 20);<br>
<br>
     /* Metadata. */<br>
-    if (match-&gt;wc.masks.in_port) {<br>
-        uint16_t in_port = flow-&gt;in_port;<br>
+    if (match-&gt;wc.masks.in_port.ofp_port) {<br>
+        ofp_port_t in_port = flow-&gt;in_port.ofp_port;<br>
         if (oxm) {<br>
             nxm_put_32(b, OXM_OF_IN_PORT, ofputil_port_to_ofp11(in_port));<br>
         } else {<br>
-            nxm_put_16(b, NXM_OF_IN_PORT, htons(in_port));<br>
+            nxm_put_16(b, NXM_OF_IN_PORT, ofp_htons(in_port));<br>
         }<br>
     }<br>
<br>
diff --git a/lib/odp-util.c b/lib/odp-util.c<br>
index 588b3b6..d4535eb 100644<br>
--- a/lib/odp-util.c<br>
+++ b/lib/odp-util.c<br>
@@ -1560,7 +1560,7 @@ ovs_to_odp_frag(uint8_t nw_frag)<br>
  * capable of being expanded to allow for that much space. */<br>
 void<br>
 odp_flow_key_from_flow(struct ofpbuf *buf, const struct flow *flow,<br>
-                       uint32_t odp_in_port)<br>
+                       odp_port_t odp_in_port)<br>
 {<br>
     struct ovs_key_ethernet *eth_key;<br>
     size_t encap;<br>
@@ -1578,7 +1578,8 @@ odp_flow_key_from_flow(struct ofpbuf *buf, const struct flow *flow,<br>
     }<br>
<br>
     if (odp_in_port != OVSP_NONE) {<br>
-        nl_msg_put_u32(buf, OVS_KEY_ATTR_IN_PORT, odp_in_port);<br>
+        nl_msg_put_u32(buf, OVS_KEY_ATTR_IN_PORT,<br>
+                       odp_to_u32(odp_in_port));<br>
     }<br>
<br>
     eth_key = nl_msg_put_unspec_uninit(buf, OVS_KEY_ATTR_ETHERNET,<br>
@@ -2109,10 +2110,11 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t key_len,<br>
     }<br>
<br>
     if (present_attrs &amp; (UINT64_C(1) &lt;&lt; OVS_KEY_ATTR_IN_PORT)) {<br>
-        flow-&gt;in_port = nl_attr_get_u32(attrs[OVS_KEY_ATTR_IN_PORT]);<br>
+        flow-&gt;in_port.odp_port<br>
+        = uint_to_odp(nl_attr_get_u32(attrs[OVS_KEY_ATTR_IN_PORT]));<br>
         expected_attrs |= UINT64_C(1) &lt;&lt; OVS_KEY_ATTR_IN_PORT;<br>
     } else {<br>
-        flow-&gt;in_port = OVSP_NONE;<br>
+        flow-&gt;in_port.odp_port = OVSP_NONE;<br>
     }<br>
<br>
     /* Ethernet header. */<br>
diff --git a/lib/odp-util.h b/lib/odp-util.h<br>
index 6213418..307ac76 100644<br>
--- a/lib/odp-util.h<br>
+++ b/lib/odp-util.h<br>
@@ -33,7 +33,7 @@ struct nlattr;<br>
 struct ofpbuf;<br>
 struct simap;<br>
<br>
-#define OVSP_NONE UINT32_MAX<br>
+#define OVSP_NONE ((OVS_FORCE odp_port_t) UINT32_MAX)<br>
<br>
 void format_odp_actions(struct ds *, const struct nlattr *odp_actions,<br>
                         size_t actions_len);<br>
@@ -95,7 +95,7 @@ int odp_flow_key_from_string(const char *s, const struct simap *port_names,<br>
                              struct ofpbuf *);<br>
<br>
 void odp_flow_key_from_flow(struct ofpbuf *, const struct flow *,<br>
-                            uint32_t odp_in_port);<br>
+                            odp_port_t odp_in_port);<br>
<br>
 uint32_t odp_flow_key_hash(const struct nlattr *, size_t);<br>
<br>
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c<br>
index c9e000f..325513a 100644<br>
--- a/lib/ofp-actions.c<br>
+++ b/lib/ofp-actions.c<br>
@@ -42,7 +42,7 @@ output_from_openflow10(const struct ofp10_action_output *oao,<br>
     struct ofpact_output *output;<br>
<br>
     output = ofpact_put_OUTPUT(out);<br>
-    output-&gt;port = ntohs(oao-&gt;port);<br>
+    output-&gt;port = ofp_ntohs(oao-&gt;port);<br>
     output-&gt;max_len = ntohs(oao-&gt;max_len);<br>
<br>
     return ofputil_check_output_port(output-&gt;port, OFPP_MAX);<br>
@@ -55,9 +55,10 @@ enqueue_from_openflow10(const struct ofp10_action_enqueue *oae,<br>
     struct ofpact_enqueue *enqueue;<br>
<br>
     enqueue = ofpact_put_ENQUEUE(out);<br>
-    enqueue-&gt;port = ntohs(oae-&gt;port);<br>
+    enqueue-&gt;port = ofp_ntohs(oae-&gt;port);<br>
     enqueue-&gt;queue = ntohl(oae-&gt;queue_id);<br>
-    if (enqueue-&gt;port &gt;= OFPP_MAX &amp;&amp; enqueue-&gt;port != OFPP_IN_PORT<br>
+    if (ofp_to_u16(enqueue-&gt;port) &gt;= ofp_to_u16(OFPP_MAX)<br>
+        &amp;&amp; enqueue-&gt;port != OFPP_IN_PORT<br>
         &amp;&amp; enqueue-&gt;port != OFPP_LOCAL) {<br>
         return OFPERR_OFPBAC_BAD_OUT_PORT;<br>
     }<br>
@@ -72,7 +73,7 @@ resubmit_from_openflow(const struct nx_action_resubmit *nar,<br>
<br>
     resubmit = ofpact_put_RESUBMIT(out);<br>
     resubmit-&gt;ofpact.compat = OFPUTIL_NXAST_RESUBMIT;<br>
-    resubmit-&gt;in_port = ntohs(nar-&gt;in_port);<br>
+    resubmit-&gt;in_port = ofp_ntohs(nar-&gt;in_port);<br>
     resubmit-&gt;table_id = 0xff;<br>
 }<br>
<br>
@@ -88,7 +89,7 @@ resubmit_table_from_openflow(const struct nx_action_resubmit *nar,<br>
<br>
     resubmit = ofpact_put_RESUBMIT(out);<br>
     resubmit-&gt;ofpact.compat = OFPUTIL_NXAST_RESUBMIT_TABLE;<br>
-    resubmit-&gt;in_port = ntohs(nar-&gt;in_port);<br>
+    resubmit-&gt;in_port = ofp_ntohs(nar-&gt;in_port);<br>
     resubmit-&gt;table_id = nar-&gt;table;<br>
     return 0;<br>
 }<br>
@@ -1142,8 +1143,8 @@ exit:<br>
 }<br>
<br>
 static enum ofperr<br>
-ofpact_check__(const struct ofpact *a, const struct flow *flow, int max_ports,<br>
-               ovs_be16 *dl_type)<br>
+ofpact_check__(const struct ofpact *a, const struct flow *flow,<br>
+               ofp_port_t max_ports, ovs_be16 *dl_type)<br>
 {<br>
     const struct ofpact_enqueue *enqueue;<br>
<br>
@@ -1157,7 +1158,8 @@ ofpact_check__(const struct ofpact *a, const struct flow *flow, int max_ports,<br>
<br>
     case OFPACT_ENQUEUE:<br>
         enqueue = ofpact_get_ENQUEUE(a);<br>
-        if (enqueue-&gt;port &gt;= max_ports &amp;&amp; enqueue-&gt;port != OFPP_IN_PORT<br>
+        if (ofp_to_u16(enqueue-&gt;port) &gt;= ofp_to_u16(max_ports)<br>
+            &amp;&amp; enqueue-&gt;port != OFPP_IN_PORT<br>
             &amp;&amp; enqueue-&gt;port != OFPP_LOCAL) {<br>
             return OFPERR_OFPBAC_BAD_OUT_PORT;<br>
         }<br>
@@ -1240,7 +1242,7 @@ ofpact_check__(const struct ofpact *a, const struct flow *flow, int max_ports,<br>
  * switch with no more than &#39;max_ports&#39; ports. */<br>
 enum ofperr<br>
 ofpacts_check(const struct ofpact ofpacts[], size_t ofpacts_len,<br>
-              const struct flow *flow, int max_ports)<br>
+              const struct flow *flow, ofp_port_t max_ports)<br>
 {<br>
     const struct ofpact *a;<br>
     ovs_be16 dl_type = flow-&gt;dl_type;<br>
@@ -1339,7 +1341,7 @@ ofpact_resubmit_to_nxast(const struct ofpact_resubmit *resubmit,<br>
         nar = ofputil_put_NXAST_RESUBMIT_TABLE(out);<br>
         nar-&gt;table = resubmit-&gt;table_id;<br>
     }<br>
-    nar-&gt;in_port = htons(resubmit-&gt;in_port);<br>
+    nar-&gt;in_port = ofp_htons(resubmit-&gt;in_port);<br>
 }<br>
<br>
 static void<br>
@@ -1574,7 +1576,7 @@ ofpact_output_to_openflow10(const struct ofpact_output *output,<br>
     struct ofp10_action_output *oao;<br>
<br>
     oao = ofputil_put_OFPAT10_OUTPUT(out);<br>
-    oao-&gt;port = htons(output-&gt;port);<br>
+    oao-&gt;port = ofp_htons(output-&gt;port);<br>
     oao-&gt;max_len = htons(output-&gt;max_len);<br>
 }<br>
<br>
@@ -1585,7 +1587,7 @@ ofpact_enqueue_to_openflow10(const struct ofpact_enqueue *enqueue,<br>
     struct ofp10_action_enqueue *oae;<br>
<br>
     oae = ofputil_put_OFPAT10_ENQUEUE(out);<br>
-    oae-&gt;port = htons(enqueue-&gt;port);<br>
+    oae-&gt;port = ofp_htons(enqueue-&gt;port);<br>
     oae-&gt;queue_id = htonl(enqueue-&gt;queue);<br>
 }<br>
<br>
@@ -1929,7 +1931,7 @@ ofpacts_put_openflow11_instructions(const struct ofpact ofpacts[],<br>
<br>
 /* Returns true if &#39;action&#39; outputs to &#39;port&#39;, false otherwise. */<br>
 static bool<br>
-ofpact_outputs_to_port(const struct ofpact *ofpact, uint16_t port)<br>
+ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)<br>
 {<br>
     switch (ofpact-&gt;type) {<br>
     case OFPACT_OUTPUT:<br>
@@ -1983,7 +1985,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, uint16_t port)<br>
  * to &#39;port&#39;, false otherwise. */<br>
 bool<br>
 ofpacts_output_to_port(const struct ofpact *ofpacts, size_t ofpacts_len,<br>
-                       uint16_t port)<br>
+                       ofp_port_t port)<br>
 {<br>
     const struct ofpact *a;<br>
<br>
@@ -2064,12 +2066,12 @@ ofpact_format(const struct ofpact *a, struct ds *s)<br>
     const struct ofpact_metadata *metadata;<br>
     const struct ofpact_tunnel *tunnel;<br>
     const struct ofpact_sample *sample;<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
<br>
     switch (a-&gt;type) {<br>
     case OFPACT_OUTPUT:<br>
         port = ofpact_get_OUTPUT(a)-&gt;port;<br>
-        if (port &lt; OFPP_MAX) {<br>
+        if (ofp_to_u16(port) &lt; ofp_to_u16(OFPP_MAX)) {<br>
             ds_put_format(s, &quot;output:%&quot;PRIu16, port);<br>
         } else {<br>
             ofputil_format_port(port, s);<br>
diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h<br>
index 4e7fb5c..4fc40b3 100644<br>
--- a/lib/ofp-actions.h<br>
+++ b/lib/ofp-actions.h<br>
@@ -198,7 +198,7 @@ struct ofpact_null {<br>
  * Used for OFPAT10_OUTPUT. */<br>
 struct ofpact_output {<br>
     struct ofpact ofpact;<br>
-    uint16_t port;              /* Output port. */<br>
+    ofp_port_t port;            /* Output port. */<br>
     uint16_t max_len;           /* Max send len, for port OFPP_CONTROLLER. */<br>
 };<br>
<br>
@@ -217,7 +217,7 @@ struct ofpact_controller {<br>
  * Used for OFPAT10_ENQUEUE. */<br>
 struct ofpact_enqueue {<br>
     struct ofpact ofpact;<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
     uint32_t queue;<br>
 };<br>
<br>
@@ -247,7 +247,7 @@ struct ofpact_bundle {<br>
<br>
     /* Slaves for output. */<br>
     unsigned int n_slaves;<br>
-    uint16_t slaves[];<br>
+    ofp_port_t slaves[];<br>
 };<br>
<br>
 /* OFPACT_SET_VLAN_VID.<br>
@@ -379,7 +379,7 @@ struct ofpact_metadata {<br>
  * Used for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE. */<br>
 struct ofpact_resubmit {<br>
     struct ofpact ofpact;<br>
-    uint16_t in_port;<br>
+    ofp_port_t in_port;<br>
     uint8_t table_id;<br>
 };<br>
<br>
@@ -493,7 +493,7 @@ enum ofperr ofpacts_pull_openflow11_instructions(struct ofpbuf *openflow,<br>
                                                  uint8_t table_id,<br>
                                                  struct ofpbuf *ofpacts);<br>
 enum ofperr ofpacts_check(const struct ofpact[], size_t ofpacts_len,<br>
-                          const struct flow *, int max_ports);<br>
+                          const struct flow *, ofp_port_t max_ports);<br>
 enum ofperr ofpacts_verify(const struct ofpact ofpacts[], size_t ofpacts_len);<br>
<br>
 /* Converting ofpacts to OpenFlow. */<br>
@@ -507,7 +507,7 @@ void ofpacts_put_openflow11_instructions(const struct ofpact[],<br>
<br>
 /* Working with ofpacts. */<br>
 bool ofpacts_output_to_port(const struct ofpact[], size_t ofpacts_len,<br>
-                            uint16_t port);<br>
+                            ofp_port_t port);<br>
 bool ofpacts_equal(const struct ofpact a[], size_t a_len,<br>
                    const struct ofpact b[], size_t b_len);<br>
<br>
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c<br>
index 1c5c761..a730250 100644<br>
--- a/lib/ofp-parse.c<br>
+++ b/lib/ofp-parse.c<br>
@@ -135,7 +135,7 @@ parse_enqueue(char *arg, struct ofpbuf *ofpacts)<br>
     }<br>
<br>
     enqueue = ofpact_put_ENQUEUE(ofpacts);<br>
-    enqueue-&gt;port = str_to_u32(port);<br>
+    enqueue-&gt;port = uint_to_ofp(str_to_u32(port));<br>
     enqueue-&gt;queue = str_to_u32(queue);<br>
 }<br>
<br>
@@ -152,7 +152,7 @@ parse_output(char *arg, struct ofpbuf *ofpacts)<br>
         struct ofpact_output *output;<br>
<br>
         output = ofpact_put_OUTPUT(ofpacts);<br>
-        output-&gt;port = str_to_u32(arg);<br>
+        output-&gt;port = uint_to_ofp(str_to_u32(arg));<br>
         output-&gt;max_len = output-&gt;port == OFPP_CONTROLLER ? UINT16_MAX : 0;<br>
     }<br>
 }<br>
@@ -650,7 +650,7 @@ str_to_ofpact__(char *pos, char *act, char *arg,<br>
         }<br>
         return false;<br>
     } else {<br>
-        uint16_t port;<br>
+        ofp_port_t port;<br>
         if (ofputil_port_from_string(act, &amp;port)) {<br>
             ofpact_put_OUTPUT(ofpacts)-&gt;port = port;<br>
         } else {<br>
@@ -1076,7 +1076,7 @@ parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,<br>
             if (!strcmp(name, &quot;table&quot;)) {<br>
                 fmr-&gt;table_id = str_to_table_id(value);<br>
             } else if (!strcmp(name, &quot;out_port&quot;)) {<br>
-                fmr-&gt;out_port = atoi(value);<br>
+                fmr-&gt;out_port = uint_to_ofp(atoi(value));<br>
             } else if (mf_from_name(name)) {<br>
                 parse_field(mf_from_name(name), value, &amp;fmr-&gt;match);<br>
             } else {<br>
@@ -1229,8 +1229,8 @@ parse_ofp_exact_flow(struct flow *flow, const char *s)<br>
         }<br>
     }<br>
<br>
-    if (!flow-&gt;in_port) {<br>
-        flow-&gt;in_port = OFPP_NONE;<br>
+    if (!flow-&gt;in_port.ofp_port) {<br>
+        flow-&gt;in_port.ofp_port = OFPP_NONE;<br>
     }<br>
<br>
 exit:<br>
diff --git a/lib/ofp-print.c b/lib/ofp-print.c<br>
index 549616c..3cc7366 100644<br>
--- a/lib/ofp-print.c<br>
+++ b/lib/ofp-print.c<br>
@@ -62,7 +62,7 @@ ofp_packet_to_string(const void *data, size_t len)<br>
     struct flow flow;<br>
<br>
     ofpbuf_use_const(&amp;buf, data, len);<br>
-    flow_extract(&amp;buf, 0, 0, NULL, 0, &amp;flow);<br>
+    flow_extract(&amp;buf, 0, 0, NULL, NULL, &amp;flow);<br>
     flow_format(&amp;ds, &amp;flow);<br>
<br>
     if (buf.l7) {<br>
@@ -204,10 +204,11 @@ compare_ports(const void *a_, const void *b_)<br>
 {<br>
     const struct ofputil_phy_port *a = a_;<br>
     const struct ofputil_phy_port *b = b_;<br>
-    uint16_t ap = a-&gt;port_no;<br>
-    uint16_t bp = b-&gt;port_no;<br>
+    ofp_port_t ap = a-&gt;port_no;<br>
+    ofp_port_t bp = b-&gt;port_no;<br>
<br>
-    return ap &lt; bp ? -1 : ap &gt; bp;<br>
+    return ofp_to_u16(ap) &lt; ofp_to_u16(bp) ? -1<br>
+           : !(ap == bp);<br>
 }<br>
<br>
 static void<br>
@@ -585,7 +586,7 @@ static void print_wild(struct ds *string, const char *leader, int is_wild,<br>
<br>
 static void<br>
 print_wild_port(struct ds *string, const char *leader, int is_wild,<br>
-                int verbosity, uint16_t port)<br>
+                int verbosity, ofp_port_t port)<br>
 {<br>
     if (is_wild &amp;&amp; verbosity &lt; 2) {<br>
         return;<br>
@@ -665,7 +666,7 @@ ofp10_match_to_string(const struct ofp10_match *om, int verbosity)<br>
         }<br>
     }<br>
     print_wild_port(&amp;f, &quot;in_port=&quot;, w &amp; OFPFW10_IN_PORT, verbosity,<br>
-                    ntohs(om-&gt;in_port));<br>
+                    ofp_ntohs(om-&gt;in_port));<br>
     print_wild(&amp;f, &quot;dl_vlan=&quot;, w &amp; OFPFW10_DL_VLAN, verbosity,<br>
                &quot;%d&quot;, ntohs(om-&gt;dl_vlan));<br>
     print_wild(&amp;f, &quot;dl_vlan_pcp=&quot;, w &amp; OFPFW10_DL_VLAN_PCP, verbosity,<br>
@@ -1167,7 +1168,7 @@ print_port_stat(struct ds *string, const char *leader, uint64_t stat, int more)<br>
 static void<br>
 ofp_print_ofpst_port_request(struct ds *string, const struct ofp_header *oh)<br>
 {<br>
-    uint16_t ofp10_port;<br>
+    ofp_port_t ofp10_port;<br>
     enum ofperr error;<br>
<br>
     error = ofputil_decode_port_stats_request(oh, &amp;ofp10_port);<br>
@@ -1205,7 +1206,7 @@ ofp_print_ofpst_port_reply(struct ds *string, const struct ofp_header *oh,<br>
         }<br>
<br>
         ds_put_cstr(string, &quot;  port &quot;);<br>
-        if (ps.port_no &lt; 10) {<br>
+        if (ofp_to_u16(ps.port_no) &lt; 10) {<br>
             ds_put_char(string, &#39; &#39;);<br>
         }<br>
         ofputil_format_port(ps.port_no, string);<br>
diff --git a/lib/ofp-util.c b/lib/ofp-util.c<br>
index 26da477..6011bb1 100644<br>
--- a/lib/ofp-util.c<br>
+++ b/lib/ofp-util.c<br>
@@ -90,7 +90,7 @@ ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)<br>
     flow_wildcards_init_catchall(wc);<br>
<br>
     if (!(ofpfw &amp; OFPFW10_IN_PORT)) {<br>
-        wc-&gt;masks.in_port = UINT16_MAX;<br>
+        wc-&gt;masks.in_port.ofp_port = OFPP_NONE;<br>
     }<br>
<br>
     if (!(ofpfw &amp; OFPFW10_NW_TOS)) {<br>
@@ -145,7 +145,7 @@ ofputil_match_from_ofp10_match(const struct ofp10_match *ofmatch,<br>
     /* Initialize most of match-&gt;flow. */<br>
     match-&gt;flow.nw_src = ofmatch-&gt;nw_src;<br>
     match-&gt;flow.nw_dst = ofmatch-&gt;nw_dst;<br>
-    match-&gt;flow.in_port = ntohs(ofmatch-&gt;in_port);<br>
+    match-&gt;flow.in_port.ofp_port = ofp_ntohs(ofmatch-&gt;in_port);<br>
     match-&gt;flow.dl_type = ofputil_dl_type_from_openflow(ofmatch-&gt;dl_type);<br>
     match-&gt;flow.tp_src = ofmatch-&gt;tp_src;<br>
     match-&gt;flow.tp_dst = ofmatch-&gt;tp_dst;<br>
@@ -190,7 +190,7 @@ ofputil_match_to_ofp10_match(const struct match *match,<br>
<br>
     /* Figure out most OpenFlow wildcards. */<br>
     ofpfw = 0;<br>
-    if (!wc-&gt;masks.in_port) {<br>
+    if (!wc-&gt;masks.in_port.ofp_port) {<br>
         ofpfw |= OFPFW10_IN_PORT;<br>
     }<br>
     if (!wc-&gt;masks.dl_type) {<br>
@@ -244,7 +244,7 @@ ofputil_match_to_ofp10_match(const struct match *match,<br>
<br>
     /* Compose most of the match structure. */<br>
     ofmatch-&gt;wildcards = htonl(ofpfw);<br>
-    ofmatch-&gt;in_port = htons(match-&gt;flow.in_port);<br>
+    ofmatch-&gt;in_port = ofp_htons(match-&gt;flow.in_port.ofp_port);<br>
     memcpy(ofmatch-&gt;dl_src, match-&gt;flow.dl_src, ETH_ADDR_LEN);<br>
     memcpy(ofmatch-&gt;dl_dst, match-&gt;flow.dl_dst, ETH_ADDR_LEN);<br>
     ofmatch-&gt;dl_type = ofputil_dl_type_to_openflow(match-&gt;flow.dl_type);<br>
@@ -311,7 +311,7 @@ ofputil_match_from_ofp11_match(const struct ofp11_match *ofmatch,<br>
     match_init_catchall(match);<br>
<br>
     if (!(wc &amp; OFPFW11_IN_PORT)) {<br>
-        uint16_t ofp_port;<br>
+        ofp_port_t ofp_port;<br>
         enum ofperr error;<br>
<br>
         error = ofputil_port_from_ofp11(ofmatch-&gt;in_port, &amp;ofp_port);<br>
@@ -466,10 +466,10 @@ ofputil_match_to_ofp11_match(const struct match *match,<br>
     ofmatch-&gt;omh.type = htons(OFPMT_STANDARD);<br>
     ofmatch-&gt;omh.length = htons(OFPMT11_STANDARD_LENGTH);<br>
<br>
-    if (!match-&gt;wc.masks.in_port) {<br>
+    if (!match-&gt;wc.masks.in_port.ofp_port) {<br>
         wc |= OFPFW11_IN_PORT;<br>
     } else {<br>
-        ofmatch-&gt;in_port = ofputil_port_to_ofp11(match-&gt;flow.in_port);<br>
+        ofmatch-&gt;in_port = ofputil_port_to_ofp11(match-&gt;flow.in_port.ofp_port);<br>
     }<br>
<br>
     memcpy(ofmatch-&gt;dl_src, match-&gt;flow.dl_src, ETH_ADDR_LEN);<br>
@@ -1567,7 +1567,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,<br>
             fm-&gt;idle_timeout = ntohs(ofm-&gt;idle_timeout);<br>
             fm-&gt;hard_timeout = ntohs(ofm-&gt;hard_timeout);<br>
             fm-&gt;buffer_id = ntohl(ofm-&gt;buffer_id);<br>
-            fm-&gt;out_port = ntohs(ofm-&gt;out_port);<br>
+            fm-&gt;out_port = ofp_ntohs(ofm-&gt;out_port);<br>
             fm-&gt;flags = ntohs(ofm-&gt;flags);<br>
         } else if (raw == OFPRAW_NXT_FLOW_MOD) {<br>
             /* Nicira extended flow_mod. */<br>
@@ -1598,7 +1598,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,<br>
             fm-&gt;idle_timeout = ntohs(nfm-&gt;idle_timeout);<br>
             fm-&gt;hard_timeout = ntohs(nfm-&gt;hard_timeout);<br>
             fm-&gt;buffer_id = ntohl(nfm-&gt;buffer_id);<br>
-            fm-&gt;out_port = ntohs(nfm-&gt;out_port);<br>
+            fm-&gt;out_port = ofp_ntohs(nfm-&gt;out_port);<br>
             fm-&gt;flags = ntohs(nfm-&gt;flags);<br>
         } else {<br>
             NOT_REACHED();<br>
@@ -1653,7 +1653,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm,<br>
     case OFPUTIL_P_OF13_OXM: {<br>
         struct ofp11_flow_mod *ofm;<br>
<br>
-        msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD,<br>
+        msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD,<br>
                            ofputil_protocol_to_ofp_version(protocol),<br>
                            NXM_TYPICAL_LEN + fm-&gt;ofpacts_len);<br>
         ofm = ofpbuf_put_zeros(msg, sizeof *ofm);<br>
@@ -1691,7 +1691,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm,<br>
         ofm-&gt;hard_timeout = htons(fm-&gt;hard_timeout);<br>
         ofm-&gt;priority = htons(fm-&gt;priority);<br>
         ofm-&gt;buffer_id = htonl(fm-&gt;buffer_id);<br>
-        ofm-&gt;out_port = htons(fm-&gt;out_port);<br>
+        ofm-&gt;out_port = ofp_htons(fm-&gt;out_port);<br>
         ofm-&gt;flags = htons(fm-&gt;flags);<br>
         ofpacts_put_openflow10(fm-&gt;ofpacts, fm-&gt;ofpacts_len, msg);<br>
         break;<br>
@@ -1713,7 +1713,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm,<br>
         nfm-&gt;hard_timeout = htons(fm-&gt;hard_timeout);<br>
         nfm-&gt;priority = htons(fm-&gt;priority);<br>
         nfm-&gt;buffer_id = htonl(fm-&gt;buffer_id);<br>
-        nfm-&gt;out_port = htons(fm-&gt;out_port);<br>
+        nfm-&gt;out_port = ofp_htons(fm-&gt;out_port);<br>
         nfm-&gt;flags = htons(fm-&gt;flags);<br>
         nfm-&gt;match_len = htons(match_len);<br>
         ofpacts_put_openflow10(fm-&gt;ofpacts, fm-&gt;ofpacts_len, msg);<br>
@@ -1766,7 +1766,7 @@ ofputil_decode_ofpst10_flow_request(struct ofputil_flow_stats_request *fsr,<br>
 {<br>
     fsr-&gt;aggregate = aggregate;<br>
     ofputil_match_from_ofp10_match(&amp;ofsr-&gt;match, &amp;fsr-&gt;match);<br>
-    fsr-&gt;out_port = ntohs(ofsr-&gt;out_port);<br>
+    fsr-&gt;out_port = ofp_ntohs(ofsr-&gt;out_port);<br>
     fsr-&gt;table_id = ofsr-&gt;table_id;<br>
     fsr-&gt;cookie = fsr-&gt;cookie_mask = htonll(0);<br>
<br>
@@ -1818,7 +1818,7 @@ ofputil_decode_nxst_flow_request(struct ofputil_flow_stats_request *fsr,<br>
     }<br>
<br>
     fsr-&gt;aggregate = aggregate;<br>
-    fsr-&gt;out_port = ntohs(nfsr-&gt;out_port);<br>
+    fsr-&gt;out_port = ofp_ntohs(nfsr-&gt;out_port);<br>
     fsr-&gt;table_id = nfsr-&gt;table_id;<br>
<br>
     return 0;<br>
@@ -1902,7 +1902,7 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr,<br>
         ofsr = ofpbuf_put_zeros(msg, sizeof *ofsr);<br>
         ofputil_match_to_ofp10_match(&amp;fsr-&gt;match, &amp;ofsr-&gt;match);<br>
         ofsr-&gt;table_id = fsr-&gt;table_id;<br>
-        ofsr-&gt;out_port = htons(fsr-&gt;out_port);<br>
+        ofsr-&gt;out_port = ofp_htons(fsr-&gt;out_port);<br>
         break;<br>
     }<br>
<br>
@@ -1920,7 +1920,7 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr,<br>
                                  fsr-&gt;cookie, fsr-&gt;cookie_mask);<br>
<br>
         nfsr = msg-&gt;l3;<br>
-        nfsr-&gt;out_port = htons(fsr-&gt;out_port);<br>
+        nfsr-&gt;out_port = ofp_htons(fsr-&gt;out_port);<br>
         nfsr-&gt;match_len = htons(match_len);<br>
         nfsr-&gt;table_id = fsr-&gt;table_id;<br>
         break;<br>
@@ -2443,7 +2443,7 @@ ofputil_decode_packet_in_finish(struct ofputil_packet_in *pin,<br>
     pin-&gt;packet = b-&gt;data;<br>
     pin-&gt;packet_len = b-&gt;size;<br>
<br>
-    pin-&gt;fmd.in_port = match-&gt;flow.in_port;<br>
+    pin-&gt;fmd.in_port = match-&gt;flow.in_port.ofp_port;<br>
     pin-&gt;fmd.tun_id = match-&gt;flow.tunnel.tun_id;<br>
     pin-&gt;fmd.tun_src = match-&gt;flow.tunnel.ip_src;<br>
     pin-&gt;fmd.tun_dst = match-&gt;flow.tunnel.ip_dst;<br>
@@ -2502,7 +2502,7 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin,<br>
         pin-&gt;packet = opi-&gt;data;<br>
         pin-&gt;packet_len = b.size;<br>
<br>
-        pin-&gt;fmd.in_port = ntohs(opi-&gt;in_port);<br>
+        pin-&gt;fmd.in_port = ofp_ntohs(opi-&gt;in_port);<br>
         pin-&gt;reason = opi-&gt;reason;<br>
         pin-&gt;buffer_id = ntohl(opi-&gt;buffer_id);<br>
         pin-&gt;total_len = ntohs(opi-&gt;total_len);<br>
@@ -2620,7 +2620,7 @@ ofputil_encode_packet_in(const struct ofputil_packet_in *pin,<br>
                                   htonl(0), send_len);<br>
         opi = ofpbuf_put_zeros(packet, offsetof(struct ofp10_packet_in, data));<br>
         opi-&gt;total_len = htons(pin-&gt;total_len);<br>
-        opi-&gt;in_port = htons(pin-&gt;fmd.in_port);<br>
+        opi-&gt;in_port = ofp_htons(pin-&gt;fmd.in_port);<br>
         opi-&gt;reason = pin-&gt;reason;<br>
         opi-&gt;buffer_id = htonl(pin-&gt;buffer_id);<br>
<br>
@@ -2737,7 +2737,7 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,<br>
         const struct ofp10_packet_out *opo = ofpbuf_pull(&amp;b, sizeof *opo);<br>
<br>
         po-&gt;buffer_id = ntohl(opo-&gt;buffer_id);<br>
-        po-&gt;in_port = ntohs(opo-&gt;in_port);<br>
+        po-&gt;in_port = ofp_ntohs(opo-&gt;in_port);<br>
<br>
         error = ofpacts_pull_openflow10(&amp;b, ntohs(opo-&gt;actions_len), ofpacts);<br>
         if (error) {<br>
@@ -2747,7 +2747,8 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,<br>
         NOT_REACHED();<br>
     }<br>
<br>
-    if (po-&gt;in_port &gt;= OFPP_MAX &amp;&amp; po-&gt;in_port != OFPP_LOCAL<br>
+    if (ofp_to_u16(po-&gt;in_port) &gt;= ofp_to_u16(OFPP_MAX)<br>
+        &amp;&amp; po-&gt;in_port != OFPP_LOCAL<br>
         &amp;&amp; po-&gt;in_port != OFPP_NONE &amp;&amp; po-&gt;in_port != OFPP_CONTROLLER) {<br>
         VLOG_WARN_RL(&amp;bad_ofmsg_rl, &quot;packet-out has bad input port %#&quot;PRIx16,<br>
                      po-&gt;in_port);<br>
@@ -2834,7 +2835,7 @@ ofputil_decode_ofp10_phy_port(struct ofputil_phy_port *pp,<br>
 {<br>
     memset(pp, 0, sizeof *pp);<br>
<br>
-    pp-&gt;port_no = ntohs(opp-&gt;port_no);<br>
+    pp-&gt;port_no = ofp_ntohs(opp-&gt;port_no);<br>
     memcpy(pp-&gt;hw_addr, opp-&gt;hw_addr, OFP_ETH_ALEN);<br>
     ovs_strlcpy(pp-&gt;name, opp-&gt;name, OFP_MAX_PORT_NAME_LEN);<br>
<br>
@@ -2902,7 +2903,7 @@ ofputil_encode_ofp10_phy_port(const struct ofputil_phy_port *pp,<br>
 {<br>
     memset(opp, 0, sizeof *opp);<br>
<br>
-    opp-&gt;port_no = htons(pp-&gt;port_no);<br>
+    opp-&gt;port_no = ofp_htons(pp-&gt;port_no);<br>
     memcpy(opp-&gt;hw_addr, pp-&gt;hw_addr, ETH_ADDR_LEN);<br>
     ovs_strlcpy(opp-&gt;name, pp-&gt;name, OFP_MAX_PORT_NAME_LEN);<br>
<br>
@@ -3312,7 +3313,7 @@ ofputil_decode_port_mod(const struct ofp_header *oh,<br>
     if (raw == OFPRAW_OFPT10_PORT_MOD) {<br>
         const struct ofp10_port_mod *opm = b.data;<br>
<br>
-        pm-&gt;port_no = ntohs(opm-&gt;port_no);<br>
+        pm-&gt;port_no = ofp_ntohs(opm-&gt;port_no);<br>
         memcpy(pm-&gt;hw_addr, opm-&gt;hw_addr, ETH_ADDR_LEN);<br>
         pm-&gt;config = ntohl(opm-&gt;config) &amp; OFPPC10_ALL;<br>
         pm-&gt;mask = ntohl(opm-&gt;mask) &amp; OFPPC10_ALL;<br>
@@ -3354,7 +3355,7 @@ ofputil_encode_port_mod(const struct ofputil_port_mod *pm,<br>
<br>
         b = ofpraw_alloc(OFPRAW_OFPT10_PORT_MOD, ofp_version, 0);<br>
         opm = ofpbuf_put_zeros(b, sizeof *opm);<br>
-        opm-&gt;port_no = htons(pm-&gt;port_no);<br>
+        opm-&gt;port_no = ofp_htons(pm-&gt;port_no);<br>
         memcpy(opm-&gt;hw_addr, pm-&gt;hw_addr, ETH_ADDR_LEN);<br>
         opm-&gt;config = htonl(pm-&gt;config &amp; OFPPC10_ALL);<br>
         opm-&gt;mask = htonl(pm-&gt;mask &amp; OFPPC10_ALL);<br>
@@ -3690,7 +3691,7 @@ ofputil_decode_flow_monitor_request(struct ofputil_flow_monitor_request *rq,<br>
<br>
     rq-&gt;id = ntohl(nfmr-&gt;id);<br>
     rq-&gt;flags = flags;<br>
-    rq-&gt;out_port = ntohs(nfmr-&gt;out_port);<br>
+    rq-&gt;out_port = ofp_ntohs(nfmr-&gt;out_port);<br>
     rq-&gt;table_id = nfmr-&gt;table_id;<br>
<br>
     return nx_pull_match(msg, ntohs(nfmr-&gt;match_len), &amp;rq-&gt;match, NULL, NULL);<br>
@@ -3715,7 +3716,7 @@ ofputil_append_flow_monitor_request(<br>
     nfmr = ofpbuf_at_assert(msg, start_ofs, sizeof *nfmr);<br>
     nfmr-&gt;id = htonl(rq-&gt;id);<br>
     nfmr-&gt;flags = htons(rq-&gt;flags);<br>
-    nfmr-&gt;out_port = htons(rq-&gt;out_port);<br>
+    nfmr-&gt;out_port = ofp_htons(rq-&gt;out_port);<br>
     nfmr-&gt;match_len = htons(match_len);<br>
     nfmr-&gt;table_id = rq-&gt;table_id;<br>
 }<br>
@@ -3923,7 +3924,7 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po,<br>
<br>
         opo = msg-&gt;l3;<br>
         opo-&gt;buffer_id = htonl(po-&gt;buffer_id);<br>
-        opo-&gt;in_port = htons(po-&gt;in_port);<br>
+        opo-&gt;in_port = ofp_htons(po-&gt;in_port);<br>
         opo-&gt;actions_len = htons(msg-&gt;size - actions_ofs);<br>
         break;<br>
     }<br>
@@ -4042,22 +4043,20 @@ ofputil_frag_handling_from_string(const char *s, enum ofp_config_flags *flags)<br>
  *<br>
  * See the definition of OFP11_MAX for an explanation of the mapping. */<br>
 enum ofperr<br>
-ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port)<br>
+ofputil_port_from_ofp11(ovs_be32 ofp11_port, ofp_port_t *ofp10_port)<br>
 {<br>
-    uint32_t ofp11_port_h = ntohl(ofp11_port);<br>
+    ofp11_port_t ofp11_port_h = ofp11_ntohl(ofp11_port);<br>
+    int error;<br>
<br>
-    if (ofp11_port_h &lt; OFPP_MAX) {<br>
-        *ofp10_port = ofp11_port_h;<br>
-        return 0;<br>
-    } else if (ofp11_port_h &gt;= OFPP11_MAX) {<br>
-        *ofp10_port = ofp11_port_h - OFPP11_OFFSET;<br>
+    error = ofp11_port_to_ofp_port(ofp11_port_h, ofp10_port);<br>
+    if (!error) {<br>
         return 0;<br>
     } else {<br>
         *ofp10_port = OFPP_NONE;<br>
         VLOG_WARN_RL(&amp;bad_ofmsg_rl, &quot;port %&quot;PRIu32&quot; is outside the supported &quot;<br>
-                     &quot;range 0 through %d or 0x%&quot;PRIx32&quot; through 0x%&quot;PRIx32,<br>
-                     ofp11_port_h, OFPP_MAX - 1,<br>
-                     (uint32_t) OFPP11_MAX, UINT32_MAX);<br>
+                     &quot;range 0 through %u or 0x%&quot;PRIx32&quot; through 0x%&quot;PRIx32,<br>
+                     ofp11_port_h, ofp_to_u16(OFPP_MAX) - 1,<br>
+                     OFPP11_MAX, UINT32_MAX);<br>
         return OFPERR_OFPBAC_BAD_OUT_PORT;<br>
     }<br>
 }<br>
@@ -4067,18 +4066,19 @@ ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port)<br>
  *<br>
  * See the definition of OFP11_MAX for an explanation of the mapping. */<br>
 ovs_be32<br>
-ofputil_port_to_ofp11(uint16_t ofp10_port)<br>
+ofputil_port_to_ofp11(ofp_port_t ofp10_port)<br>
 {<br>
-    return htonl(ofp10_port &lt; OFPP_MAX<br>
-                 ? ofp10_port<br>
-                 : ofp10_port + OFPP11_OFFSET);<br>
+    ofp11_port_t ofp11_port;<br>
+<br>
+    ofp_port_to_ofp11_port(ofp10_port, &amp;ofp11_port);<br>
+    return ofp11_htonl(ofp11_port);<br>
 }<br>
<br>
 /* Checks that &#39;port&#39; is a valid output port for the OFPAT10_OUTPUT action, given<br>
  * that the switch will never have more than &#39;max_ports&#39; ports.  Returns 0 if<br>
  * &#39;port&#39; is valid, otherwise an OpenFlow return code. */<br>
 enum ofperr<br>
-ofputil_check_output_port(uint16_t port, int max_ports)<br>
+ofputil_check_output_port(ofp_port_t port, ofp_port_t max_ports)<br>
 {<br>
     switch (port) {<br>
     case OFPP_IN_PORT:<br>
@@ -4092,7 +4092,7 @@ ofputil_check_output_port(uint16_t port, int max_ports)<br>
         return 0;<br>
<br>
     default:<br>
-        if (port &lt; max_ports) {<br>
+        if (ofp_to_u16(port) &lt; ofp_to_u16(max_ports)) {<br>
             return 0;<br>
         }<br>
         return OFPERR_OFPBAC_BAD_OUT_PORT;<br>
@@ -4128,46 +4128,42 @@ ofputil_check_output_port(uint16_t port, int max_ports)<br>
  * of OpenFlow 1.1+ port numbers, mapping those port numbers into the 16-bit<br>
  * range as described in include/openflow/openflow-1.1.h. */<br>
 bool<br>
-ofputil_port_from_string(const char *s, uint16_t *portp)<br>
+ofputil_port_from_string(const char *s, ofp_port_t *portp)<br>
 {<br>
-    unsigned int port32;<br>
+    uint32_t port32;<br>
<br>
     *portp = 0;<br>
     if (str_to_uint(s, 10, &amp;port32)) {<br>
-        if (port32 &lt; OFPP_MAX) {<br>
-            *portp = port32;<br>
-            return true;<br>
-        } else if (port32 &lt; OFPP_FIRST_RESV) {<br>
+        if (port32 &lt; ofp_to_u16(OFPP_MAX)) {<br>
+            /* Pass. */<br>
+        } else if (port32 &lt; ofp_to_u16(OFPP_FIRST_RESV)) {<br>
             VLOG_WARN(&quot;port %u is a reserved OF1.0 port number that will &quot;<br>
                       &quot;be translated to %u when talking to an OF1.1 or &quot;<br>
                       &quot;later controller&quot;, port32, port32 + OFPP11_OFFSET);<br>
-            *portp = port32;<br>
-            return true;<br>
-        } else if (port32 &lt;= OFPP_LAST_RESV) {<br>
+        } else if (port32 &lt;= ofp_to_u16(OFPP_LAST_RESV)) {<br>
             struct ds msg;<br>
<br>
             ds_init(&amp;msg);<br>
-            ofputil_format_port(port32, &amp;msg);<br>
+            ofputil_format_port(uint_to_ofp(port32), &amp;msg);<br>
             VLOG_WARN_ONCE(&quot;referring to port %s as %u is deprecated for &quot;<br>
                            &quot;compatibility with future versions of OpenFlow&quot;,<br>
                            ds_cstr(&amp;msg), port32);<br>
             ds_destroy(&amp;msg);<br>
-<br>
-            *portp = port32;<br>
-            return true;<br>
-        } else if (port32 &lt; OFPP11_MAX) {<br>
+        } else if (port32 &lt; ofp11_to_u32(OFPP11_MAX)) {<br>
             VLOG_WARN(&quot;port %u is outside the supported range 0 through &quot;<br>
                       &quot;%&quot;PRIx16&quot; or 0x%x through 0x%&quot;PRIx32, port32,<br>
-                      UINT16_MAX, (unsigned int) OFPP11_MAX, UINT32_MAX);<br>
+                      UINT16_MAX, ofp11_to_u32(OFPP11_MAX), UINT32_MAX);<br>
             return false;<br>
         } else {<br>
-            *portp = port32 - OFPP11_OFFSET;<br>
-            return true;<br>
+            port32 -= OFPP11_OFFSET;<br>
         }<br>
+<br>
+        *portp = uint_to_ofp(port32);<br>
+        return true;<br>
     } else {<br>
         struct pair {<br>
             const char *name;<br>
-            uint16_t value;<br>
+            ofp_port_t value;<br>
         };<br>
         static const struct pair pairs[] = {<br>
 #define OFPUTIL_NAMED_PORT(NAME) {#NAME, OFPP_##NAME},<br>
@@ -4190,7 +4186,7 @@ ofputil_port_from_string(const char *s, uint16_t *portp)<br>
  * Most ports&#39; string representation is just the port number, but for special<br>
  * ports, e.g. OFPP_LOCAL, it is the name, e.g. &quot;LOCAL&quot;. */<br>
 void<br>
-ofputil_format_port(uint16_t port, struct ds *s)<br>
+ofputil_format_port(ofp_port_t port, struct ds *s)<br>
 {<br>
     const char *name;<br>
<br>
@@ -4531,7 +4527,7 @@ ofputil_parse_key_value(char **stringp, char **keyp, char **valuep)<br>
  * will be for Open Flow version &#39;ofp_version&#39;. Returns message<br>
  * as a struct ofpbuf. Returns encoded message on success, NULL on error */<br>
 struct ofpbuf *<br>
-ofputil_encode_dump_ports_request(enum ofp_version ofp_version, uint16_t port)<br>
+ofputil_encode_dump_ports_request(enum ofp_version ofp_version, ofp_port_t port)<br>
 {<br>
     struct ofpbuf *request;<br>
<br>
@@ -4540,7 +4536,7 @@ ofputil_encode_dump_ports_request(enum ofp_version ofp_version, uint16_t port)<br>
         struct ofp10_port_stats_request *req;<br>
         request = ofpraw_alloc(OFPRAW_OFPST10_PORT_REQUEST, ofp_version, 0);<br>
         req = ofpbuf_put_zeros(request, sizeof *req);<br>
-        req-&gt;port_no = htons(port);<br>
+        req-&gt;port_no = ofp_htons(port);<br>
         break;<br>
     }<br>
     case OFP11_VERSION:<br>
@@ -4563,7 +4559,7 @@ static void<br>
 ofputil_port_stats_to_ofp10(const struct ofputil_port_stats *ops,<br>
                             struct ofp10_port_stats *ps10)<br>
 {<br>
-    ps10-&gt;port_no = htons(ops-&gt;port_no);<br>
+    ps10-&gt;port_no = ofp_htons(ops-&gt;port_no);<br>
     memset(ps10-&gt;pad, 0, sizeof ps10-&gt;pad);<br>
     put_32aligned_be64(&amp;ps10-&gt;rx_packets, htonll(ops-&gt;stats.rx_packets));<br>
     put_32aligned_be64(&amp;ps10-&gt;tx_packets, htonll(ops-&gt;stats.tx_packets));<br>
@@ -4647,7 +4643,7 @@ ofputil_port_stats_from_ofp10(struct ofputil_port_stats *ops,<br>
 {<br>
     memset(ops, 0, sizeof *ops);<br>
<br>
-    ops-&gt;port_no = ntohs(ps10-&gt;port_no);<br>
+    ops-&gt;port_no = ofp_ntohs(ps10-&gt;port_no);<br>
     ops-&gt;stats.rx_packets = ntohll(get_32aligned_be64(&amp;ps10-&gt;rx_packets));<br>
     ops-&gt;stats.tx_packets = ntohll(get_32aligned_be64(&amp;ps10-&gt;tx_packets));<br>
     ops-&gt;stats.rx_bytes = ntohll(get_32aligned_be64(&amp;ps10-&gt;rx_bytes));<br>
@@ -4787,7 +4783,7 @@ ofputil_decode_port_stats(struct ofputil_port_stats *ps, struct ofpbuf *msg)<br>
  * Returns 0 if successful, otherwise an OFPERR_* number. */<br>
 enum ofperr<br>
 ofputil_decode_port_stats_request(const struct ofp_header *request,<br>
-                                  uint16_t *ofp10_port)<br>
+                                  ofp_port_t *ofp10_port)<br>
 {<br>
     switch ((enum ofp_version)request-&gt;version) {<br>
     case OFP13_VERSION:<br>
@@ -4799,7 +4795,7 @@ ofputil_decode_port_stats_request(const struct ofp_header *request,<br>
<br>
     case OFP10_VERSION: {<br>
         const struct ofp10_port_stats_request *psr10 = ofpmsg_body(request);<br>
-        *ofp10_port = ntohs(psr10-&gt;port_no);<br>
+        *ofp10_port = ofp_ntohs(psr10-&gt;port_no);<br>
         return 0;<br>
     }<br>
<br>
@@ -4826,7 +4822,7 @@ ofputil_decode_queue_stats_request(const struct ofp_header *request,<br>
     case OFP10_VERSION: {<br>
         const struct ofp10_queue_stats_request *qsr10 = ofpmsg_body(request);<br>
         oqsr-&gt;queue_id = ntohl(qsr10-&gt;queue_id);<br>
-        oqsr-&gt;port_no = ntohs(qsr10-&gt;port_no);<br>
+        oqsr-&gt;port_no = ofp_ntohs(qsr10-&gt;port_no);<br>
         /* OF 1.0 uses OFPP_ALL for OFPP_ANY */<br>
         if (oqsr-&gt;port_no == OFPP_ALL) {<br>
             oqsr-&gt;port_no = OFPP_ANY;<br>
@@ -4864,8 +4860,8 @@ ofputil_encode_queue_stats_request(enum ofp_version ofp_version,<br>
         request = ofpraw_alloc(OFPRAW_OFPST10_QUEUE_REQUEST, ofp_version, 0);<br>
         req = ofpbuf_put_zeros(request, sizeof *req);<br>
         /* OpenFlow 1.0 needs OFPP_ALL instead of OFPP_ANY */<br>
-        req-&gt;port_no = htons(oqsr-&gt;port_no == OFPP_ANY<br>
-                             ? OFPP_ALL : oqsr-&gt;port_no);<br>
+        req-&gt;port_no = ofp_htons(oqsr-&gt;port_no == OFPP_ANY<br>
+                                 ? OFPP_ALL : oqsr-&gt;port_no);<br>
         req-&gt;queue_id = htonl(oqsr-&gt;queue_id);<br>
         break;<br>
     }<br>
@@ -4895,7 +4891,7 @@ static enum ofperr<br>
 ofputil_queue_stats_from_ofp10(struct ofputil_queue_stats *oqs,<br>
                                const struct ofp10_queue_stats *qs10)<br>
 {<br>
-    oqs-&gt;port_no = ntohs(qs10-&gt;port_no);<br>
+    oqs-&gt;port_no = ofp_ntohs(qs10-&gt;port_no);<br>
     oqs-&gt;queue_id = ntohl(qs10-&gt;queue_id);<br>
     oqs-&gt;stats.tx_bytes = ntohll(get_32aligned_be64(&amp;qs10-&gt;tx_bytes));<br>
     oqs-&gt;stats.tx_packets = ntohll(get_32aligned_be64(&amp;qs10-&gt;tx_packets));<br>
@@ -5000,7 +4996,7 @@ static void<br>
 ofputil_queue_stats_to_ofp10(const struct ofputil_queue_stats *oqs,<br>
                              struct ofp10_queue_stats *qs10)<br>
 {<br>
-    qs10-&gt;port_no = htons(oqs-&gt;port_no);<br>
+    qs10-&gt;port_no = ofp_htons(oqs-&gt;port_no);<br>
     memset(qs10-&gt;pad, 0, sizeof qs10-&gt;pad);<br>
     qs10-&gt;queue_id = htonl(oqs-&gt;queue_id);<br>
     put_32aligned_be64(&amp;qs10-&gt;tx_bytes, htonll(oqs-&gt;stats.tx_bytes));<br>
diff --git a/lib/ofp-util.h b/lib/ofp-util.h<br>
index 1c8d6cd..22025dc 100644<br>
--- a/lib/ofp-util.h<br>
+++ b/lib/ofp-util.h<br>
@@ -32,12 +32,12 @@<br>
 struct ofpbuf;<br>
<br>
 /* Port numbers. */<br>
-enum ofperr ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port);<br>
-ovs_be32 ofputil_port_to_ofp11(uint16_t ofp10_port);<br>
+enum ofperr ofputil_port_from_ofp11(ovs_be32 ofp11_port, ofp_port_t *ofp10_port);<br>
+ovs_be32 ofputil_port_to_ofp11(ofp_port_t ofp10_port);<br>
<br>
-enum ofperr ofputil_check_output_port(uint16_t ofp_port, int max_ports);<br>
-bool ofputil_port_from_string(const char *, uint16_t *portp);<br>
-void ofputil_format_port(uint16_t port, struct ds *);<br>
+enum ofperr ofputil_check_output_port(ofp_port_t ofp_port, ofp_port_t max_ports);<br>
+bool ofputil_port_from_string(const char *, ofp_port_t *portp);<br>
+void ofputil_format_port(ofp_port_t port, struct ds *);<br>
<br>
 /* Converting OFPFW10_NW_SRC_MASK and OFPFW10_NW_DST_MASK wildcard bit counts<br>
  * to and from IP bitmasks. */<br>
@@ -219,7 +219,7 @@ struct ofputil_flow_mod {<br>
     uint16_t idle_timeout;<br>
     uint16_t hard_timeout;<br>
     uint32_t buffer_id;<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
     uint16_t flags;<br>
     struct ofpact *ofpacts;     /* Series of &quot;struct ofpact&quot;s. */<br>
     size_t ofpacts_len;         /* Length of ofpacts, in bytes. */<br>
@@ -241,7 +241,7 @@ struct ofputil_flow_stats_request {<br>
     struct match match;<br>
     ovs_be64 cookie;<br>
     ovs_be64 cookie_mask;<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
     uint8_t table_id;<br>
 };<br>
<br>
@@ -350,7 +350,7 @@ struct ofputil_packet_out {<br>
     const void *packet;         /* Packet data, if buffer_id == UINT32_MAX. */<br>
     size_t packet_len;          /* Length of packet data in bytes. */<br>
     uint32_t buffer_id;         /* Buffer id or UINT32_MAX if no buffer. */<br>
-    uint16_t in_port;           /* Packet&#39;s input port. */<br>
+    ofp_port_t in_port;         /* Packet&#39;s input port. */<br>
     struct ofpact *ofpacts;     /* Actions. */<br>
     size_t ofpacts_len;         /* Size of ofpacts in bytes. */<br>
 };<br>
@@ -390,7 +390,7 @@ enum ofputil_port_state {<br>
<br>
 /* Abstract ofp10_phy_port or ofp11_port. */<br>
 struct ofputil_phy_port {<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
     uint8_t hw_addr[OFP_ETH_ALEN];<br>
     char name[OFP_MAX_PORT_NAME_LEN];<br>
     enum ofputil_port_config config;<br>
@@ -498,7 +498,7 @@ struct ofpbuf *ofputil_encode_port_status(const struct ofputil_port_status *,<br>
<br>
 /* Abstract ofp_port_mod. */<br>
 struct ofputil_port_mod {<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
     uint8_t hw_addr[OFP_ETH_ALEN];<br>
     enum ofputil_port_config config;<br>
     enum ofputil_port_config mask;<br>
@@ -535,7 +535,7 @@ struct ofpbuf *ofputil_encode_table_stats_reply(<br>
 struct ofputil_flow_monitor_request {<br>
     uint32_t id;<br>
     enum nx_flow_monitor_flags flags;<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
     uint8_t table_id;<br>
     struct match match;<br>
 };<br>
@@ -677,7 +677,7 @@ void *ofputil_put_action(enum ofputil_action_code, struct ofpbuf *buf);<br>
 #define OFP_ACTION_ALIGN 8      /* Alignment of ofp_actions. */<br>
<br>
 enum ofperr validate_actions(const union ofp_action *, size_t n_actions,<br>
-                             const struct flow *, int max_ports);<br>
+                             const struct flow *, ofp_port_t max_ports);<br>
 bool action_outputs_to_port(const union ofp_action *, ovs_be16 port);<br>
<br>
 enum ofperr ofputil_pull_actions(struct ofpbuf *, unsigned int actions_len,<br>
@@ -691,23 +691,23 @@ union ofp_action *ofputil_actions_clone(const union ofp_action *, size_t n);<br>
 bool ofputil_parse_key_value(char **stringp, char **keyp, char **valuep);<br>
<br>
 struct ofputil_port_stats {<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
     struct netdev_stats stats;<br>
     uint32_t duration_sec;      /* UINT32_MAX if unknown. */<br>
     uint32_t duration_nsec;<br>
 };<br>
<br>
 struct ofpbuf *ofputil_encode_dump_ports_request(enum ofp_version ofp_version,<br>
-                                                 uint16_t port);<br>
+                                                 ofp_port_t port);<br>
 void ofputil_append_port_stat(struct list *replies,<br>
                               const struct ofputil_port_stats *ops);<br>
 size_t ofputil_count_port_stats(const struct ofp_header *);<br>
 int ofputil_decode_port_stats(struct ofputil_port_stats *, struct ofpbuf *msg);<br>
 enum ofperr ofputil_decode_port_stats_request(const struct ofp_header *request,<br>
-                                              uint16_t *ofp10_port);<br>
+                                              ofp_port_t *ofp10_port);<br>
<br>
 struct ofputil_queue_stats_request {<br>
-    uint16_t port_no;           /* OFPP_ANY means &quot;all ports&quot;. */<br>
+    ofp_port_t port_no;           /* OFPP_ANY means &quot;all ports&quot;. */<br>
     uint32_t queue_id;<br>
 };<br>
<br>
@@ -719,7 +719,7 @@ ofputil_encode_queue_stats_request(enum ofp_version ofp_version,<br>
                                    const struct ofputil_queue_stats_request *oqsr);<br>
<br>
 struct ofputil_queue_stats {<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
     uint32_t queue_id;<br>
     struct netdev_queue_stats stats;<br>
 };<br>
diff --git a/lib/sflow.h b/lib/sflow.h<br>
index 0d1f2b9..58288b1 100644<br>
--- a/lib/sflow.h<br>
+++ b/lib/sflow.h<br>
@@ -8,6 +8,8 @@<br>
 #ifndef SFLOW_H<br>
 #define SFLOW_H 1<br>
<br>
+#include &quot;flow.h&quot;<br>
+<br>
 typedef enum {<br>
     SFL_DSCLASS_IFINDEX = 0,<br>
     SFL_DSCLASS_VLAN = 1,<br>
diff --git a/lib/sflow_api.h b/lib/sflow_api.h<br>
index 3cc060b..a5fa78d 100644<br>
--- a/lib/sflow_api.h<br>
+++ b/lib/sflow_api.h<br>
@@ -153,7 +153,7 @@ typedef struct _SFLPoller {<br>
     struct _SFLAgent *agent; /* pointer to my agent */<br>
     void *magic;             /* ptr to pass back in getCountersFn() */<br>
     getCountersFn_t getCountersFn;<br>
-    u_int32_t bridgePort; /* port number local to bridge */<br>
+    odp_port_t bridgePort; /* port number local to bridge */<br>
     /* private fields */<br>
     SFLReceiver *myReceiver;<br>
     time_t countersCountdown;<br>
@@ -279,8 +279,8 @@ void sfl_agent_set_agentSubId(SFLAgent *agent, u_int32_t subId);<br>
<br>
 /* The poller may need a separate number to reference the local bridge port<br>
    to get counters if it is not the same as the global ifIndex */<br>
-void sfl_poller_set_bridgePort(SFLPoller *poller, u_int32_t port_no);<br>
-u_int32_t sfl_poller_get_bridgePort(SFLPoller *poller);<br>
+void sfl_poller_set_bridgePort(SFLPoller *poller, odp_port_t port_no);<br>
+odp_port_t sfl_poller_get_bridgePort(SFLPoller *poller);<br>
<br>
 /* call this to indicate a discontinuity with a counter like samplePool so that the<br>
    sflow collector will ignore the next delta */<br>
diff --git a/lib/sflow_poller.c b/lib/sflow_poller.c<br>
index d2e4155..e0c122f 100644<br>
--- a/lib/sflow_poller.c<br>
+++ b/lib/sflow_poller.c<br>
@@ -104,11 +104,11 @@ void sfl_poller_set_sFlowCpInterval(SFLPoller *poller, u_int32_t sFlowCpInterval<br>
   to get counters if it is not the same as the global ifIndex.<br>
 */<br>
<br>
-void sfl_poller_set_bridgePort(SFLPoller *poller, u_int32_t port_no) {<br>
+void sfl_poller_set_bridgePort(SFLPoller *poller, odp_port_t port_no) {<br>
     poller-&gt;bridgePort = port_no;<br>
 }<br>
<br>
-u_int32_t sfl_poller_get_bridgePort(SFLPoller *poller) {<br>
+odp_port_t sfl_poller_get_bridgePort(SFLPoller *poller) {<br>
     return poller-&gt;bridgePort;<br>
 }<br>
<br>
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c<br>
index 0951968..9ddae5c 100644<br>
--- a/ofproto/connmgr.c<br>
+++ b/ofproto/connmgr.c<br>
@@ -1039,7 +1039,7 @@ ofconn_send_error(const struct ofconn *ofconn,<br>
 /* Same as pktbuf_retrieve(), using the pktbuf owned by &#39;ofconn&#39;. */<br>
 enum ofperr<br>
 ofconn_pktbuf_retrieve(struct ofconn *ofconn, uint32_t id,<br>
-                       struct ofpbuf **bufferp, uint16_t *in_port)<br>
+                       struct ofpbuf **bufferp, ofp_port_t *in_port)<br>
 {<br>
     return pktbuf_retrieve(ofconn-&gt;pktbuf, id, bufferp, in_port);<br>
 }<br>
@@ -1646,7 +1646,7 @@ any_extras_changed(const struct connmgr *mgr,<br>
<br>
 bool<br>
 connmgr_must_output_local(struct connmgr *mgr, const struct flow *flow,<br>
-                          uint32_t local_odp_port,<br>
+                          odp_port_t local_odp_port,<br>
                           const struct nlattr *odp_actions,<br>
                           size_t actions_len)<br>
 {<br>
diff --git a/ofproto/connmgr.h b/ofproto/connmgr.h<br>
index 429e678..0242116 100644<br>
--- a/ofproto/connmgr.h<br>
+++ b/ofproto/connmgr.h<br>
@@ -125,7 +125,7 @@ void ofconn_send_error(const struct ofconn *, const struct ofp_header *request,<br>
                        enum ofperr);<br>
<br>
 enum ofperr ofconn_pktbuf_retrieve(struct ofconn *, uint32_t id,<br>
-                                   struct ofpbuf **bufferp, uint16_t *in_port);<br>
+                                   struct ofpbuf **bufferp, ofp_port_t *in_port);<br>
<br>
 bool ofconn_has_pending_opgroups(const struct ofconn *);<br>
 void ofconn_add_opgroup(struct ofconn *, struct list *);<br>
@@ -157,7 +157,7 @@ void connmgr_set_in_band_queue(struct connmgr *, int queue_id);<br>
<br>
 /* In-band implementation. */<br>
 bool connmgr_must_output_local(struct connmgr *, const struct flow *,<br>
-                               uint32_t local_odp_port,<br>
+                               odp_port_t local_odp_port,<br>
                                const struct nlattr *odp_actions,<br>
                                size_t actions_len);<br>
<br>
@@ -173,7 +173,7 @@ struct ofmonitor {<br>
     enum nx_flow_monitor_flags flags;<br>
<br>
     /* Matching. */<br>
-    uint16_t out_port;<br>
+    ofp_port_t out_port;<br>
     uint8_t table_id;<br>
     struct minimatch match;<br>
 };<br>
diff --git a/ofproto/in-band.c b/ofproto/in-band.c<br>
index ba6fc54..6afc1f3 100644<br>
--- a/ofproto/in-band.c<br>
+++ b/ofproto/in-band.c<br>
@@ -225,7 +225,7 @@ refresh_local(struct in_band *ib)<br>
 /* Returns true if the rule that would match &#39;flow&#39; with &#39;actions&#39; is<br>
  * allowed to be set up in the datapath. */<br>
 bool<br>
-in_band_rule_check(const struct flow *flow, uint32_t local_odp_port,<br>
+in_band_rule_check(const struct flow *flow, odp_port_t local_odp_port,<br>
                    const struct nlattr *actions, size_t actions_len)<br>
 {<br>
     /* Don&#39;t allow flows that would prevent DHCP replies from being seen<br>
@@ -239,7 +239,7 @@ in_band_rule_check(const struct flow *flow, uint32_t local_odp_port,<br>
<br>
         NL_ATTR_FOR_EACH_UNSAFE (a, left, actions, actions_len) {<br>
             if (nl_attr_type(a) == OVS_ACTION_ATTR_OUTPUT<br>
-                &amp;&amp; nl_attr_get_u32(a) == local_odp_port) {<br>
+                &amp;&amp; nl_attr_get_u32(a) == odp_to_u32(local_odp_port)) {<br>
                 return true;<br>
             }<br>
         }<br>
diff --git a/ofproto/in-band.h b/ofproto/in-band.h<br>
index 4f52e00..5449312 100644<br>
--- a/ofproto/in-band.h<br>
+++ b/ofproto/in-band.h<br>
@@ -21,6 +21,7 @@<br>
 #include &lt;stddef.h&gt;<br>
 #include &lt;sys/socket.h&gt;<br>
 #include &lt;netinet/in.h&gt;<br>
+#include &quot;flow.h&quot;<br>
<br>
 struct flow;<br>
 struct in_band;<br>
@@ -39,7 +40,7 @@ void in_band_set_remotes(struct in_band *,<br>
 bool in_band_run(struct in_band *);<br>
 void in_band_wait(struct in_band *);<br>
<br>
-bool in_band_rule_check(const struct flow *, uint32_t local_odp_port,<br>
+bool in_band_rule_check(const struct flow *, odp_port_t local_odp_port,<br>
                         const struct nlattr *odp_actions, size_t actions_len);<br>
<br>
 #endif /* in-band.h */<br>
diff --git a/ofproto/netflow.c b/ofproto/netflow.c<br>
index 7366986..854d873 100644<br>
--- a/ofproto/netflow.c<br>
+++ b/ofproto/netflow.c<br>
@@ -85,11 +85,13 @@ gen_netflow_rec(struct netflow *nf, struct netflow_flow *nf_flow,<br>
     nf_rec-&gt;nexthop = htonl(0);<br>
     if (nf-&gt;add_id_to_iface) {<br>
         uint16_t iface = (nf-&gt;engine_id &amp; 0x7f) &lt;&lt; 9;<br>
-        nf_rec-&gt;input = htons(iface | (expired-&gt;flow.in_port &amp; 0x1ff));<br>
-        nf_rec-&gt;output = htons(iface | (nf_flow-&gt;output_iface &amp; 0x1ff));<br>
+        nf_rec-&gt;input = htons(iface<br>
+            | (ofp_to_u16(expired-&gt;flow.in_port.ofp_port) &amp; 0x1ff));<br>
+        nf_rec-&gt;output = htons(iface<br>
+            | (ofp_to_u16(nf_flow-&gt;output_iface) &amp; 0x1ff));<br>
     } else {<br>
-        nf_rec-&gt;input = htons(expired-&gt;flow.in_port);<br>
-        nf_rec-&gt;output = htons(nf_flow-&gt;output_iface);<br>
+        nf_rec-&gt;input = ofp_htons(expired-&gt;flow.in_port.ofp_port);<br>
+        nf_rec-&gt;output = ofp_htons(nf_flow-&gt;output_iface);<br>
     }<br>
     nf_rec-&gt;packet_count = htonl(packet_count);<br>
     nf_rec-&gt;byte_count = htonl(byte_count);<br>
@@ -263,7 +265,7 @@ netflow_flow_init(struct netflow_flow *nf_flow OVS_UNUSED)<br>
 void<br>
 netflow_flow_clear(struct netflow_flow *nf_flow)<br>
 {<br>
-    uint16_t output_iface = nf_flow-&gt;output_iface;<br>
+    ofp_port_t output_iface = nf_flow-&gt;output_iface;<br>
<br>
     memset(nf_flow, 0, sizeof *nf_flow);<br>
     nf_flow-&gt;output_iface = output_iface;<br>
diff --git a/ofproto/netflow.h b/ofproto/netflow.h<br>
index c01ff15..67d75bf 100644<br>
--- a/ofproto/netflow.h<br>
+++ b/ofproto/netflow.h<br>
@@ -38,11 +38,9 @@ struct netflow_options {<br>
     bool add_id_to_iface;<br>
 };<br>
<br>
-enum netflow_output_ports {<br>
-    NF_OUT_FLOOD = UINT16_MAX,<br>
-    NF_OUT_MULTI = UINT16_MAX - 1,<br>
-    NF_OUT_DROP = UINT16_MAX - 2<br>
-};<br>
+#define NF_OUT_FLOOD OFPP_NONE<br>
+#define NF_OUT_MULTI (uint_to_ofp(ofp_to_u16(OFPP_NONE) - 1))<br>
+#define NF_OUT_DROP  (uint_to_ofp(ofp_to_u16(OFPP_NONE) - 2))<br>
<br>
 struct netflow_flow {<br>
     long long int last_expired;   /* Time this flow last timed out. */<br>
@@ -51,7 +49,7 @@ struct netflow_flow {<br>
     uint64_t packet_count_off;    /* Packet count at last time out. */<br>
     uint64_t byte_count_off;      /* Byte count at last time out. */<br>
<br>
-    uint16_t output_iface;        /* Output interface index. */<br>
+    ofp_port_t output_iface;      /* Output interface index. */<br>
     uint8_t tcp_flags;            /* Bitwise-OR of all TCP flags seen. */<br>
 };<br>
<br>
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c<br>
index 9ad0eaf..d5a9524 100644<br>
--- a/ofproto/ofproto-dpif-sflow.c<br>
+++ b/ofproto/ofproto-dpif-sflow.c<br>
@@ -46,7 +46,7 @@ struct dpif_sflow_port {<br>
     struct hmap_node hmap_node; /* In struct dpif_sflow&#39;s &quot;ports&quot; hmap. */<br>
     SFLDataSource_instance dsi; /* sFlow library&#39;s notion of port number. */<br>
     struct ofport *ofport;      /* To retrive port stats. */<br>
-    uint32_t odp_port;<br>
+    odp_port_t odp_port;<br>
 };<br>
<br>
 struct dpif_sflow {<br>
@@ -142,12 +142,13 @@ sflow_agent_send_packet_cb(void *ds_, SFLAgent *agent OVS_UNUSED,<br>
 }<br>
<br>
 static struct dpif_sflow_port *<br>
-dpif_sflow_find_port(const struct dpif_sflow *ds, uint32_t odp_port)<br>
+dpif_sflow_find_port(const struct dpif_sflow *ds, odp_port_t odp_port)<br>
 {<br>
     struct dpif_sflow_port *dsp;<br>
<br>
     HMAP_FOR_EACH_IN_BUCKET (dsp, hmap_node,<br>
-                             hash_int(odp_port, 0), &amp;ds-&gt;ports) {<br>
+                             hash_odp_port(odp_port, 0),<br>
+                                      &amp;ds-&gt;ports) {<br>
         if (dsp-&gt;odp_port == odp_port) {<br>
             return dsp;<br>
         }<br>
@@ -343,7 +344,7 @@ dpif_sflow_add_poller(struct dpif_sflow *ds, struct dpif_sflow_port *dsp)<br>
<br>
 void<br>
 dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport,<br>
-                    uint32_t odp_port)<br>
+                    odp_port_t odp_port)<br>
 {<br>
     struct dpif_sflow_port *dsp;<br>
     int ifindex;<br>
@@ -362,7 +363,7 @@ dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport,<br>
     dsp-&gt;ofport = ofport;<br>
     dsp-&gt;odp_port = odp_port;<br>
     SFL_DS_SET(dsp-&gt;dsi, SFL_DSCLASS_IFINDEX, ifindex, 0);<br>
-    hmap_insert(&amp;ds-&gt;ports, &amp;dsp-&gt;hmap_node, hash_int(odp_port, 0));<br>
+    hmap_insert(&amp;ds-&gt;ports, &amp;dsp-&gt;hmap_node, hash_odp_port(odp_port, 0));<br>
<br>
     /* Add poller. */<br>
     if (ds-&gt;sflow_agent) {<br>
@@ -382,7 +383,7 @@ dpif_sflow_del_port__(struct dpif_sflow *ds, struct dpif_sflow_port *dsp)<br>
 }<br>
<br>
 void<br>
-dpif_sflow_del_port(struct dpif_sflow *ds, uint32_t odp_port)<br>
+dpif_sflow_del_port(struct dpif_sflow *ds, odp_port_t odp_port)<br>
 {<br>
     struct dpif_sflow_port *dsp = dpif_sflow_find_port(ds, odp_port);<br>
     if (dsp) {<br>
@@ -488,7 +489,7 @@ dpif_sflow_set_options(struct dpif_sflow *ds,<br>
<br>
 int<br>
 dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *ds,<br>
-                               uint32_t odp_port)<br>
+                               odp_port_t odp_port)<br>
 {<br>
     struct dpif_sflow_port *dsp = dpif_sflow_find_port(ds, odp_port);<br>
     return dsp ? SFL_DS_INDEX(dsp-&gt;dsi) : 0;<br>
@@ -496,7 +497,7 @@ dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *ds,<br>
<br>
 void<br>
 dpif_sflow_received(struct dpif_sflow *ds, struct ofpbuf *packet,<br>
-                    const struct flow *flow, uint32_t odp_in_port,<br>
+                    const struct flow *flow, odp_port_t odp_in_port,<br>
                     const union user_action_cookie *cookie)<br>
 {<br>
     SFL_FLOW_SAMPLE_TYPE fs;<br>
diff --git a/ofproto/ofproto-dpif-sflow.h b/ofproto/ofproto-dpif-sflow.h<br>
index 02a0f17..d0f83bc 100644<br>
--- a/ofproto/ofproto-dpif-sflow.h<br>
+++ b/ofproto/ofproto-dpif-sflow.h<br>
@@ -38,8 +38,8 @@ void dpif_sflow_clear(struct dpif_sflow *);<br>
 bool dpif_sflow_is_enabled(const struct dpif_sflow *);<br>
<br>
 void dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport,<br>
-                         uint32_t odp_port);<br>
-void dpif_sflow_del_port(struct dpif_sflow *, uint32_t odp_port);<br>
+                         odp_port_t odp_port);<br>
+void dpif_sflow_del_port(struct dpif_sflow *, odp_port_t odp_port);<br>
<br>
 void dpif_sflow_run(struct dpif_sflow *);<br>
 void dpif_sflow_wait(struct dpif_sflow *);<br>
@@ -47,9 +47,10 @@ void dpif_sflow_wait(struct dpif_sflow *);<br>
 void dpif_sflow_received(struct dpif_sflow *,<br>
                          struct ofpbuf *,<br>
                          const struct flow *,<br>
-                         uint32_t odp_port,<br>
+                         odp_port_t odp_port,<br>
                          const union user_action_cookie *);<br>
<br>
-int dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *, uint32_t);<br>
+int dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *,<br>
+                                   odp_port_t odp_port);<br>
<br>
 #endif /* ofproto/ofproto-dpif-sflow.h */<br>
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c<br>
index f5877a4..040be49 100644<br>
--- a/ofproto/ofproto-dpif-xlate.c<br>
+++ b/ofproto/ofproto-dpif-xlate.c<br>
@@ -80,7 +80,7 @@ struct xlate_ctx {<br>
     uint32_t orig_skb_priority; /* Priority when packet arrived. */<br>
     uint8_t table_id;           /* OpenFlow table ID where flow was found. */<br>
     uint32_t sflow_n_outputs;   /* Number of output ports. */<br>
-    uint32_t sflow_odp_port;    /* Output port for composing sFlow action. */<br>
+    odp_port_t sflow_odp_port;  /* Output port for composing sFlow action. */<br>
     uint16_t user_cookie_offset;/* Used for user_action_cookie fixup. */<br>
     bool exit;                  /* No further actions should be processed. */<br>
 };<br>
@@ -100,13 +100,13 @@ static void do_xlate_actions(const struct ofpact *, size_t ofpacts_len,<br>
                              struct xlate_ctx *);<br>
 static void xlate_normal(struct xlate_ctx *);<br>
 static void xlate_report(struct xlate_ctx *, const char *);<br>
-static void xlate_table_action(struct xlate_ctx *, uint16_t in_port,<br>
+static void xlate_table_action(struct xlate_ctx *, ofp_port_t in_port,<br>
                                uint8_t table_id, bool may_packet_in);<br>
 static bool input_vid_is_valid(uint16_t vid, struct ofbundle *, bool warn);<br>
 static uint16_t input_vid_to_vlan(const struct ofbundle *, uint16_t vid);<br>
 static void output_normal(struct xlate_ctx *, const struct ofbundle *,<br>
                           uint16_t vlan);<br>
-static void compose_output_action(struct xlate_ctx *, uint16_t ofp_port);<br>
+static void compose_output_action(struct xlate_ctx *, ofp_port_t ofp_port);<br>
<br>
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);<br>
<br>
@@ -130,7 +130,7 @@ vlan_is_mirrored(const struct ofmirror *m, int vlan)<br>
 }<br>
<br>
 static struct ofbundle *<br>
-lookup_input_bundle(const struct ofproto_dpif *ofproto, uint16_t in_port,<br>
+lookup_input_bundle(const struct ofproto_dpif *ofproto, ofp_port_t in_port,<br>
                     bool warn, struct ofport_dpif **in_ofportp)<br>
 {<br>
     struct ofport_dpif *ofport;<br>
@@ -183,7 +183,7 @@ add_mirror_actions(struct xlate_ctx *ctx, const struct flow *orig_flow)<br>
     const struct nlattr *a;<br>
     size_t left;<br>
<br>
-    in_bundle = lookup_input_bundle(ctx-&gt;ofproto, orig_flow-&gt;in_port,<br>
+    in_bundle = lookup_input_bundle(ctx-&gt;ofproto, orig_flow-&gt;in_port.ofp_port,<br>
                                     ctx-&gt;xin-&gt;packet != NULL, NULL);<br>
     if (!in_bundle) {<br>
         return;<br>
@@ -219,7 +219,7 @@ add_mirror_actions(struct xlate_ctx *ctx, const struct flow *orig_flow)<br>
             continue;<br>
         }<br>
<br>
-        ofport = get_odp_port(ofproto, nl_attr_get_u32(a));<br>
+        ofport = get_odp_port(ofproto, uint_to_odp(nl_attr_get_u32(a)));<br>
         if (ofport &amp;&amp; ofport-&gt;bundle) {<br>
             mirrors |= ofport-&gt;bundle-&gt;dst_mirrors;<br>
         }<br>
@@ -554,7 +554,7 @@ xlate_normal(struct xlate_ctx *ctx)<br>
     memset(&amp;wc-&gt;masks.dl_dst, 0xff, sizeof wc-&gt;masks.dl_dst);<br>
     memset(&amp;wc-&gt;masks.vlan_tci, 0xff, sizeof wc-&gt;masks.vlan_tci);<br>
<br>
-    in_bundle = lookup_input_bundle(ctx-&gt;ofproto, flow-&gt;in_port,<br>
+    in_bundle = lookup_input_bundle(ctx-&gt;ofproto, flow-&gt;in_port.ofp_port,<br>
                                     ctx-&gt;xin-&gt;packet != NULL, &amp;in_port);<br>
     if (!in_bundle) {<br>
         xlate_report(ctx, &quot;no input bundle, dropping&quot;);<br>
@@ -660,7 +660,7 @@ compose_sample_action(const struct ofproto_dpif *ofproto,<br>
<br>
 static void<br>
 compose_sflow_cookie(const struct ofproto_dpif *ofproto,<br>
-                     ovs_be16 vlan_tci, uint32_t odp_port,<br>
+                     ovs_be16 vlan_tci, odp_port_t odp_port,<br>
                      unsigned int n_outputs, union user_action_cookie *cookie)<br>
 {<br>
     int ifindex;<br>
@@ -695,12 +695,12 @@ static size_t<br>
 compose_sflow_action(const struct ofproto_dpif *ofproto,<br>
                      struct ofpbuf *odp_actions,<br>
                      const struct flow *flow,<br>
-                     uint32_t odp_port)<br>
+                     odp_port_t odp_port)<br>
 {<br>
     uint32_t probability;<br>
     union user_action_cookie cookie;<br>
<br>
-    if (!ofproto-&gt;sflow || flow-&gt;in_port == OFPP_NONE) {<br>
+    if (!ofproto-&gt;sflow || flow-&gt;in_port.ofp_port == OFPP_NONE) {<br>
         return 0;<br>
     }<br>
<br>
@@ -739,7 +739,7 @@ compose_ipfix_action(const struct ofproto_dpif *ofproto,<br>
     uint32_t probability;<br>
     union user_action_cookie cookie;<br>
<br>
-    if (!ofproto-&gt;ipfix || flow-&gt;in_port == OFPP_NONE) {<br>
+    if (!ofproto-&gt;ipfix || flow-&gt;in_port.ofp_port == OFPP_NONE) {<br>
         return;<br>
     }<br>
<br>
@@ -829,7 +829,7 @@ process_special(struct xlate_ctx *ctx, const struct flow *flow,<br>
 }<br>
<br>
 static void<br>
-compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
+compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,<br>
                         bool check_stp)<br>
 {<br>
     const struct ofport_dpif *ofport = get_ofp_port(ctx-&gt;ofproto, ofp_port);<br>
@@ -837,7 +837,7 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
     ovs_be16 flow_vlan_tci;<br>
     uint32_t flow_skb_mark;<br>
     uint8_t flow_nw_tos;<br>
-    uint32_t out_port, odp_port;<br>
+    odp_port_t out_port, odp_port;<br>
     uint8_t dscp;<br>
<br>
     /* If &#39;struct flow&#39; gets additional metadata, we&#39;ll need to zero it out<br>
@@ -866,7 +866,7 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
         }<br>
<br>
         ctx-&gt;ofproto = ofproto_dpif_cast(peer-&gt;up.ofproto);<br>
-        flow-&gt;in_port = peer-&gt;up.ofp_port;<br>
+        flow-&gt;in_port.ofp_port = peer-&gt;up.ofp_port;<br>
         flow-&gt;metadata = htonll(0);<br>
         memset(&amp;flow-&gt;tunnel, 0, sizeof flow-&gt;tunnel);<br>
         memset(flow-&gt;regs, 0, sizeof flow-&gt;regs);<br>
@@ -877,13 +877,13 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
             ctx-&gt;xout-&gt;slow = special;<br>
         } else if (may_receive(peer, ctx)) {<br>
             if (stp_forward_in_state(peer-&gt;stp_state)) {<br>
-                xlate_table_action(ctx, flow-&gt;in_port, 0, true);<br>
+                xlate_table_action(ctx, flow-&gt;in_port.ofp_port, 0, true);<br>
             } else {<br>
                 /* Forwarding is disabled by STP.  Let OFPP_NORMAL and the<br>
                  * learning action look at the packet, then drop it. */<br>
                 struct flow old_base_flow = ctx-&gt;base_flow;<br>
                 size_t old_size = ctx-&gt;xout-&gt;odp_actions.size;<br>
-                xlate_table_action(ctx, flow-&gt;in_port, 0, true);<br>
+                xlate_table_action(ctx, flow-&gt;in_port.ofp_port, 0, true);<br>
                 ctx-&gt;base_flow = old_base_flow;<br>
                 ctx-&gt;xout-&gt;odp_actions.size = old_size;<br>
             }<br>
@@ -932,7 +932,7 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
                                  &amp;ctx-&gt;xout-&gt;odp_actions);<br>
         flow-&gt;tunnel = flow_tnl; /* Restore tunnel metadata */<br>
     } else {<br>
-        uint16_t vlandev_port;<br>
+        ofp_port_t vlandev_port;<br>
         odp_port = ofport-&gt;odp_port;<br>
         vlandev_port = vsp_realdev_to_vlandev(ctx-&gt;ofproto, ofp_port,<br>
                                               flow-&gt;vlan_tci);<br>
@@ -945,7 +945,8 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
         flow-&gt;skb_mark &amp;= ~IPSEC_MARK;<br>
     }<br>
     commit_odp_actions(flow, &amp;ctx-&gt;base_flow, &amp;ctx-&gt;xout-&gt;odp_actions);<br>
-    nl_msg_put_u32(&amp;ctx-&gt;xout-&gt;odp_actions, OVS_ACTION_ATTR_OUTPUT, out_port);<br>
+    nl_msg_put_u32(&amp;ctx-&gt;xout-&gt;odp_actions, OVS_ACTION_ATTR_OUTPUT,<br>
+                   odp_to_u32(out_port));<br>
<br>
     ctx-&gt;sflow_odp_port = odp_port;<br>
     ctx-&gt;sflow_n_outputs++;<br>
@@ -959,7 +960,7 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port,<br>
 }<br>
<br>
 static void<br>
-compose_output_action(struct xlate_ctx *ctx, uint16_t ofp_port)<br>
+compose_output_action(struct xlate_ctx *ctx, ofp_port_t ofp_port)<br>
 {<br>
     compose_output_action__(ctx, ofp_port, true);<br>
 }<br>
@@ -1008,17 +1009,17 @@ ctx_rule_hooks(struct xlate_ctx *ctx, struct rule_dpif *rule,<br>
<br>
 static void<br>
 xlate_table_action(struct xlate_ctx *ctx,<br>
-                   uint16_t in_port, uint8_t table_id, bool may_packet_in)<br>
+                   ofp_port_t in_port, uint8_t table_id, bool may_packet_in)<br>
 {<br>
     if (ctx-&gt;recurse &lt; MAX_RESUBMIT_RECURSION) {<br>
         struct rule_dpif *rule;<br>
-        uint16_t old_in_port = ctx-&gt;xin-&gt;flow.in_port;<br>
+        ofp_port_t old_in_port = ctx-&gt;xin-&gt;flow.in_port.ofp_port;<br>
         uint8_t old_table_id = ctx-&gt;table_id;<br>
<br>
         ctx-&gt;table_id = table_id;<br>
<br>
         /* Look up a flow with &#39;in_port&#39; as the input port. */<br>
-        ctx-&gt;xin-&gt;flow.in_port = in_port;<br>
+        ctx-&gt;xin-&gt;flow.in_port.ofp_port = in_port;<br>
         rule = rule_dpif_lookup_in_table(ctx-&gt;ofproto, &amp;ctx-&gt;xin-&gt;flow,<br>
                                          &amp;ctx-&gt;xout-&gt;wc, table_id);<br>
<br>
@@ -1026,7 +1027,7 @@ xlate_table_action(struct xlate_ctx *ctx,<br>
<br>
         /* Restore the original input port.  Otherwise OFPP_NORMAL and<br>
          * OFPP_IN_PORT will have surprising behavior. */<br>
-        ctx-&gt;xin-&gt;flow.in_port = old_in_port;<br>
+        ctx-&gt;xin-&gt;flow.in_port.ofp_port = old_in_port;<br>
<br>
         rule = ctx_rule_hooks(ctx, rule, may_packet_in);<br>
<br>
@@ -1054,12 +1055,12 @@ static void<br>
 xlate_ofpact_resubmit(struct xlate_ctx *ctx,<br>
                       const struct ofpact_resubmit *resubmit)<br>
 {<br>
-    uint16_t in_port;<br>
+    ofp_port_t in_port;<br>
     uint8_t table_id;<br>
<br>
     in_port = resubmit-&gt;in_port;<br>
     if (in_port == OFPP_IN_PORT) {<br>
-        in_port = ctx-&gt;xin-&gt;flow.in_port;<br>
+        in_port = ctx-&gt;xin-&gt;flow.in_port.ofp_port;<br>
     }<br>
<br>
     table_id = resubmit-&gt;table_id;<br>
@@ -1076,9 +1077,9 @@ flood_packets(struct xlate_ctx *ctx, bool all)<br>
     struct ofport_dpif *ofport;<br>
<br>
     HMAP_FOR_EACH (ofport, up.hmap_node, &amp;ctx-&gt;ofproto-&gt;up.ports) {<br>
-        uint16_t ofp_port = ofport-&gt;up.ofp_port;<br>
+        ofp_port_t ofp_port = ofport-&gt;up.ofp_port;<br>
<br>
-        if (ofp_port == ctx-&gt;xin-&gt;flow.in_port) {<br>
+        if (ofp_port == ctx-&gt;xin-&gt;flow.in_port.ofp_port) {<br>
             continue;<br>
         }<br>
<br>
@@ -1247,18 +1248,19 @@ compose_dec_mpls_ttl_action(struct xlate_ctx *ctx)<br>
<br>
 static void<br>
 xlate_output_action(struct xlate_ctx *ctx,<br>
-                    uint16_t port, uint16_t max_len, bool may_packet_in)<br>
+                    ofp_port_t port, uint16_t max_len, bool may_packet_in)<br>
 {<br>
-    uint16_t prev_nf_output_iface = ctx-&gt;xout-&gt;nf_output_iface;<br>
+    ofp_port_t prev_nf_output_iface = ctx-&gt;xout-&gt;nf_output_iface;<br>
<br>
     ctx-&gt;xout-&gt;nf_output_iface = NF_OUT_DROP;<br>
<br>
     switch (port) {<br>
     case OFPP_IN_PORT:<br>
-        compose_output_action(ctx, ctx-&gt;xin-&gt;flow.in_port);<br>
+        compose_output_action(ctx, ctx-&gt;xin-&gt;flow.in_port.ofp_port);<br>
         break;<br>
     case OFPP_TABLE:<br>
-        xlate_table_action(ctx, ctx-&gt;xin-&gt;flow.in_port, 0, may_packet_in);<br>
+        xlate_table_action(ctx, ctx-&gt;xin-&gt;flow.in_port.ofp_port,<br>
+                           0, may_packet_in);<br>
         break;<br>
     case OFPP_NORMAL:<br>
         xlate_normal(ctx);<br>
@@ -1276,7 +1278,7 @@ xlate_output_action(struct xlate_ctx *ctx,<br>
         break;<br>
     case OFPP_LOCAL:<br>
     default:<br>
-        if (port != ctx-&gt;xin-&gt;flow.in_port) {<br>
+        if (port != ctx-&gt;xin-&gt;flow.in_port.ofp_port) {<br>
             compose_output_action(ctx, port);<br>
         } else {<br>
             xlate_report(ctx, &quot;skipping output to input port&quot;);<br>
@@ -1304,7 +1306,8 @@ xlate_output_reg_action(struct xlate_ctx *ctx,<br>
<br>
         memset(&amp;value, 0xff, sizeof value);<br>
         mf_write_subfield_flow(&amp;or-&gt;src, &amp;value, &amp;ctx-&gt;xout-&gt;wc.masks);<br>
-        xlate_output_action(ctx, port, or-&gt;max_len, false);<br>
+        xlate_output_action(ctx, uint_to_ofp(port),<br>
+                            or-&gt;max_len, false);<br>
     }<br>
 }<br>
<br>
@@ -1312,7 +1315,7 @@ static void<br>
 xlate_enqueue_action(struct xlate_ctx *ctx,<br>
                      const struct ofpact_enqueue *enqueue)<br>
 {<br>
-    uint16_t ofp_port = enqueue-&gt;port;<br>
+    ofp_port_t ofp_port = enqueue-&gt;port;<br>
     uint32_t queue_id = enqueue-&gt;queue;<br>
     uint32_t flow_priority, priority;<br>
     int error;<br>
@@ -1327,8 +1330,8 @@ xlate_enqueue_action(struct xlate_ctx *ctx,<br>
<br>
     /* Check output port. */<br>
     if (ofp_port == OFPP_IN_PORT) {<br>
-        ofp_port = ctx-&gt;xin-&gt;flow.in_port;<br>
-    } else if (ofp_port == ctx-&gt;xin-&gt;flow.in_port) {<br>
+        ofp_port = ctx-&gt;xin-&gt;flow.in_port.ofp_port;<br>
+    } else if (ofp_port == ctx-&gt;xin-&gt;flow.in_port.ofp_port) {<br>
         return;<br>
     }<br>
<br>
@@ -1361,7 +1364,7 @@ xlate_set_queue_action(struct xlate_ctx *ctx, uint32_t queue_id)<br>
 }<br>
<br>
 static bool<br>
-slave_enabled_cb(uint16_t ofp_port, void *ofproto_)<br>
+slave_enabled_cb(ofp_port_t ofp_port, void *ofproto_)<br>
 {<br>
     struct ofproto_dpif *ofproto = ofproto_;<br>
     struct ofport_dpif *port;<br>
@@ -1386,12 +1389,12 @@ static void<br>
 xlate_bundle_action(struct xlate_ctx *ctx,<br>
                     const struct ofpact_bundle *bundle)<br>
 {<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
<br>
     port = bundle_execute(bundle, &amp;ctx-&gt;xin-&gt;flow, &amp;ctx-&gt;xout-&gt;wc,<br>
                           slave_enabled_cb, ctx-&gt;ofproto);<br>
     if (bundle-&gt;dst.field) {<br>
-        nxm_reg_load(&amp;bundle-&gt;dst, port, &amp;ctx-&gt;xin-&gt;flow);<br>
+        nxm_reg_load(&amp;bundle-&gt;dst, ofp_to_u16(port), &amp;ctx-&gt;xin-&gt;flow);<br>
     } else {<br>
         xlate_output_action(ctx, port, 0, false);<br>
     }<br>
@@ -1968,17 +1971,17 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)<br>
         }<br>
     }<br>
<br>
-    in_port = get_ofp_port(ctx.ofproto, flow-&gt;in_port);<br>
+    in_port = get_ofp_port(ctx.ofproto, flow-&gt;in_port.ofp_port);<br>
     special = process_special(&amp;ctx, flow, in_port, ctx.xin-&gt;packet);<br>
     if (special) {<br>
         ctx.xout-&gt;slow = special;<br>
     } else {<br>
         static struct vlog_rate_limit trace_rl = VLOG_RATE_LIMIT_INIT(1, 1);<br>
         size_t sample_actions_len;<br>
-        uint32_t local_odp_port;<br>
+        odp_port_t local_odp_port;<br>
<br>
-        if (flow-&gt;in_port<br>
-            != vsp_realdev_to_vlandev(ctx.ofproto, flow-&gt;in_port,<br>
+        if (flow-&gt;in_port.ofp_port<br>
+            != vsp_realdev_to_vlandev(ctx.ofproto, flow-&gt;in_port.ofp_port,<br>
                                       flow-&gt;vlan_tci)) {<br>
             ctx.base_flow.vlan_tci = 0;<br>
         }<br>
diff --git a/ofproto/ofproto-dpif-xlate.h b/ofproto/ofproto-dpif-xlate.h<br>
index 9ee9b33..f5f0cd0 100644<br>
--- a/ofproto/ofproto-dpif-xlate.h<br>
+++ b/ofproto/ofproto-dpif-xlate.h<br>
@@ -37,7 +37,7 @@ struct xlate_out {<br>
     bool has_learn;             /* Actions include NXAST_LEARN? */<br>
     bool has_normal;            /* Actions output to OFPP_NORMAL? */<br>
     bool has_fin_timeout;       /* Actions include NXAST_FIN_TIMEOUT? */<br>
-    uint16_t nf_output_iface;   /* Output interface index for NetFlow. */<br>
+    ofp_port_t nf_output_iface; /* Output interface index for NetFlow. */<br>
     mirror_mask_t mirrors;      /* Bitmap of associated mirrors. */<br>
<br>
     uint64_t odp_actions_stub[256 / 8];<br>
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c<br>
index 194f5bd..d09318a 100644<br>
--- a/ofproto/ofproto-dpif.c<br>
+++ b/ofproto/ofproto-dpif.c<br>
@@ -277,17 +277,17 @@ struct priority_to_dscp {<br>
 struct vlan_splinter {<br>
     struct hmap_node realdev_vid_node;<br>
     struct hmap_node vlandev_node;<br>
-    uint16_t realdev_ofp_port;<br>
-    uint16_t vlandev_ofp_port;<br>
+    ofp_port_t realdev_ofp_port;<br>
+    ofp_port_t vlandev_ofp_port;<br>
     int vid;<br>
 };<br>
<br>
 static bool vsp_adjust_flow(const struct ofproto_dpif *, struct flow *);<br>
 static void vsp_remove(struct ofport_dpif *);<br>
-static void vsp_add(struct ofport_dpif *, uint16_t realdev_ofp_port, int vid);<br>
+static void vsp_add(struct ofport_dpif *, ofp_port_t realdev_ofp_port, int vid);<br>
<br>
-static uint16_t odp_port_to_ofp_port(const struct ofproto_dpif *,<br>
-                                     uint32_t odp_port);<br>
+static ofp_port_t odp_port_to_ofp_port(const struct ofproto_dpif *,<br>
+                                       odp_port_t odp_port);<br>
<br>
 static struct ofport_dpif *<br>
 ofport_dpif_cast(const struct ofport *ofport)<br>
@@ -395,7 +395,7 @@ static struct shash all_dpif_backers = SHASH_INITIALIZER(&amp;all_dpif_backers);<br>
<br>
 static void drop_key_clear(struct dpif_backer *);<br>
 static struct ofport_dpif *<br>
-odp_port_to_ofport(const struct dpif_backer *, uint32_t odp_port);<br>
+odp_port_to_ofport(const struct dpif_backer *, odp_port_t odp_port);<br>
 static void update_moving_averages(struct dpif_backer *backer);<br>
<br>
 /* Defer flow mod completion until &quot;ovs-appctl ofproto/unclog&quot;?  (Useful only<br>
@@ -419,7 +419,6 @@ static void send_netflow_active_timeouts(struct ofproto_dpif *);<br>
<br>
 /* Utilities. */<br>
 static int send_packet(const struct ofport_dpif *, struct ofpbuf *packet);<br>
-<br>
 /* Global variables. */<br>
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);<br>
<br>
@@ -583,17 +582,19 @@ type_run(const char *type)<br>
                 } else {<br>
                     node = simap_find(&amp;backer-&gt;tnl_backers, dp_port);<br>
                     if (!node) {<br>
-                        uint32_t odp_port = UINT32_MAX;<br>
+                        odp_port_t odp_port = OVSP_NONE;<br>
<br>
                         if (!dpif_port_add(backer-&gt;dpif, iter-&gt;up.netdev,<br>
                                            &amp;odp_port)) {<br>
-                            simap_put(&amp;backer-&gt;tnl_backers, dp_port, odp_port);<br>
+                            simap_put(&amp;backer-&gt;tnl_backers, dp_port,<br>
+                                      odp_to_u32(odp_port));<br>
                             node = simap_find(&amp;backer-&gt;tnl_backers, dp_port);<br>
                         }<br>
                     }<br>
                 }<br>
<br>
-                iter-&gt;odp_port = node ? node-&gt;data : OVSP_NONE;<br>
+                iter-&gt;odp_port = node ? uint_to_odp(node-&gt;data)<br>
+                                        : OVSP_NONE;<br>
                 if (tnl_port_reconfigure(&amp;iter-&gt;up, iter-&gt;odp_port,<br>
                                          &amp;iter-&gt;tnl_port)) {<br>
                     backer-&gt;need_revalidate = REV_RECONFIGURE;<br>
@@ -602,7 +603,7 @@ type_run(const char *type)<br>
         }<br>
<br>
         SIMAP_FOR_EACH (node, &amp;tmp_backers) {<br>
-            dpif_port_del(backer-&gt;dpif, node-&gt;data);<br>
+            dpif_port_del(backer-&gt;dpif, uint_to_odp(node-&gt;data));<br>
         }<br>
         simap_destroy(&amp;tmp_backers);<br>
<br>
@@ -876,7 +877,7 @@ close_dpif_backer(struct dpif_backer *backer)<br>
 /* Datapath port slated for removal from datapath. */<br>
 struct odp_garbage {<br>
     struct list list_node;<br>
-    uint32_t odp_port;<br>
+    odp_port_t odp_port;<br>
 };<br>
<br>
 static int<br>
@@ -1002,7 +1003,7 @@ construct(struct ofproto *ofproto_)<br>
 {<br>
     struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);<br>
     struct shash_node *node, *next;<br>
-    int max_ports;<br>
+    odp_port_t max_ports;<br>
     int error;<br>
     int i;<br>
<br>
@@ -1012,7 +1013,8 @@ construct(struct ofproto *ofproto_)<br>
     }<br>
<br>
     max_ports = dpif_get_max_ports(ofproto-&gt;backer-&gt;dpif);<br>
-    ofproto_init_max_ports(ofproto_, MIN(max_ports, OFPP_MAX));<br>
+    ofproto_init_max_ports(ofproto_, uint_to_ofp(MIN(odp_to_u32(max_ports),<br>
+                                                     ofp_to_u16(OFPP_MAX))));<br>
<br>
     ofproto-&gt;netflow = NULL;<br>
     ofproto-&gt;sflow = NULL;<br>
@@ -1493,7 +1495,7 @@ port_construct(struct ofport *port_)<br>
         }<br>
<br>
         hmap_insert(&amp;ofproto-&gt;backer-&gt;odp_to_ofport_map, &amp;port-&gt;odp_port_node,<br>
-                    hash_int(port-&gt;odp_port, 0));<br>
+                    hash_odp_port(port-&gt;odp_port, 0));<br>
     }<br>
     dpif_port_destroy(&amp;dpif_port);<br>
<br>
@@ -2162,7 +2164,7 @@ bundle_del_port(struct ofport_dpif *port)<br>
 }<br>
<br>
 static bool<br>
-bundle_add_port(struct ofbundle *bundle, uint16_t ofp_port,<br>
+bundle_add_port(struct ofbundle *bundle, ofp_port_t ofp_port,<br>
                 struct lacp_slave_settings *lacp)<br>
 {<br>
     struct ofport_dpif *port;<br>
@@ -2805,14 +2807,14 @@ set_mac_table_config(struct ofproto *ofproto_, unsigned int idle_time,<br>
 /* Ports. */<br>
<br>
 struct ofport_dpif *<br>
-get_ofp_port(const struct ofproto_dpif *ofproto, uint16_t ofp_port)<br>
+get_ofp_port(const struct ofproto_dpif *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(&amp;ofproto-&gt;up, ofp_port);<br>
     return ofport ? ofport_dpif_cast(ofport) : NULL;<br>
 }<br>
<br>
 struct ofport_dpif *<br>
-get_odp_port(const struct ofproto_dpif *ofproto, uint32_t odp_port)<br>
+get_odp_port(const struct ofproto_dpif *ofproto, odp_port_t odp_port)<br>
 {<br>
     struct ofport_dpif *port = odp_port_to_ofport(ofproto-&gt;backer, odp_port);<br>
     return port &amp;&amp; &amp;ofproto-&gt;up == port-&gt;up.ofproto ? port : NULL;<br>
@@ -2993,7 +2995,7 @@ port_add(struct ofproto *ofproto_, struct netdev *netdev)<br>
<br>
     dp_port_name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf);<br>
     if (!dpif_port_exists(ofproto-&gt;backer-&gt;dpif, dp_port_name)) {<br>
-        uint32_t port_no = UINT32_MAX;<br>
+        odp_port_t port_no = OVSP_NONE;<br>
         int error;<br>
<br>
         error = dpif_port_add(ofproto-&gt;backer-&gt;dpif, netdev, &amp;port_no);<br>
@@ -3001,7 +3003,8 @@ port_add(struct ofproto *ofproto_, struct netdev *netdev)<br>
             return error;<br>
         }<br>
         if (netdev_get_tunnel_config(netdev)) {<br>
-            simap_put(&amp;ofproto-&gt;backer-&gt;tnl_backers, dp_port_name, port_no);<br>
+            simap_put(&amp;ofproto-&gt;backer-&gt;tnl_backers,<br>
+                      dp_port_name, odp_to_u32(port_no));<br>
         }<br>
     }<br>
<br>
@@ -3014,7 +3017,7 @@ port_add(struct ofproto *ofproto_, struct netdev *netdev)<br>
 }<br>
<br>
 static int<br>
-port_del(struct ofproto *ofproto_, uint16_t ofp_port)<br>
+port_del(struct ofproto *ofproto_, ofp_port_t ofp_port)<br>
 {<br>
     struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);<br>
     struct ofport_dpif *ofport = get_ofp_port(ofproto, ofp_port);<br>
@@ -3260,8 +3263,8 @@ static void<br>
 init_flow_miss_execute_op(struct flow_miss *miss, struct ofpbuf *packet,<br>
                           struct flow_miss_op *op)<br>
 {<br>
-    if (miss-&gt;flow.in_port<br>
-        != vsp_realdev_to_vlandev(miss-&gt;ofproto, miss-&gt;flow.in_port,<br>
+    if (miss-&gt;flow.in_port.ofp_port<br>
+        != vsp_realdev_to_vlandev(miss-&gt;ofproto, miss-&gt;flow.in_port.ofp_port,<br>
                                   miss-&gt;flow.vlan_tci)) {<br>
         /* This packet was received on a VLAN splinter port.  We<br>
          * added a VLAN to the packet to make the packet resemble<br>
@@ -3566,7 +3569,7 @@ static int<br>
 ofproto_receive(const struct dpif_backer *backer, struct ofpbuf *packet,<br>
                 const struct nlattr *key, size_t key_len,<br>
                 struct flow *flow, enum odp_key_fitness *fitnessp,<br>
-                struct ofproto_dpif **ofproto, uint32_t *odp_in_port)<br>
+                struct ofproto_dpif **ofproto, odp_port_t *odp_in_port)<br>
 {<br>
     const struct ofport_dpif *port;<br>
     enum odp_key_fitness fitness;<br>
@@ -3579,13 +3582,13 @@ ofproto_receive(const struct dpif_backer *backer, struct ofpbuf *packet,<br>
     }<br>
<br>
     if (odp_in_port) {<br>
-        *odp_in_port = flow-&gt;in_port;<br>
+        *odp_in_port = flow-&gt;in_port.odp_port;<br>
     }<br>
<br>
     port = (tnl_port_should_receive(flow)<br>
             ? ofport_dpif_cast(tnl_port_receive(flow))<br>
-            : odp_port_to_ofport(backer, flow-&gt;in_port));<br>
-    flow-&gt;in_port = port ? port-&gt;up.ofp_port : OFPP_NONE;<br>
+            : odp_port_to_ofport(backer, flow-&gt;in_port.odp_port));<br>
+    flow-&gt;in_port.ofp_port = port ? port-&gt;up.ofp_port : OFPP_NONE;<br>
     if (!port) {<br>
         goto exit;<br>
     }<br>
@@ -3660,7 +3663,7 @@ handle_miss_upcalls(struct dpif_backer *backer, struct dpif_upcall *upcalls,<br>
         struct flow_miss *miss = &amp;misses[n_misses];<br>
         struct flow_miss *existing_miss;<br>
         struct ofproto_dpif *ofproto;<br>
-        uint32_t odp_in_port;<br>
+        odp_port_t odp_in_port;<br>
         struct flow flow;<br>
         uint32_t hash;<br>
         int error;<br>
@@ -3699,7 +3702,7 @@ handle_miss_upcalls(struct dpif_backer *backer, struct dpif_upcall *upcalls,<br>
<br>
         ofproto-&gt;n_missed++;<br>
         flow_extract(upcall-&gt;packet, flow.skb_priority, flow.skb_mark,<br>
-                     &amp;flow.tunnel, flow.in_port, &amp;miss-&gt;flow);<br>
+                     &amp;flow.tunnel, &amp;flow.in_port, &amp;miss-&gt;flow);<br>
<br>
         /* Add other packets to a to-do list. */<br>
         hash = flow_hash(&amp;miss-&gt;flow, 0);<br>
@@ -3803,7 +3806,7 @@ handle_sflow_upcall(struct dpif_backer *backer,<br>
     struct ofproto_dpif *ofproto;<br>
     union user_action_cookie cookie;<br>
     struct flow flow;<br>
-    uint32_t odp_in_port;<br>
+    odp_port_t odp_in_port;<br>
<br>
     if (ofproto_receive(backer, upcall-&gt;packet, upcall-&gt;key, upcall-&gt;key_len,<br>
                         &amp;flow, NULL, &amp;ofproto, &amp;odp_in_port)<br>
@@ -4347,7 +4350,7 @@ execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow *flow,<br>
<br>
     ofpbuf_use_stack(&amp;key, &amp;keybuf, sizeof keybuf);<br>
     odp_flow_key_from_flow(&amp;key, flow,<br>
-                           ofp_port_to_odp_port(ofproto, flow-&gt;in_port));<br>
+                           ofp_port_to_odp_port(ofproto, flow-&gt;in_port.ofp_port));<br>
<br>
     error = dpif_execute(ofproto-&gt;backer-&gt;dpif, key.data, key.size,<br>
                          odp_actions, actions_len, packet);<br>
@@ -4445,7 +4448,8 @@ facet_account(struct facet *facet)<br>
<br>
         switch (nl_attr_type(a)) {<br>
         case OVS_ACTION_ATTR_OUTPUT:<br>
-            port = get_odp_port(ofproto, nl_attr_get_u32(a));<br>
+            port = get_odp_port(ofproto,<br>
+                                uint_to_odp(nl_attr_get_u32(a)));<br>
             if (port &amp;&amp; port-&gt;bundle &amp;&amp; port-&gt;bundle-&gt;bond) {<br>
                 bond_account(port-&gt;bundle-&gt;bond, &amp;facet-&gt;flow,<br>
                              vlan_tci_to_vid(vlan_tci), n_bytes);<br>
@@ -4768,7 +4772,7 @@ facet_push_stats(struct facet *facet, bool may_learn)<br>
         facet-&gt;prev_byte_count = facet-&gt;byte_count;<br>
         facet-&gt;prev_used = facet-&gt;used;<br>
<br>
-        in_port = get_ofp_port(ofproto, facet-&gt;flow.in_port);<br>
+        in_port = get_ofp_port(ofproto, facet-&gt;flow.in_port.ofp_port);<br>
         if (in_port &amp;&amp; in_port-&gt;tnl_port) {<br>
             netdev_vport_inc_rx(in_port-&gt;up.netdev, &amp;stats);<br>
         }<br>
@@ -5122,9 +5126,10 @@ rule_dpif_miss_rule(struct ofproto_dpif *ofproto, const struct flow *flow)<br>
 {<br>
     struct ofport_dpif *port;<br>
<br>
-    port = get_ofp_port(ofproto, flow-&gt;in_port);<br>
+    port = get_ofp_port(ofproto, flow-&gt;in_port.ofp_port);<br>
     if (!port) {<br>
-        VLOG_WARN_RL(&amp;rl, &quot;packet-in on unknown port %&quot;PRIu16, flow-&gt;in_port);<br>
+        VLOG_WARN_RL(&amp;rl, &quot;packet-in on unknown OpenFlow port %&quot;PRIu16,<br>
+                     flow-&gt;in_port.ofp_port);<br>
         return ofproto-&gt;miss_rule;<br>
     }<br>
<br>
@@ -5296,13 +5301,15 @@ send_packet(const struct ofport_dpif *ofport, struct ofpbuf *packet)<br>
     struct xlate_out xout;<br>
     struct xlate_in xin;<br>
     struct flow flow;<br>
+    union flow_in_port in_port_;<br>
     int error;<br>
<br>
     ofpbuf_use_stub(&amp;odp_actions, odp_actions_stub, sizeof odp_actions_stub);<br>
     ofpbuf_use_stack(&amp;key, &amp;keybuf, sizeof keybuf);<br>
<br>
     /* Use OFPP_NONE as the in_port to avoid special packet processing. */<br>
-    flow_extract(packet, 0, 0, NULL, OFPP_NONE, &amp;flow);<br>
+    in_port_.ofp_port = OFPP_NONE;<br>
+    flow_extract(packet, 0, 0, NULL, &amp;in_port_, &amp;flow);<br>
     odp_flow_key_from_flow(&amp;key, &amp;flow, ofp_port_to_odp_port(ofproto,<br>
                                                              OFPP_LOCAL));<br>
     dpif_flow_stats_extract(&amp;flow, packet, time_msec(), &amp;stats);<br>
@@ -5359,7 +5366,8 @@ compose_slow_path(const struct ofproto_dpif *ofproto, const struct flow *flow,<br>
<br>
     ofpbuf_use_stack(&amp;buf, stub, stub_size);<br>
     if (slow &amp; (SLOW_CFM | SLOW_BFD | SLOW_LACP | SLOW_STP)) {<br>
-        uint32_t pid = dpif_port_get_pid(ofproto-&gt;backer-&gt;dpif, UINT32_MAX);<br>
+        uint32_t pid = dpif_port_get_pid(ofproto-&gt;backer-&gt;dpif,<br>
+                                         OVSP_NONE);<br>
         odp_put_userspace_action(pid, &amp;cookie, sizeof cookie.slow_path, &amp;buf);<br>
     } else {<br>
         put_userspace_action(ofproto, &amp;buf, flow, &amp;cookie,<br>
@@ -5379,7 +5387,8 @@ put_userspace_action(const struct ofproto_dpif *ofproto,<br>
     uint32_t pid;<br>
<br>
     pid = dpif_port_get_pid(ofproto-&gt;backer-&gt;dpif,<br>
-                            ofp_port_to_odp_port(ofproto, flow-&gt;in_port));<br>
+                            ofp_port_to_odp_port(ofproto,<br>
+                                                 flow-&gt;in_port.ofp_port));<br>
<br>
     return odp_put_userspace_action(pid, cookie, cookie_size, odp_actions);<br>
 }<br>
@@ -5555,7 +5564,8 @@ packet_out(struct ofproto *ofproto_, struct ofpbuf *packet,<br>
<br>
     ofpbuf_use_stack(&amp;key, &amp;keybuf, sizeof keybuf);<br>
     odp_flow_key_from_flow(&amp;key, flow,<br>
-                           ofp_port_to_odp_port(ofproto, flow-&gt;in_port));<br>
+                           ofp_port_to_odp_port(ofproto,<br>
+                                      flow-&gt;in_port.ofp_port));<br>
<br>
     dpif_flow_stats_extract(flow, packet, time_msec(), &amp;stats);<br>
<br>
@@ -5887,6 +5897,9 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[],<br>
         if (!packet-&gt;size) {<br>
             flow_compose(packet, &amp;flow);<br>
         } else {<br>
+            union flow_in_port in_port_;<br>
+<br>
+            in_port_ = flow.in_port;<br>
             ds_put_cstr(&amp;result, &quot;Packet: &quot;);<br>
             s = ofp_packet_to_string(packet-&gt;data, packet-&gt;size);<br>
             ds_put_cstr(&amp;result, s);<br>
@@ -5895,7 +5908,7 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[],<br>
             /* Use the metadata from the flow and the packet argument<br>
              * to reconstruct the flow. */<br>
             flow_extract(packet, flow.skb_priority, flow.skb_mark, NULL,<br>
-                         flow.in_port, &amp;flow);<br>
+                         &amp;in_port_, &amp;flow);<br>
         }<br>
     }<br>
<br>
@@ -6160,7 +6173,7 @@ dpif_show_backer(const struct dpif_backer *backer, struct ds *ds)<br>
             const struct shash_node *node = ports[j];<br>
             struct ofport *ofport = node-&gt;data;<br>
             struct smap config;<br>
-            uint32_t odp_port;<br>
+            odp_port_t odp_port;<br>
<br>
             ds_put_format(ds, &quot;\t\t%s %u/&quot;, netdev_get_name(ofport-&gt;netdev),<br>
                           ofport-&gt;ofp_port);<br>
@@ -6393,7 +6406,7 @@ ofproto_dpif_unixctl_init(void)<br>
  * widespread use, we will delete these interfaces. */<br>
<br>
 static int<br>
-set_realdev(struct ofport *ofport_, uint16_t realdev_ofp_port, int vid)<br>
+set_realdev(struct ofport *ofport_, ofp_port_t realdev_ofp_port, int vid)<br>
 {<br>
     struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofport_-&gt;ofproto);<br>
     struct ofport_dpif *ofport = ofport_dpif_cast(ofport_);<br>
@@ -6425,9 +6438,9 @@ set_realdev(struct ofport *ofport_, uint16_t realdev_ofp_port, int vid)<br>
 }<br>
<br>
 static uint32_t<br>
-hash_realdev_vid(uint16_t realdev_ofp_port, int vid)<br>
+hash_realdev_vid(ofp_port_t realdev_ofp_port, int vid)<br>
 {<br>
-    return hash_2words(realdev_ofp_port, vid);<br>
+    return hash_2words(ofp_to_u16(realdev_ofp_port), vid);<br>
 }<br>
<br>
 /* Returns the OFP port number of the Linux VLAN device that corresponds to<br>
@@ -6437,9 +6450,9 @@ hash_realdev_vid(uint16_t realdev_ofp_port, int vid)<br>
  *<br>
  * Unless VLAN splinters are enabled for port &#39;realdev_ofp_port&#39;, this<br>
  * function just returns its &#39;realdev_ofp_port&#39; argument. */<br>
-uint16_t<br>
+ofp_port_t<br>
 vsp_realdev_to_vlandev(const struct ofproto_dpif *ofproto,<br>
-                       uint16_t realdev_ofp_port, ovs_be16 vlan_tci)<br>
+                       ofp_port_t realdev_ofp_port, ovs_be16 vlan_tci)<br>
 {<br>
     if (!hmap_is_empty(&amp;ofproto-&gt;realdev_vid_map)) {<br>
         int vid = vlan_tci_to_vid(vlan_tci);<br>
@@ -6458,11 +6471,12 @@ vsp_realdev_to_vlandev(const struct ofproto_dpif *ofproto,<br>
 }<br>
<br>
 static struct vlan_splinter *<br>
-vlandev_find(const struct ofproto_dpif *ofproto, uint16_t vlandev_ofp_port)<br>
+vlandev_find(const struct ofproto_dpif *ofproto, ofp_port_t vlandev_ofp_port)<br>
 {<br>
     struct vlan_splinter *vsp;<br>
<br>
-    HMAP_FOR_EACH_WITH_HASH (vsp, vlandev_node, hash_int(vlandev_ofp_port, 0),<br>
+    HMAP_FOR_EACH_WITH_HASH (vsp, vlandev_node,<br>
+                             hash_ofp_port(vlandev_ofp_port, 0),<br>
                              &amp;ofproto-&gt;vlandev_map) {<br>
         if (vsp-&gt;vlandev_ofp_port == vlandev_ofp_port) {<br>
             return vsp;<br>
@@ -6481,9 +6495,9 @@ vlandev_find(const struct ofproto_dpif *ofproto, uint16_t vlandev_ofp_port)<br>
  * Returns 0 and does not modify &#39;*vid&#39; if &#39;vlandev_ofp_port&#39; is not a Linux<br>
  * VLAN device.  Unless VLAN splinters are enabled, this is what this function<br>
  * always does.*/<br>
-static uint16_t<br>
+static ofp_port_t<br>
 vsp_vlandev_to_realdev(const struct ofproto_dpif *ofproto,<br>
-                       uint16_t vlandev_ofp_port, int *vid)<br>
+                       ofp_port_t vlandev_ofp_port, int *vid)<br>
 {<br>
     if (!hmap_is_empty(&amp;ofproto-&gt;vlandev_map)) {<br>
         const struct vlan_splinter *vsp;<br>
@@ -6508,17 +6522,17 @@ vsp_vlandev_to_realdev(const struct ofproto_dpif *ofproto,<br>
 static bool<br>
 vsp_adjust_flow(const struct ofproto_dpif *ofproto, struct flow *flow)<br>
 {<br>
-    uint16_t realdev;<br>
+    ofp_port_t realdev;<br>
     int vid;<br>
<br>
-    realdev = vsp_vlandev_to_realdev(ofproto, flow-&gt;in_port, &amp;vid);<br>
+    realdev = vsp_vlandev_to_realdev(ofproto, flow-&gt;in_port.ofp_port, &amp;vid);<br>
     if (!realdev) {<br>
         return false;<br>
     }<br>
<br>
     /* Cause the flow to be processed as if it came in on the real device with<br>
      * the VLAN device&#39;s VLAN ID. */<br>
-    flow-&gt;in_port = realdev;<br>
+    flow-&gt;in_port.ofp_port = realdev;<br>
     flow-&gt;vlan_tci = htons((vid &amp; VLAN_VID_MASK) | VLAN_CFI);<br>
     return true;<br>
 }<br>
@@ -6542,7 +6556,7 @@ vsp_remove(struct ofport_dpif *port)<br>
 }<br>
<br>
 static void<br>
-vsp_add(struct ofport_dpif *port, uint16_t realdev_ofp_port, int vid)<br>
+vsp_add(struct ofport_dpif *port, ofp_port_t realdev_ofp_port, int vid)<br>
 {<br>
     struct ofproto_dpif *ofproto = ofproto_dpif_cast(port-&gt;up.ofproto);<br>
<br>
@@ -6553,7 +6567,7 @@ vsp_add(struct ofport_dpif *port, uint16_t realdev_ofp_port, int vid)<br>
<br>
         vsp = xmalloc(sizeof *vsp);<br>
         hmap_insert(&amp;ofproto-&gt;vlandev_map, &amp;vsp-&gt;vlandev_node,<br>
-                    hash_int(port-&gt;up.ofp_port, 0));<br>
+                    hash_ofp_port(port-&gt;up.ofp_port, 0));<br>
         hmap_insert(&amp;ofproto-&gt;realdev_vid_map, &amp;vsp-&gt;realdev_vid_node,<br>
                     hash_realdev_vid(realdev_ofp_port, vid));<br>
         vsp-&gt;realdev_ofp_port = realdev_ofp_port;<br>
@@ -6566,20 +6580,20 @@ vsp_add(struct ofport_dpif *port, uint16_t realdev_ofp_port, int vid)<br>
     }<br>
 }<br>
<br>
-uint32_t<br>
-ofp_port_to_odp_port(const struct ofproto_dpif *ofproto, uint16_t ofp_port)<br>
+odp_port_t<br>
+ofp_port_to_odp_port(const struct ofproto_dpif *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     const struct ofport_dpif *ofport = get_ofp_port(ofproto, ofp_port);<br>
     return ofport ? ofport-&gt;odp_port : OVSP_NONE;<br>
 }<br>
<br>
 static struct ofport_dpif *<br>
-odp_port_to_ofport(const struct dpif_backer *backer, uint32_t odp_port)<br>
+odp_port_to_ofport(const struct dpif_backer *backer, odp_port_t odp_port)<br>
 {<br>
     struct ofport_dpif *port;<br>
<br>
     HMAP_FOR_EACH_IN_BUCKET (port, odp_port_node,<br>
-                             hash_int(odp_port, 0),<br>
+                             hash_odp_port(odp_port, 0),<br>
                              &amp;backer-&gt;odp_to_ofport_map) {<br>
         if (port-&gt;odp_port == odp_port) {<br>
             return port;<br>
@@ -6589,8 +6603,8 @@ odp_port_to_ofport(const struct dpif_backer *backer, uint32_t odp_port)<br>
     return NULL;<br>
 }<br>
<br>
-static uint16_t<br>
-odp_port_to_ofp_port(const struct ofproto_dpif *ofproto, uint32_t odp_port)<br>
+static ofp_port_t<br>
+odp_port_to_ofp_port(const struct ofproto_dpif *ofproto, odp_port_t odp_port)<br>
 {<br>
     struct ofport_dpif *port;<br>
<br>
diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h<br>
index 3852fa8..8b38251 100644<br>
--- a/ofproto/ofproto-dpif.h<br>
+++ b/ofproto/ofproto-dpif.h<br>
@@ -127,7 +127,7 @@ struct ofport_dpif {<br>
     struct hmap_node odp_port_node; /* In dpif_backer&#39;s &quot;odp_to_ofport_map&quot;. */<br>
     struct ofport up;<br>
<br>
-    uint32_t odp_port;<br>
+    odp_port_t odp_port;<br>
     struct ofbundle *bundle;    /* Bundle that contains this port, if any. */<br>
     struct list bundle_node;    /* In struct ofbundle&#39;s &quot;ports&quot; list. */<br>
     struct cfm *cfm;            /* Connectivity Fault Management, if any. */<br>
@@ -150,7 +150,7 @@ struct ofport_dpif {<br>
      * drivers in old versions of Linux that do not properly support VLANs when<br>
      * VLAN devices are not used.  When broken device drivers are no longer in<br>
      * widespread use, we will delete these interfaces. */<br>
-    uint16_t realdev_ofp_port;<br>
+    ofp_port_t realdev_ofp_port;<br>
     int vlandev_vid;<br>
 };<br>
<br>
@@ -227,14 +227,15 @@ mirror_mask_ffs(mirror_mask_t mask)<br>
 }<br>
<br>
 struct ofport_dpif *get_ofp_port(const struct ofproto_dpif *,<br>
-                                 uint16_t ofp_port);<br>
+                                 ofp_port_t ofp_port);<br>
<br>
 struct ofport_dpif *get_odp_port(const struct ofproto_dpif *,<br>
-                                        uint32_t odp_port);<br>
+                                        odp_port_t odp_port);<br>
<br>
 struct ofport_dpif *ofport_get_peer(const struct ofport_dpif *);<br>
<br>
-uint32_t ofp_port_to_odp_port(const struct ofproto_dpif *, uint16_t ofp_port);<br>
+odp_port_t ofp_port_to_odp_port(const struct ofproto_dpif *,<br>
+                              ofp_port_t ofp_port);<br>
<br>
 struct rule_dpif *rule_dpif_lookup_in_table(struct ofproto_dpif *,<br>
                                             const struct flow *,<br>
@@ -261,9 +262,9 @@ bool stp_should_process_flow(const struct flow *, struct flow_wildcards *);<br>
 void stp_process_packet(const struct ofport_dpif *,<br>
                         const struct ofpbuf *packet);<br>
<br>
-uint16_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,<br>
-                                uint16_t realdev_ofp_port,<br>
-                                ovs_be16 vlan_tci);<br>
+ofp_port_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,<br>
+                                  ofp_port_t realdev_ofp_port,<br>
+                                  ovs_be16 vlan_tci);<br>
<br>
 bool ofproto_dpif_dscp_from_priority(const struct ofport_dpif *,<br>
                                      uint32_t priority, uint8_t *dscp);<br>
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h<br>
index 23d9180..93b6025 100644<br>
--- a/ofproto/ofproto-provider.h<br>
+++ b/ofproto/ofproto-provider.h<br>
@@ -62,8 +62,8 @@ struct ofproto {<br>
     struct shash port_by_name;<br>
     unsigned long *ofp_port_ids;/* Bitmap of used OpenFlow port numbers. */<br>
     struct simap ofp_requests;  /* OpenFlow port number requests. */<br>
-    uint16_t alloc_port_no;     /* Last allocated OpenFlow port number. */<br>
-    uint16_t max_ports;         /* Max possible OpenFlow port num, plus one. */<br>
+    ofp_port_t alloc_port_no;   /* Last allocated OpenFlow port number. */<br>
+    ofp_port_t max_ports;       /* Max possible OpenFlow port num, plus one. */<br>
<br>
     /* Flow tables. */<br>
     struct oftable *tables;<br>
@@ -100,10 +100,10 @@ struct ofproto {<br>
 };<br>
<br>
 void ofproto_init_tables(struct ofproto *, int n_tables);<br>
-void ofproto_init_max_ports(struct ofproto *, uint16_t max_ports);<br>
+void ofproto_init_max_ports(struct ofproto *, ofp_port_t max_ports);<br>
<br>
 struct ofproto *ofproto_lookup(const char *name);<br>
-struct ofport *ofproto_get_port(const struct ofproto *, uint16_t ofp_port);<br>
+struct ofport *ofproto_get_port(const struct ofproto *, ofp_port_t ofp_port);<br>
<br>
 /* An OpenFlow port within a &quot;struct ofproto&quot;.<br>
  *<br>
@@ -114,7 +114,7 @@ struct ofport {<br>
     struct ofproto *ofproto;    /* The ofproto that contains this port. */<br>
     struct netdev *netdev;<br>
     struct ofputil_phy_port pp;<br>
-    uint16_t ofp_port;          /* OpenFlow port number. */<br>
+    ofp_port_t ofp_port;        /* OpenFlow port number. */<br>
     unsigned int change_seq;<br>
     long long int created;      /* Time created, in msec. */<br>
     int mtu;<br>
@@ -244,12 +244,12 @@ void ofproto_rule_update_used(struct rule *, long long int used);<br>
 void ofproto_rule_expire(struct rule *, uint8_t reason);<br>
 void ofproto_rule_destroy(struct rule *);<br>
<br>
-bool ofproto_rule_has_out_port(const struct rule *, uint16_t out_port);<br>
+bool ofproto_rule_has_out_port(const struct rule *, ofp_port_t out_port);<br>
<br>
 void ofoperation_complete(struct ofoperation *, enum ofperr);<br>
 struct rule *ofoperation_get_victim(struct ofoperation *);<br>
<br>
-bool ofoperation_has_out_port(const struct ofoperation *, uint16_t out_port);<br>
+bool ofoperation_has_out_port(const struct ofoperation *, ofp_port_t out_port);<br>
<br>
 bool ofproto_rule_is_hidden(const struct rule *);<br>
<br>
@@ -690,7 +690,7 @@ struct ofproto_class {<br>
      * It doesn&#39;t matter whether the new port will be returned by a later call<br>
      * to -&gt;port_poll(); the implementation may do whatever is more<br>
      * convenient. */<br>
-    int (*port_del)(struct ofproto *ofproto, uint16_t ofp_port);<br>
+    int (*port_del)(struct ofproto *ofproto, ofp_port_t ofp_port);<br>
<br>
     /* Get port stats */<br>
     int (*port_get_stats)(const struct ofport *port,<br>
@@ -1316,7 +1316,7 @@ struct ofproto_class {<br>
      * This function should be NULL if a an implementation does not support<br>
      * it. */<br>
     int (*set_realdev)(struct ofport *ofport,<br>
-                       uint16_t realdev_ofp_port, int vid);<br>
+                       ofp_port_t realdev_ofp_port, int vid);<br>
 };<br>
<br>
 extern const struct ofproto_class ofproto_dpif_class;<br>
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c<br>
index 7f9a88f..22187e9 100644<br>
--- a/ofproto/ofproto.c<br>
+++ b/ofproto/ofproto.c<br>
@@ -448,7 +448,7 @@ ofproto_create(const char *datapath_name, const char *datapath_type,<br>
<br>
     /* The &quot;max_ports&quot; member should have been set by -&gt;construct(ofproto).<br>
      * Port 0 is not a valid OpenFlow port, so mark that as unavailable. */<br>
-    ofproto-&gt;ofp_port_ids = bitmap_allocate(ofproto-&gt;max_ports);<br>
+    ofproto-&gt;ofp_port_ids = bitmap_allocate(ofp_to_u16(ofproto-&gt;max_ports));<br>
     bitmap_set1(ofproto-&gt;ofp_port_ids, 0);<br>
<br>
     /* Check that hidden tables, if any, are at the end. */<br>
@@ -497,9 +497,9 @@ ofproto_init_tables(struct ofproto *ofproto, int n_tables)<br>
  * Reserved ports numbered OFPP_MAX and higher are special and not subject to<br>
  * the &#39;max_ports&#39; restriction. */<br>
 void<br>
-ofproto_init_max_ports(struct ofproto *ofproto, uint16_t max_ports)<br>
+ofproto_init_max_ports(struct ofproto *ofproto, ofp_port_t max_ports)<br>
 {<br>
-    ovs_assert(max_ports &lt;= OFPP_MAX);<br>
+    ovs_assert(ofp_to_u16(max_ports) &lt;= ofp_to_u16(OFPP_MAX));<br>
     ofproto-&gt;max_ports = max_ports;<br>
 }<br>
<br>
@@ -706,7 +706,7 @@ ofproto_get_stp_status(struct ofproto *ofproto,<br>
  *<br>
  * Returns 0 if successful, otherwise a positive errno value.*/<br>
 int<br>
-ofproto_port_set_stp(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_set_stp(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                      const struct ofproto_port_stp_settings *s)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
@@ -727,7 +727,7 @@ ofproto_port_set_stp(struct ofproto *ofproto, uint16_t ofp_port,<br>
  *<br>
  * Returns 0 if successful, otherwise a positive errno value.*/<br>
 int<br>
-ofproto_port_get_stp_status(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_get_stp_status(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                             struct ofproto_port_stp_status *s)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
@@ -752,7 +752,7 @@ ofproto_port_get_stp_status(struct ofproto *ofproto, uint16_t ofp_port,<br>
  *<br>
  * Returns 0 if successful, otherwise a positive errno value. */<br>
 int<br>
-ofproto_port_set_queues(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_set_queues(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                         const struct ofproto_port_queue *queues,<br>
                         size_t n_queues)<br>
 {<br>
@@ -773,7 +773,7 @@ ofproto_port_set_queues(struct ofproto *ofproto, uint16_t ofp_port,<br>
<br>
 /* Clears the CFM configuration from &#39;ofp_port&#39; on &#39;ofproto&#39;. */<br>
 void<br>
-ofproto_port_clear_cfm(struct ofproto *ofproto, uint16_t ofp_port)<br>
+ofproto_port_clear_cfm(struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
     if (ofport &amp;&amp; ofproto-&gt;ofproto_class-&gt;set_cfm) {<br>
@@ -788,7 +788,7 @@ ofproto_port_clear_cfm(struct ofproto *ofproto, uint16_t ofp_port)<br>
  *<br>
  * This function has no effect if &#39;ofproto&#39; does not have a port &#39;ofp_port&#39;. */<br>
 void<br>
-ofproto_port_set_cfm(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_set_cfm(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                      const struct cfm_settings *s)<br>
 {<br>
     struct ofport *ofport;<br>
@@ -817,7 +817,7 @@ ofproto_port_set_cfm(struct ofproto *ofproto, uint16_t ofp_port,<br>
 /* Configures BFD on &#39;ofp_port&#39; in &#39;ofproto&#39;.  This function has no effect if<br>
  * &#39;ofproto&#39; does not have a port &#39;ofp_port&#39;. */<br>
 void<br>
-ofproto_port_set_bfd(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_set_bfd(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                      const struct smap *cfg)<br>
 {<br>
     struct ofport *ofport;<br>
@@ -845,7 +845,7 @@ ofproto_port_set_bfd(struct ofproto *ofproto, uint16_t ofp_port,<br>
  * OVS database.  Has no effect if &#39;ofp_port&#39; is not na OpenFlow port in<br>
  * &#39;ofproto&#39;. */<br>
 int<br>
-ofproto_port_get_bfd_status(struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_get_bfd_status(struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                             struct smap *status)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
@@ -859,7 +859,7 @@ ofproto_port_get_bfd_status(struct ofproto *ofproto, uint16_t ofp_port,<br>
  * 0 if LACP partner information is not current (generally indicating a<br>
  * connectivity problem), or -1 if LACP is not enabled on &#39;ofp_port&#39;. */<br>
 int<br>
-ofproto_port_is_lacp_current(struct ofproto *ofproto, uint16_t ofp_port)<br>
+ofproto_port_is_lacp_current(struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
     return (ofport &amp;&amp; ofproto-&gt;ofproto_class-&gt;port_is_lacp_current<br>
@@ -1496,16 +1496,17 @@ ofproto_port_open_type(const char *datapath_type, const char *port_type)<br>
  * &#39;ofp_portp&#39; is non-null). */<br>
 int<br>
 ofproto_port_add(struct ofproto *ofproto, struct netdev *netdev,<br>
-                 uint16_t *ofp_portp)<br>
+                 ofp_port_t *ofp_portp)<br>
 {<br>
-    uint16_t ofp_port = ofp_portp ? *ofp_portp : OFPP_NONE;<br>
+    ofp_port_t ofp_port = ofp_portp ? *ofp_portp : OFPP_NONE;<br>
     int error;<br>
<br>
     error = ofproto-&gt;ofproto_class-&gt;port_add(ofproto, netdev);<br>
     if (!error) {<br>
         const char *netdev_name = netdev_get_name(netdev);<br>
<br>
-        simap_put(&amp;ofproto-&gt;ofp_requests, netdev_name, ofp_port);<br>
+        simap_put(&amp;ofproto-&gt;ofp_requests, netdev_name,<br>
+                  ofp_to_u16(ofp_port));<br>
         update_port(ofproto, netdev_name);<br>
     }<br>
     if (ofp_portp) {<br>
@@ -1541,7 +1542,7 @@ ofproto_port_query_by_name(const struct ofproto *ofproto, const char *devname,<br>
 /* Deletes port number &#39;ofp_port&#39; from the datapath for &#39;ofproto&#39;.<br>
  * Returns 0 if successful, otherwise a positive errno. */<br>
 int<br>
-ofproto_port_del(struct ofproto *ofproto, uint16_t ofp_port)<br>
+ofproto_port_del(struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
     const char *name = ofport ? netdev_get_name(ofport-&gt;netdev) : &quot;&lt;unknown&gt;&quot;;<br>
@@ -1678,26 +1679,28 @@ reinit_ports(struct ofproto *p)<br>
     sset_destroy(&amp;devnames);<br>
 }<br>
<br>
-static uint16_t<br>
+static ofp_port_t<br>
 alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name)<br>
 {<br>
-    uint16_t ofp_port;<br>
-    uint16_t end_port_no = ofproto-&gt;alloc_port_no;<br>
+    ofp_port_t ofp_port;<br>
+    ofp_port_t end_port_no = ofproto-&gt;alloc_port_no;<br>
<br>
-    ofp_port = simap_get(&amp;ofproto-&gt;ofp_requests, netdev_name);<br>
+    ofp_port = uint_to_ofp(simap_get(&amp;ofproto-&gt;ofp_requests, netdev_name));<br>
     ofp_port = ofp_port ? ofp_port : OFPP_NONE;<br>
<br>
-    if (ofp_port &gt;= ofproto-&gt;max_ports<br>
-            || bitmap_is_set(ofproto-&gt;ofp_port_ids, ofp_port)) {<br>
+    if (ofp_to_u16(ofp_port) &gt;= ofp_to_u16(ofproto-&gt;max_ports)<br>
+        || bitmap_is_set(ofproto-&gt;ofp_port_ids, ofp_to_u16(ofp_port))) {<br>
         /* Search for a free OpenFlow port number.  We try not to<br>
          * immediately reuse them to prevent problems due to old<br>
          * flows. */<br>
         for (;;) {<br>
-            if (++ofproto-&gt;alloc_port_no &gt;= ofproto-&gt;max_ports) {<br>
+            ofp_port_increment(&amp;(ofproto-&gt;alloc_port_no), 1);<br>
+            if (ofp_to_u16(ofproto-&gt;alloc_port_no)<br>
+                    &gt;= ofp_to_u16(ofproto-&gt;max_ports)) {<br>
                 ofproto-&gt;alloc_port_no = 0;<br>
             }<br>
             if (!bitmap_is_set(ofproto-&gt;ofp_port_ids,<br>
-                               ofproto-&gt;alloc_port_no)) {<br>
+                    ofp_to_u16(ofproto-&gt;alloc_port_no))) {<br>
                 ofp_port = ofproto-&gt;alloc_port_no;<br>
                 break;<br>
             }<br>
@@ -1706,15 +1709,15 @@ alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name)<br>
             }<br>
         }<br>
     }<br>
-    bitmap_set1(ofproto-&gt;ofp_port_ids, ofp_port);<br>
+    bitmap_set1(ofproto-&gt;ofp_port_ids, ofp_to_u16(ofp_port));<br>
     return ofp_port;<br>
 }<br>
<br>
 static void<br>
-dealloc_ofp_port(const struct ofproto *ofproto, uint16_t ofp_port)<br>
+dealloc_ofp_port(const struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
-    if (ofp_port &lt; ofproto-&gt;max_ports) {<br>
-        bitmap_set0(ofproto-&gt;ofp_port_ids, ofp_port);<br>
+    if (ofp_to_u16(ofp_port) &lt; ofp_to_u16(ofproto-&gt;max_ports)) {<br>
+        bitmap_set0(ofproto-&gt;ofp_port_ids, ofp_to_u16(ofp_port));<br>
     }<br>
 }<br>
<br>
@@ -1805,7 +1808,8 @@ ofport_install(struct ofproto *p,<br>
     ofport-&gt;created = time_msec();<br>
<br>
     /* Add port to &#39;p&#39;. */<br>
-    hmap_insert(&amp;p-&gt;ports, &amp;ofport-&gt;hmap_node, hash_int(ofport-&gt;ofp_port, 0));<br>
+    hmap_insert(&amp;p-&gt;ports, &amp;ofport-&gt;hmap_node,<br>
+                hash_ofp_port(ofport-&gt;ofp_port, 0));<br>
     shash_add(&amp;p-&gt;port_by_name, netdev_name, ofport);<br>
<br>
     update_mtu(p, ofport);<br>
@@ -1881,7 +1885,7 @@ ofproto_port_set_state(struct ofport *port, enum ofputil_port_state state)<br>
 }<br>
<br>
 void<br>
-ofproto_port_unregister(struct ofproto *ofproto, uint16_t ofp_port)<br>
+ofproto_port_unregister(struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *port = ofproto_get_port(ofproto, ofp_port);<br>
     if (port) {<br>
@@ -1925,12 +1929,13 @@ ofport_destroy(struct ofport *port)<br>
 }<br>
<br>
 struct ofport *<br>
-ofproto_get_port(const struct ofproto *ofproto, uint16_t ofp_port)<br>
+ofproto_get_port(const struct ofproto *ofproto, ofp_port_t ofp_port)<br>
 {<br>
     struct ofport *port;<br>
<br>
     HMAP_FOR_EACH_IN_BUCKET (port, hmap_node,<br>
-                             hash_int(ofp_port, 0), &amp;ofproto-&gt;ports) {<br>
+                             hash_ofp_port(ofp_port, 0),<br>
+                             &amp;ofproto-&gt;ports) {<br>
         if (port-&gt;ofp_port == ofp_port) {<br>
             return port;<br>
         }<br>
@@ -1967,6 +1972,7 @@ update_port(struct ofproto *ofproto, const char *name)<br>
     netdev = (!ofproto_port_query_by_name(ofproto, name, &amp;ofproto_port)<br>
               ? ofport_open(ofproto, &amp;ofproto_port, &amp;pp)<br>
               : NULL);<br>
+<br>
     if (netdev) {<br>
         port = ofproto_get_port(ofproto, ofproto_port.ofp_port);<br>
         if (port &amp;&amp; !strcmp(netdev_get_name(port-&gt;netdev), name)) {<br>
@@ -2028,7 +2034,8 @@ init_ports(struct ofproto *p)<br>
             node = shash_find(&amp;init_ofp_ports, name);<br>
             if (node) {<br>
                 const struct iface_hint *iface_hint = node-&gt;data;<br>
-                simap_put(&amp;p-&gt;ofp_requests, name, iface_hint-&gt;ofp_port);<br>
+                simap_put(&amp;p-&gt;ofp_requests, name,<br>
+                          ofp_to_u16(iface_hint-&gt;ofp_port));<br>
             }<br>
<br>
             netdev = ofport_open(p, &amp;ofproto_port, &amp;pp);<br>
@@ -2152,7 +2159,7 @@ ofproto_rule_destroy(struct rule *rule)<br>
 /* Returns true if &#39;rule&#39; has an OpenFlow OFPAT_OUTPUT or OFPAT_ENQUEUE action<br>
  * that outputs to &#39;port&#39; (output to OFPP_FLOOD and OFPP_ALL doesn&#39;t count). */<br>
 bool<br>
-ofproto_rule_has_out_port(const struct rule *rule, uint16_t port)<br>
+ofproto_rule_has_out_port(const struct rule *rule, ofp_port_t port)<br>
 {<br>
     return (port == OFPP_ANY<br>
             || ofpacts_output_to_port(rule-&gt;ofpacts, rule-&gt;ofpacts_len, port));<br>
@@ -2161,7 +2168,7 @@ ofproto_rule_has_out_port(const struct rule *rule, uint16_t port)<br>
 /* Returns true if a rule related to &#39;op&#39; has an OpenFlow OFPAT_OUTPUT or<br>
  * OFPAT_ENQUEUE action that outputs to &#39;out_port&#39;. */<br>
 bool<br>
-ofoperation_has_out_port(const struct ofoperation *op, uint16_t out_port)<br>
+ofoperation_has_out_port(const struct ofoperation *op, ofp_port_t out_port)<br>
 {<br>
     if (ofproto_rule_has_out_port(op-&gt;rule, out_port)) {<br>
         return true;<br>
@@ -2190,13 +2197,15 @@ ofoperation_has_out_port(const struct ofoperation *op, uint16_t out_port)<br>
  *<br>
  * Takes ownership of &#39;packet&#39;. */<br>
 static int<br>
-rule_execute(struct rule *rule, uint16_t in_port, struct ofpbuf *packet)<br>
+rule_execute(struct rule *rule, ofp_port_t in_port, struct ofpbuf *packet)<br>
 {<br>
     struct flow flow;<br>
+    union flow_in_port in_port_;<br>
<br>
     ovs_assert(ofpbuf_headroom(packet) &gt;= sizeof(struct ofp10_packet_in));<br>
<br>
-    flow_extract(packet, 0, 0, NULL, in_port, &amp;flow);<br>
+    in_port_.ofp_port = in_port;<br>
+    flow_extract(packet, 0, 0, NULL, &amp;in_port_, &amp;flow);<br>
     return rule-&gt;ofproto-&gt;ofproto_class-&gt;rule_execute(rule, &amp;flow, packet);<br>
 }<br>
<br>
@@ -2357,6 +2366,7 @@ handle_packet_out(struct ofconn *ofconn, const struct ofp_header *oh)<br>
     uint64_t ofpacts_stub[1024 / 8];<br>
     struct ofpbuf ofpacts;<br>
     struct flow flow;<br>
+    union flow_in_port in_port_;<br>
     enum ofperr error;<br>
<br>
     COVERAGE_INC(ofproto_packet_out);<br>
@@ -2372,7 +2382,8 @@ handle_packet_out(struct ofconn *ofconn, const struct ofp_header *oh)<br>
     if (error) {<br>
         goto exit_free_ofpacts;<br>
     }<br>
-    if (po.in_port &gt;= p-&gt;max_ports &amp;&amp; po.in_port &lt; OFPP_MAX) {<br>
+    if (ofp_to_u16(po.in_port) &gt;= ofp_to_u16(p-&gt;max_ports)<br>
+        &amp;&amp; ofp_to_u16(po.in_port) &lt; ofp_to_u16(OFPP_MAX)) {<br>
         error = OFPERR_OFPBRC_BAD_PORT;<br>
         goto exit_free_ofpacts;<br>
     }<br>
@@ -2390,7 +2401,8 @@ handle_packet_out(struct ofconn *ofconn, const struct ofp_header *oh)<br>
     }<br>
<br>
     /* Verify actions against packet, then send packet if successful. */<br>
-    flow_extract(payload, 0, 0, NULL, po.in_port, &amp;flow);<br>
+    in_port_.ofp_port = po.in_port;<br>
+    flow_extract(payload, 0, 0, NULL, &amp;in_port_, &amp;flow);<br>
     error = ofpacts_check(po.ofpacts, po.ofpacts_len, &amp;flow, p-&gt;max_ports);<br>
     if (!error) {<br>
         error = p-&gt;ofproto_class-&gt;packet_out(p, payload, &amp;flow,<br>
@@ -2578,7 +2590,7 @@ handle_port_stats_request(struct ofconn *ofconn,<br>
     struct ofproto *p = ofconn_get_ofproto(ofconn);<br>
     struct ofport *port;<br>
     struct list replies;<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
     enum ofperr error;<br>
<br>
     error = ofputil_decode_port_stats_request(request, &amp;port_no);<br>
@@ -2714,7 +2726,7 @@ static enum ofperr<br>
 collect_rules_loose(struct ofproto *ofproto, uint8_t table_id,<br>
                     const struct match *match,<br>
                     ovs_be64 cookie, ovs_be64 cookie_mask,<br>
-                    uint16_t out_port, struct list *rules)<br>
+                    ofp_port_t out_port, struct list *rules)<br>
 {<br>
     struct oftable *table;<br>
     struct cls_rule cr;<br>
@@ -2765,7 +2777,7 @@ static enum ofperr<br>
 collect_rules_strict(struct ofproto *ofproto, uint8_t table_id,<br>
                      const struct match *match, unsigned int priority,<br>
                      ovs_be64 cookie, ovs_be64 cookie_mask,<br>
-                     uint16_t out_port, struct list *rules)<br>
+                     ofp_port_t out_port, struct list *rules)<br>
 {<br>
     struct oftable *table;<br>
     struct cls_rule cr;<br>
@@ -2922,7 +2934,7 @@ ofproto_get_netflow_ids(const struct ofproto *ofproto,<br>
  * The caller must provide and owns &#39;*status&#39;, but it does not own and must not<br>
  * modify or free the array returned in &#39;status-&gt;rmps&#39;. */<br>
 bool<br>
-ofproto_port_get_cfm_status(const struct ofproto *ofproto, uint16_t ofp_port,<br>
+ofproto_port_get_cfm_status(const struct ofproto *ofproto, ofp_port_t ofp_port,<br>
                             struct ofproto_cfm_status *status)<br>
 {<br>
     struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);<br>
@@ -4246,7 +4258,7 @@ ofopgroup_complete(struct ofopgroup *group)<br>
         LIST_FOR_EACH (op, group_node, &amp;group-&gt;ops) {<br>
             if (op-&gt;type != OFOPERATION_DELETE) {<br>
                 struct ofpbuf *packet;<br>
-                uint16_t in_port;<br>
+                ofp_port_t in_port;<br>
<br>
                 error = ofconn_pktbuf_retrieve(group-&gt;ofconn, group-&gt;buffer_id,<br>
                                                &amp;packet, &amp;in_port);<br>
@@ -4999,8 +5011,8 @@ ofproto_has_vlan_usage_changed(const struct ofproto *ofproto)<br>
  * device as a VLAN splinter for VLAN ID &#39;vid&#39;.  If &#39;realdev_ofp_port&#39; is zero,<br>
  * then the VLAN device is un-enslaved. */<br>
 int<br>
-ofproto_port_set_realdev(struct ofproto *ofproto, uint16_t vlandev_ofp_port,<br>
-                         uint16_t realdev_ofp_port, int vid)<br>
+ofproto_port_set_realdev(struct ofproto *ofproto, ofp_port_t vlandev_ofp_port,<br>
+                         ofp_port_t realdev_ofp_port, int vid)<br>
 {<br>
     struct ofport *ofport;<br>
     int error;<br>
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h<br>
index 5f8244c..2609c94 100644<br>
--- a/ofproto/ofproto.h<br>
+++ b/ofproto/ofproto.h<br>
@@ -158,7 +158,7 @@ void ofproto_parse_name(const char *name, char **dp_name, char **dp_type);<br>
 struct iface_hint {<br>
     char *br_name;              /* Name of owning bridge. */<br>
     char *br_type;              /* Type of owning bridge. */<br>
-    uint16_t ofp_port;          /* OpenFlow port number. */<br>
+    ofp_port_t ofp_port;        /* OpenFlow port number. */<br>
 };<br>
<br>
 void ofproto_init(const struct shash *iface_hints);<br>
@@ -185,7 +185,7 @@ void ofproto_get_memory_usage(const struct ofproto *, struct simap *);<br>
 struct ofproto_port {<br>
     char *name;                 /* Network device name, e.g. &quot;eth0&quot;. */<br>
     char *type;                 /* Network device type, e.g. &quot;system&quot;. */<br>
-    uint16_t ofp_port;          /* OpenFlow port number. */<br>
+    ofp_port_t ofp_port;        /* OpenFlow port number. */<br>
 };<br>
 void ofproto_port_clone(struct ofproto_port *, const struct ofproto_port *);<br>
 void ofproto_port_destroy(struct ofproto_port *);<br>
@@ -218,8 +218,8 @@ int ofproto_port_dump_done(struct ofproto_port_dump *);<br>
<br>
 const char *ofproto_port_open_type(const char *datapath_type,<br>
                                    const char *port_type);<br>
-int ofproto_port_add(struct ofproto *, struct netdev *, uint16_t *ofp_portp);<br>
-int ofproto_port_del(struct ofproto *, uint16_t ofp_port);<br>
+int ofproto_port_add(struct ofproto *, struct netdev *, ofp_port_t *ofp_portp);<br>
+int ofproto_port_del(struct ofproto *, ofp_port_t ofp_port);<br>
 int ofproto_port_get_stats(const struct ofport *, struct netdev_stats *stats);<br>
<br>
 int ofproto_port_query_by_name(const struct ofproto *, const char *devname,<br>
@@ -255,21 +255,21 @@ int ofproto_set_stp(struct ofproto *, const struct ofproto_stp_settings *);<br>
 int ofproto_get_stp_status(struct ofproto *, struct ofproto_stp_status *);<br>
<br>
 /* Configuration of ports. */<br>
-void ofproto_port_unregister(struct ofproto *, uint16_t ofp_port);<br>
+void ofproto_port_unregister(struct ofproto *, ofp_port_t ofp_port);<br>
<br>
-void ofproto_port_clear_cfm(struct ofproto *, uint16_t ofp_port);<br>
-void ofproto_port_set_cfm(struct ofproto *, uint16_t ofp_port,<br>
+void ofproto_port_clear_cfm(struct ofproto *, ofp_port_t ofp_port);<br>
+void ofproto_port_set_cfm(struct ofproto *, ofp_port_t ofp_port,<br>
                           const struct cfm_settings *);<br>
-void ofproto_port_set_bfd(struct ofproto *, uint16_t ofp_port,<br>
+void ofproto_port_set_bfd(struct ofproto *, ofp_port_t ofp_port,<br>
                           const struct smap *cfg);<br>
-int ofproto_port_get_bfd_status(struct ofproto *, uint16_t ofp_port,<br>
+int ofproto_port_get_bfd_status(struct ofproto *, ofp_port_t ofp_port,<br>
                                 struct smap *);<br>
-int ofproto_port_is_lacp_current(struct ofproto *, uint16_t ofp_port);<br>
-int ofproto_port_set_stp(struct ofproto *, uint16_t ofp_port,<br>
+int ofproto_port_is_lacp_current(struct ofproto *, ofp_port_t ofp_port);<br>
+int ofproto_port_set_stp(struct ofproto *, ofp_port_t ofp_port,<br>
                          const struct ofproto_port_stp_settings *);<br>
-int ofproto_port_get_stp_status(struct ofproto *, uint16_t ofp_port,<br>
+int ofproto_port_get_stp_status(struct ofproto *, ofp_port_t ofp_port,<br>
                                 struct ofproto_port_stp_status *);<br>
-int ofproto_port_set_queues(struct ofproto *, uint16_t ofp_port,<br>
+int ofproto_port_set_queues(struct ofproto *, ofp_port_t ofp_port,<br>
                             const struct ofproto_port_queue *,<br>
                             size_t n_queues);<br>
<br>
@@ -298,7 +298,7 @@ enum port_vlan_mode {<br>
 struct ofproto_bundle_settings {<br>
     char *name;                 /* For use in log messages. */<br>
<br>
-    uint16_t *slaves;           /* OpenFlow port numbers for slaves. */<br>
+    ofp_port_t *slaves;         /* OpenFlow port numbers for slaves. */<br>
     size_t n_slaves;<br>
<br>
     enum port_vlan_mode vlan_mode; /* Selects mode for vlan and trunks */<br>
@@ -317,7 +317,7 @@ struct ofproto_bundle_settings {<br>
      * drivers in old versions of Linux that do not properly support VLANs when<br>
      * VLAN devices are not used.  When broken device drivers are no longer in<br>
      * widespread use, we will delete these interfaces. */<br>
-    uint16_t realdev_ofp_port;  /* OpenFlow port number of real device. */<br>
+    ofp_port_t realdev_ofp_port;/* OpenFlow port number of real device. */<br>
 };<br>
<br>
 int ofproto_bundle_register(struct ofproto *, void *aux,<br>
@@ -406,7 +406,8 @@ struct ofproto_cfm_status {<br>
     size_t n_rmps;<br>
 };<br>
<br>
-bool ofproto_port_get_cfm_status(const struct ofproto *, uint16_t ofp_port,<br>
+bool ofproto_port_get_cfm_status(const struct ofproto *,<br>
+                                 ofp_port_t ofp_port,<br>
                                  struct ofproto_cfm_status *);<br>
<br>
 /* Linux VLAN device support (e.g. &quot;eth0.10&quot; for VLAN 10.)<br>
@@ -418,8 +419,8 @@ bool ofproto_port_get_cfm_status(const struct ofproto *, uint16_t ofp_port,<br>
<br>
 void ofproto_get_vlan_usage(struct ofproto *, unsigned long int *vlan_bitmap);<br>
 bool ofproto_has_vlan_usage_changed(const struct ofproto *);<br>
-int ofproto_port_set_realdev(struct ofproto *, uint16_t vlandev_ofp_port,<br>
-                             uint16_t realdev_ofp_port, int vid);<br>
+int ofproto_port_set_realdev(struct ofproto *, ofp_port_t vlandev_ofp_port,<br>
+                             ofp_port_t realdev_ofp_port, int vid);<br>
<br>
 #ifdef  __cplusplus<br>
 }<br>
diff --git a/ofproto/pinsched.c b/ofproto/pinsched.c<br>
index 57e8e23..95f9ca5 100644<br>
--- a/ofproto/pinsched.c<br>
+++ b/ofproto/pinsched.c<br>
@@ -21,6 +21,7 @@<br>
 #include &lt;arpa/inet.h&gt;<br>
 #include &lt;stdint.h&gt;<br>
 #include &lt;stdlib.h&gt;<br>
+#include &quot;flow.h&quot;<br>
 #include &quot;hash.h&quot;<br>
 #include &quot;hmap.h&quot;<br>
 #include &quot;ofpbuf.h&quot;<br>
@@ -35,7 +36,7 @@<br>
<br>
 struct pinqueue {<br>
     struct hmap_node node;      /* In struct pinsched&#39;s &#39;queues&#39; hmap. */<br>
-    uint16_t port_no;           /* Port number. */<br>
+    ofp_port_t port_no;           /* Port number. */<br>
     struct list packets;        /* Contains &quot;struct ofpbuf&quot;s. */<br>
     int n;                      /* Number of packets in &#39;packets&#39;. */<br>
 };<br>
@@ -101,9 +102,9 @@ pinqueue_destroy(struct pinsched *ps, struct pinqueue *q)<br>
 }<br>
<br>
 static struct pinqueue *<br>
-pinqueue_get(struct pinsched *ps, uint16_t port_no)<br>
+pinqueue_get(struct pinsched *ps, ofp_port_t port_no)<br>
 {<br>
-    uint32_t hash = hash_int(port_no, 0);<br>
+    uint32_t hash = hash_ofp_port(port_no, 0);<br>
     struct pinqueue *q;<br>
<br>
     HMAP_FOR_EACH_IN_BUCKET (q, node, hash, &amp;ps-&gt;queues) {<br>
@@ -184,7 +185,7 @@ get_token(struct pinsched *ps)<br>
 }<br>
<br>
 void<br>
-pinsched_send(struct pinsched *ps, uint16_t port_no,<br>
+pinsched_send(struct pinsched *ps, ofp_port_t port_no,<br>
               struct ofpbuf *packet, pinsched_tx_cb *cb, void *aux)<br>
 {<br>
     if (!ps) {<br>
diff --git a/ofproto/pinsched.h b/ofproto/pinsched.h<br>
index 061cb01..06b22f4 100644<br>
--- a/ofproto/pinsched.h<br>
+++ b/ofproto/pinsched.h<br>
@@ -18,6 +18,7 @@<br>
 #define PINSCHED_H_H 1<br>
<br>
 #include &lt;stdint.h&gt;<br>
+#include &quot;flow.h&quot;<br>
<br>
 struct ofpbuf;<br>
<br>
@@ -27,7 +28,7 @@ void pinsched_get_limits(const struct pinsched *,<br>
                          int *rate_limit, int *burst_limit);<br>
 void pinsched_set_limits(struct pinsched *, int rate_limit, int burst_limit);<br>
 void pinsched_destroy(struct pinsched *);<br>
-void pinsched_send(struct pinsched *, uint16_t port_no, struct ofpbuf *,<br>
+void pinsched_send(struct pinsched *, ofp_port_t port_no, struct ofpbuf *,<br>
                    pinsched_tx_cb *, void *aux);<br>
 void pinsched_run(struct pinsched *, pinsched_tx_cb *, void *aux);<br>
 void pinsched_wait(struct pinsched *);<br>
diff --git a/ofproto/pktbuf.c b/ofproto/pktbuf.c<br>
index 2ec1f0d..65fcef6 100644<br>
--- a/ofproto/pktbuf.c<br>
+++ b/ofproto/pktbuf.c<br>
@@ -51,7 +51,7 @@ struct packet {<br>
     struct ofpbuf *buffer;<br>
     uint32_t cookie;<br>
     long long int timeout;<br>
-    uint16_t in_port;<br>
+    ofp_port_t in_port;<br>
 };<br>
<br>
 struct pktbuf {<br>
@@ -104,7 +104,7 @@ make_id(unsigned int buffer_idx, unsigned int cookie)<br>
  * The caller retains ownership of &#39;buffer&#39;. */<br>
 uint32_t<br>
 pktbuf_save(struct pktbuf *pb, const void *buffer, size_t buffer_size,<br>
-            uint16_t in_port)<br>
+            ofp_port_t in_port)<br>
 {<br>
     struct packet *p = &amp;pb-&gt;packets[pb-&gt;buffer_idx];<br>
     pb-&gt;buffer_idx = (pb-&gt;buffer_idx + 1) &amp; PKTBUF_MASK;<br>
@@ -161,7 +161,7 @@ pktbuf_get_null(void)<br>
  * OpenFlow port number on which the packet was received in &#39;*in_port&#39;.  The<br>
  * caller becomes responsible for freeing the buffer.  However, if &#39;id&#39;<br>
  * identifies a &quot;null&quot; packet buffer (created with pktbuf_get_null()), stores<br>
- * NULL in &#39;*bufferp&#39; and UINT16_max in &#39;*in_port&#39;.<br>
+ * NULL in &#39;*bufferp&#39; and OFPP_NONE in &#39;*in_port&#39;.<br>
  *<br>
  * &#39;in_port&#39; may be NULL if the input port is not of interest.<br>
  *<br>
@@ -171,7 +171,7 @@ pktbuf_get_null(void)<br>
  * On failure, stores NULL in in &#39;*bufferp&#39; and UINT16_MAX in &#39;*in_port&#39;. */<br>
 enum ofperr<br>
 pktbuf_retrieve(struct pktbuf *pb, uint32_t id, struct ofpbuf **bufferp,<br>
-                uint16_t *in_port)<br>
+                ofp_port_t *in_port)<br>
 {<br>
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 20);<br>
     struct packet *p;<br>
@@ -218,7 +218,7 @@ pktbuf_retrieve(struct pktbuf *pb, uint32_t id, struct ofpbuf **bufferp,<br>
 error:<br>
     *bufferp = NULL;<br>
     if (in_port) {<br>
-        *in_port = UINT16_MAX;<br>
+        *in_port = OFPP_NONE;<br>
     }<br>
     return error;<br>
 }<br>
diff --git a/ofproto/pktbuf.h b/ofproto/pktbuf.h<br>
index ec99aea..eb1b1ff 100644<br>
--- a/ofproto/pktbuf.h<br>
+++ b/ofproto/pktbuf.h<br>
@@ -30,10 +30,10 @@ int pktbuf_capacity(void);<br>
 struct pktbuf *pktbuf_create(void);<br>
 void pktbuf_destroy(struct pktbuf *);<br>
 uint32_t pktbuf_save(struct pktbuf *, const void *buffer, size_t buffer_size,<br>
-                     uint16_t in_port);<br>
+                     ofp_port_t in_port);<br>
 uint32_t pktbuf_get_null(void);<br>
 enum ofperr pktbuf_retrieve(struct pktbuf *, uint32_t id,<br>
-                            struct ofpbuf **bufferp, uint16_t *in_port);<br>
+                            struct ofpbuf **bufferp, ofp_port_t *in_port);<br>
 void pktbuf_discard(struct pktbuf *, uint32_t id);<br>
<br>
 unsigned int pktbuf_count_packets(const struct pktbuf *);<br>
diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c<br>
index 636c549..9b0eb69 100644<br>
--- a/ofproto/tunnel.c<br>
+++ b/ofproto/tunnel.c<br>
@@ -36,7 +36,7 @@ struct tnl_match {<br>
     ovs_be64 in_key;<br>
     ovs_be32 ip_src;<br>
     ovs_be32 ip_dst;<br>
-    uint32_t odp_port;<br>
+    odp_port_t odp_port;<br>
     uint32_t skb_mark;<br>
     bool in_key_flow;<br>
     bool ip_src_flow;<br>
@@ -71,7 +71,7 @@ static void tnl_port_mod_log(const struct tnl_port *, const char *action);<br>
 static const char *tnl_port_get_name(const struct tnl_port *);<br>
<br>
 static struct tnl_port *<br>
-tnl_port_add__(const struct ofport *ofport, uint32_t odp_port,<br>
+tnl_port_add__(const struct ofport *ofport, odp_port_t odp_port,<br>
                bool warn)<br>
 {<br>
     const struct netdev_tunnel_config *cfg;<br>
@@ -118,7 +118,7 @@ tnl_port_add__(const struct ofport *ofport, uint32_t odp_port,<br>
  * must be added before they can be used by the module. &#39;ofport&#39; must be a<br>
  * tunnel. */<br>
 struct tnl_port *<br>
-tnl_port_add(const struct ofport *ofport, uint32_t odp_port)<br>
+tnl_port_add(const struct ofport *ofport, odp_port_t odp_port)<br>
 {<br>
     return tnl_port_add__(ofport, odp_port, true);<br>
 }<br>
@@ -129,7 +129,7 @@ tnl_port_add(const struct ofport *ofport, uint32_t odp_port)<br>
  * &#39;ofport&#39; and &#39;odp_port&#39; should be the same as would be passed to<br>
  * tnl_port_add(). */<br>
 bool<br>
-tnl_port_reconfigure(const struct ofport *ofport, uint32_t odp_port,<br>
+tnl_port_reconfigure(const struct ofport *ofport, odp_port_t odp_port,<br>
                      struct tnl_port **tnl_portp)<br>
 {<br>
     struct tnl_port *tnl_port = *tnl_portp;<br>
@@ -173,7 +173,7 @@ tnl_port_receive(const struct flow *flow)<br>
     struct tnl_match match;<br>
<br>
     memset(&amp;match, 0, sizeof match);<br>
-    match.odp_port = flow-&gt;in_port;<br>
+    match.odp_port = flow-&gt;in_port.odp_port;<br>
     match.ip_src = flow-&gt;tunnel.ip_dst;<br>
     match.ip_dst = flow-&gt;tunnel.ip_src;<br>
     match.in_key = flow-&gt;tunnel.tun_id;<br>
@@ -212,7 +212,7 @@ tnl_port_receive(const struct flow *flow)<br>
  * &#39;tnl_port&#39;, updates &#39;flow&#39;&#39;s tunnel headers and returns the actual datapath<br>
  * port that the output should happen on.  May return OVSP_NONE if the output<br>
  * shouldn&#39;t occur. */<br>
-uint32_t<br>
+odp_port_t<br>
 tnl_port_send(const struct tnl_port *tnl_port, struct flow *flow,<br>
               struct flow_wildcards *wc)<br>
 {<br>
diff --git a/ofproto/tunnel.h b/ofproto/tunnel.h<br>
index 803e2d9..343eb96 100644<br>
--- a/ofproto/tunnel.h<br>
+++ b/ofproto/tunnel.h<br>
@@ -31,15 +31,15 @@<br>
 struct ofport;<br>
 struct tnl_port;<br>
<br>
-bool tnl_port_reconfigure(const struct ofport *, uint32_t odp_port,<br>
+bool tnl_port_reconfigure(const struct ofport *, odp_port_t odp_port,<br>
                           struct tnl_port **);<br>
<br>
-struct tnl_port *tnl_port_add(const struct ofport *, uint32_t odp_port);<br>
+struct tnl_port *tnl_port_add(const struct ofport *, odp_port_t odp_port);<br>
 void tnl_port_del(struct tnl_port *);<br>
<br>
 const struct ofport *tnl_port_receive(const struct flow *);<br>
-uint32_t tnl_port_send(const struct tnl_port *, struct flow *,<br>
-                       struct flow_wildcards *wc);<br>
+odp_port_t tnl_port_send(const struct tnl_port *, struct flow *,<br>
+                         struct flow_wildcards *wc);<br>
<br>
 /* Returns true if &#39;flow&#39; should be submitted to tnl_port_receive(). */<br>
 static inline bool<br>
diff --git a/tests/test-bundle.c b/tests/test-bundle.c<br>
index c475991..cf3043d 100644<br>
--- a/tests/test-bundle.c<br>
+++ b/tests/test-bundle.c<br>
@@ -31,7 +31,7 @@<br>
 #define MAX_SLAVES 8 /* Maximum supported by this test framework. */<br>
<br>
 struct slave {<br>
-    uint16_t slave_id;<br>
+    ofp_port_t slave_id;<br>
<br>
     bool enabled;<br>
     size_t flow_count;<br>
@@ -43,7 +43,7 @@ struct slave_group {<br>
 };<br>
<br>
 static struct slave *<br>
-slave_lookup(struct slave_group *sg, uint16_t slave_id)<br>
+slave_lookup(struct slave_group *sg, ofp_port_t slave_id)<br>
 {<br>
     size_t i;<br>
<br>
@@ -57,7 +57,7 @@ slave_lookup(struct slave_group *sg, uint16_t slave_id)<br>
 }<br>
<br>
 static bool<br>
-slave_enabled_cb(uint16_t slave_id, void *aux)<br>
+slave_enabled_cb(ofp_port_t slave_id, void *aux)<br>
 {<br>
     struct slave *slave;<br>
<br>
@@ -122,7 +122,7 @@ main(int argc, char *argv[])<br>
     /* Generate &#39;slaves&#39; array. */<br>
     sg.n_slaves = 0;<br>
     for (i = 0; i &lt; bundle-&gt;n_slaves; i++) {<br>
-        uint16_t slave_id = bundle-&gt;slaves[i];<br>
+        ofp_port_t slave_id = bundle-&gt;slaves[i];<br>
<br>
         if (slave_lookup(&amp;sg, slave_id)) {<br>
             ovs_fatal(0, &quot;Redundant slaves are not supported. &quot;);<br>
@@ -138,7 +138,7 @@ main(int argc, char *argv[])<br>
         random_bytes(&amp;flows[i], sizeof flows[i]);<br>
         memset(flows[i].zeros, 0, sizeof flows[i].zeros);<br>
         flows[i].mpls_depth = 0;<br>
-        flows[i].regs[0] = OFPP_NONE;<br>
+        flows[i].regs[0] = ofp_to_u16(OFPP_NONE);<br>
     }<br>
<br>
     /* Cycles through each possible liveness permutation for the given<br>
@@ -186,13 +186,13 @@ main(int argc, char *argv[])<br>
         changed = 0;<br>
         for (j = 0; j &lt; N_FLOWS; j++) {<br>
             struct flow *flow = &amp;flows[j];<br>
-            uint16_t old_slave_id, ofp_port;<br>
+            ofp_port_t old_slave_id, ofp_port;<br>
             struct flow_wildcards wc;<br>
<br>
-            old_slave_id = flow-&gt;regs[0];<br>
+            old_slave_id = uint_to_ofp(flow-&gt;regs[0]);<br>
             ofp_port = bundle_execute(bundle, flow, &amp;wc, slave_enabled_cb,<br>
                                       &amp;sg);<br>
-            flow-&gt;regs[0] = ofp_port;<br>
+            flow-&gt;regs[0] = ofp_to_u16(ofp_port);<br>
<br>
             if (ofp_port != OFPP_NONE) {<br>
                 slave_lookup(&amp;sg, ofp_port)-&gt;flow_count++;<br>
diff --git a/tests/test-classifier.c b/tests/test-classifier.c<br>
index f616494..e6124c3 100644<br>
--- a/tests/test-classifier.c<br>
+++ b/tests/test-classifier.c<br>
@@ -240,8 +240,9 @@ match(const struct cls_rule *wild_, const struct flow *fixed)<br>
             eq = !((fixed-&gt;dl_type ^ wild.flow.dl_type)<br>
                    &amp; wild.wc.masks.dl_type);<br>
         } else if (f_idx == CLS_F_IDX_IN_PORT) {<br>
-            eq = !((fixed-&gt;in_port ^ wild.flow.in_port)<br>
-                   &amp; wild.wc.masks.in_port);<br>
+            eq = !((fixed-&gt;in_port.ofp_port<br>
+                    ^ wild.flow.in_port.ofp_port)<br>
+                   &amp; wild.wc.masks.in_port.ofp_port);<br>
         } else {<br>
             NOT_REACHED();<br>
         }<br>
@@ -298,7 +299,7 @@ static ovs_be64 tun_id_values[] = {<br>
 static ovs_be64 metadata_values[] = {<br>
     0,<br>
     CONSTANT_HTONLL(UINT64_C(0xfedcba9876543210)) };<br>
-static uint16_t in_port_values[] = { 1, OFPP_LOCAL };<br>
+static ofp_port_t in_port_values[] = { (OVS_FORCE ofp_port_t) 1, OFPP_LOCAL };<br>
 static ovs_be16 vlan_tci_values[] = { CONSTANT_HTONS(101), CONSTANT_HTONS(0) };<br>
 static ovs_be16 dl_type_values[]<br>
             = { CONSTANT_HTONS(ETH_TYPE_IP), CONSTANT_HTONS(ETH_TYPE_ARP) };<br>
@@ -410,7 +411,8 @@ compare_classifiers(struct classifier *cls, struct tcls *tcls)<br>
         flow.nw_dst = nw_dst_values[get_value(&amp;x, N_NW_DST_VALUES)];<br>
         flow.tunnel.tun_id = tun_id_values[get_value(&amp;x, N_TUN_ID_VALUES)];<br>
         flow.metadata = metadata_values[get_value(&amp;x, N_METADATA_VALUES)];<br>
-        flow.in_port = in_port_values[get_value(&amp;x, N_IN_PORT_VALUES)];<br>
+        flow.in_port.ofp_port = in_port_values[get_value(&amp;x,<br>
+                                                   N_IN_PORT_VALUES)];<br>
         flow.vlan_tci = vlan_tci_values[get_value(&amp;x, N_VLAN_TCI_VALUES)];<br>
         flow.dl_type = dl_type_values[get_value(&amp;x, N_DL_TYPE_VALUES)];<br>
         flow.tp_src = tp_src_values[get_value(&amp;x, N_TP_SRC_VALUES)];<br>
@@ -546,7 +548,7 @@ make_rule(int wc_fields, unsigned int priority, int value_pat)<br>
         } else if (f_idx == CLS_F_IDX_DL_TYPE) {<br>
             match.wc.masks.dl_type = htons(UINT16_MAX);<br>
         } else if (f_idx == CLS_F_IDX_IN_PORT) {<br>
-            match.wc.masks.in_port = UINT16_MAX;<br>
+            match.wc.masks.in_port.ofp_port = OFPP_NONE;<br>
         } else {<br>
             NOT_REACHED();<br>
         }<br>
diff --git a/tests/test-flows.c b/tests/test-flows.c<br>
index c77372f..a4953d4 100644<br>
--- a/tests/test-flows.c<br>
+++ b/tests/test-flows.c<br>
@@ -58,7 +58,7 @@ main(int argc OVS_UNUSED, char *argv[])<br>
         struct ofp10_match extracted_match;<br>
         struct match match;<br>
         struct flow flow;<br>
-<br>
+        union flow_in_port in_port_;<br>
         n++;<br>
<br>
         retval = pcap_read(pcap, &amp;packet);<br>
@@ -68,7 +68,8 @@ main(int argc OVS_UNUSED, char *argv[])<br>
             ovs_fatal(retval, &quot;error reading pcap file&quot;);<br>
         }<br>
<br>
-        flow_extract(packet, 0, 0, NULL, 1, &amp;flow);<br>
+        in_port_.ofp_port = uint_to_ofp(1);<br>
+        flow_extract(packet, 0, 0, NULL, &amp;in_port_, &amp;flow);<br>
         match_init_exact(&amp;match, &amp;flow);<br>
         ofputil_match_to_ofp10_match(&amp;match, &amp;extracted_match);<br>
<br>
diff --git a/tests/test-odp.c b/tests/test-odp.c<br>
index 268a105..dc88ddf 100644<br>
--- a/tests/test-odp.c<br>
+++ b/tests/test-odp.c<br>
@@ -70,7 +70,7 @@ parse_keys(void)<br>
         /* Convert cls_rule back to odp_key. */<br>
         ofpbuf_uninit(&amp;odp_key);<br>
         ofpbuf_init(&amp;odp_key, 0);<br>
-        odp_flow_key_from_flow(&amp;odp_key, &amp;flow, flow.in_port);<br>
+        odp_flow_key_from_flow(&amp;odp_key, &amp;flow, flow.in_port.odp_port);<br>
<br>
         if (odp_key.size &gt; ODPUTIL_FLOW_KEY_BYTES) {<br>
             printf (&quot;too long: %zu &gt; %d\n&quot;,<br>
diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c<br>
index 54505e8..3107ca8 100644<br>
--- a/utilities/ovs-dpctl.c<br>
+++ b/utilities/ovs-dpctl.c<br>
@@ -308,7 +308,7 @@ dpctl_add_if(int argc OVS_UNUSED, char *argv[])<br>
         char *save_ptr = NULL;<br>
         struct netdev *netdev = NULL;<br>
         struct smap args;<br>
-        uint32_t port_no = UINT32_MAX;<br>
+        odp_port_t port_no = OVSP_NONE;<br>
         char *option;<br>
         int error;<br>
<br>
@@ -335,7 +335,7 @@ dpctl_add_if(int argc OVS_UNUSED, char *argv[])<br>
             if (!strcmp(key, &quot;type&quot;)) {<br>
                 type = value;<br>
             } else if (!strcmp(key, &quot;port_no&quot;)) {<br>
-                port_no = atoi(value);<br>
+                port_no = uint_to_odp(atoi(value));<br>
             } else if (!smap_add_once(&amp;args, key, value)) {<br>
                 ovs_error(0, &quot;duplicate \&quot;%s\&quot; option&quot;, key);<br>
             }<br>
@@ -388,7 +388,7 @@ dpctl_set_if(int argc, char *argv[])<br>
         char *type = NULL;<br>
         const char *name;<br>
         struct smap args;<br>
-        uint32_t port_no;<br>
+        odp_port_t port_no;<br>
         char *option;<br>
         int error;<br>
<br>
@@ -441,7 +441,7 @@ dpctl_set_if(int argc, char *argv[])<br>
                     failure = true;<br>
                 }<br>
             } else if (!strcmp(key, &quot;port_no&quot;)) {<br>
-                if (port_no != atoi(value)) {<br>
+                if (port_no != uint_to_odp(atoi(value))) {<br>
                     ovs_error(0, &quot;%s: can&#39;t change port number from &quot;<br>
                               &quot;%&quot;PRIu32&quot; to %d&quot;,<br>
                               name, port_no, atoi(value));<br>
@@ -476,7 +476,7 @@ next:<br>
 }<br>
<br>
 static bool<br>
-get_port_number(struct dpif *dpif, const char *name, uint32_t *port)<br>
+get_port_number(struct dpif *dpif, const char *name, odp_port_t *port)<br>
 {<br>
     struct dpif_port dpif_port;<br>
<br>
@@ -500,11 +500,11 @@ dpctl_del_if(int argc OVS_UNUSED, char *argv[])<br>
     run(parsed_dpif_open(argv[1], false, &amp;dpif), &quot;opening datapath&quot;);<br>
     for (i = 2; i &lt; argc; i++) {<br>
         const char *name = argv[i];<br>
-        uint32_t port;<br>
+        odp_port_t port;<br>
         int error;<br>
<br>
         if (!name[strspn(name, &quot;0123456789&quot;)]) {<br>
-            port = atoi(name);<br>
+            port = uint_to_odp(atoi(name));<br>
         } else if (!get_port_number(dpif, name, &amp;port)) {<br>
             failure = true;<br>
             continue;<br>
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c<br>
index 48f0fbf..0d037a9 100644<br>
--- a/utilities/ovs-ofctl.c<br>
+++ b/utilities/ovs-ofctl.c<br>
@@ -632,7 +632,7 @@ ofctl_dump_tables(int argc OVS_UNUSED, char *argv[])<br>
<br>
 static bool<br>
 fetch_port_by_features(const char *vconn_name,<br>
-                       const char *port_name, unsigned int port_no,<br>
+                       const char *port_name, uint32_t port_no,<br>
                        struct ofputil_phy_port *pp, bool *trunc)<br>
 {<br>
     struct ofputil_switch_features features;<br>
@@ -671,7 +671,7 @@ fetch_port_by_features(const char *vconn_name,<br>
<br>
     while (!ofputil_pull_phy_port(oh-&gt;version, &amp;b, pp)) {<br>
         if (port_no != UINT_MAX<br>
-            ? port_no == pp-&gt;port_no<br>
+            ? port_no == (OVS_FORCE uint32_t) pp-&gt;port_no<br>
             : !strcmp(pp-&gt;name, port_name)) {<br>
             found = true;<br>
             goto exit;<br>
@@ -685,7 +685,7 @@ exit:<br>
<br>
 static bool<br>
 fetch_port_by_stats(const char *vconn_name,<br>
-                    const char *port_name, unsigned int port_no,<br>
+                    const char *port_name, uint32_t port_no,<br>
                     struct ofputil_phy_port *pp)<br>
 {<br>
     struct ofpbuf *request;<br>
@@ -729,8 +729,9 @@ fetch_port_by_stats(const char *vconn_name,<br>
             }<br>
<br>
             while (!ofputil_pull_phy_port(oh-&gt;version, &amp;b, pp)) {<br>
-                if (port_no != UINT_MAX ? port_no == pp-&gt;port_no<br>
-                                        : !strcmp(pp-&gt;name, port_name)) {<br>
+                if (port_no != UINT_MAX<br>
+                    ? port_no == (OVS_FORCE uint32_t) pp-&gt;port_no<br>
+                    : !strcmp(pp-&gt;name, port_name)) {<br>
                     found = true;<br>
                     break;<br>
                 }<br>
@@ -754,7 +755,7 @@ static void<br>
 fetch_ofputil_phy_port(const char *vconn_name, const char *port_name,<br>
                        struct ofputil_phy_port *pp)<br>
 {<br>
-    unsigned int port_no;<br>
+    uint32_t port_no;<br>
     bool found;<br>
     bool trunc;<br>
<br>
@@ -779,10 +780,10 @@ fetch_ofputil_phy_port(const char *vconn_name, const char *port_name,<br>
<br>
 /* Returns the port number corresponding to &#39;port_name&#39; (which may be a port<br>
  * name or number) within the switch &#39;vconn_name&#39;. */<br>
-static uint16_t<br>
+static ofp_port_t<br>
 str_to_port_no(const char *vconn_name, const char *port_name)<br>
 {<br>
-    uint16_t port_no;<br>
+    ofp_port_t port_no;<br>
<br>
     if (ofputil_port_from_string(port_name, &amp;port_no)) {<br>
         return port_no;<br>
@@ -1489,7 +1490,7 @@ ofctl_dump_ports(int argc, char *argv[])<br>
 {<br>
     struct ofpbuf *request;<br>
     struct vconn *vconn;<br>
-    uint16_t port;<br>
+    ofp_port_t port;<br>
<br>
     open_vconn(argv[1], &amp;vconn);<br>
     port = argc &gt; 2 ? str_to_port_no(argv[1], argv[2]) : OFPP_ANY;<br>
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c<br>
index 3513810..41b86a7 100644<br>
--- a/vswitchd/bridge.c<br>
+++ b/vswitchd/bridge.c<br>
@@ -67,13 +67,13 @@ struct if_cfg {<br>
     struct hmap_node hmap_node;         /* Node in bridge&#39;s if_cfg_todo. */<br>
     const struct ovsrec_interface *cfg; /* Interface record. */<br>
     const struct ovsrec_port *parent;   /* Parent port record. */<br>
-    uint16_t ofport;                    /* Requested OpenFlow port number. */<br>
+    ofp_port_t ofport;                  /* Requested OpenFlow port number. */<br>
 };<br>
<br>
 /* OpenFlow port slated for removal from ofproto. */<br>
 struct ofpp_garbage {<br>
     struct list list_node;      /* Node in bridge&#39;s ofpp_garbage. */<br>
-    uint16_t ofp_port;          /* Port to be deleted. */<br>
+    ofp_port_t ofp_port;        /* Port to be deleted. */<br>
 };<br>
<br>
 struct iface {<br>
@@ -86,7 +86,7 @@ struct iface {<br>
     /* These members are valid only after bridge_reconfigure() causes them to<br>
      * be initialized. */<br>
     struct hmap_node ofp_port_node; /* In struct bridge&#39;s &quot;ifaces&quot; hmap. */<br>
-    uint16_t ofp_port;          /* OpenFlow port number, */<br>
+    ofp_port_t ofp_port;        /* OpenFlow port number, */<br>
                                 /* OFPP_NONE if unknown. */<br>
     struct netdev *netdev;      /* Network device. */<br>
     const char *type;           /* Usually same as cfg-&gt;type. */<br>
@@ -245,7 +245,8 @@ static bool mirror_configure(struct mirror *);<br>
 static void mirror_refresh_stats(struct mirror *);<br>
<br>
 static void iface_configure_lacp(struct iface *, struct lacp_slave_settings *);<br>
-static bool iface_create(struct bridge *, struct if_cfg *, uint16_t ofp_port);<br>
+static bool iface_create(struct bridge *, struct if_cfg *,<br>
+                         ofp_port_t ofp_port);<br>
 static bool iface_is_internal(const struct ovsrec_interface *iface,<br>
                               const struct ovsrec_bridge *br);<br>
 static const char *iface_get_type(const struct ovsrec_interface *,<br>
@@ -255,9 +256,9 @@ static struct iface *iface_lookup(const struct bridge *, const char *name);<br>
 static struct iface *iface_find(const char *name);<br>
 static struct if_cfg *if_cfg_lookup(const struct bridge *, const char *name);<br>
 static struct iface *iface_from_ofp_port(const struct bridge *,<br>
-                                         uint16_t ofp_port);<br>
+                                         ofp_port_t ofp_port);<br>
 static void iface_set_mac(struct iface *);<br>
-static void iface_set_ofport(const struct ovsrec_interface *, uint16_t ofport);<br>
+static void iface_set_ofport(const struct ovsrec_interface *, ofp_port_t ofport);<br>
 static void iface_clear_db_record(const struct ovsrec_interface *if_cfg);<br>
 static void iface_configure_qos(struct iface *, const struct ovsrec_qos *);<br>
 static void iface_configure_cfm(struct iface *);<br>
@@ -265,7 +266,7 @@ static void iface_refresh_cfm_stats(struct iface *);<br>
 static void iface_refresh_stats(struct iface *);<br>
 static void iface_refresh_status(struct iface *);<br>
 static bool iface_is_synthetic(const struct iface *);<br>
-static uint16_t iface_pick_ofport(const struct ovsrec_interface *);<br>
+static ofp_port_t iface_pick_ofport(const struct ovsrec_interface *);<br>
<br>
 /* Linux VLAN device support (e.g. &quot;eth0.10&quot; for VLAN 10.)<br>
  *<br>
@@ -1277,13 +1278,14 @@ add_del_bridges(const struct ovsrec_open_vswitch *cfg)<br>
 }<br>
<br>
 static void<br>
-iface_set_ofp_port(struct iface *iface, uint16_t ofp_port)<br>
+iface_set_ofp_port(struct iface *iface, ofp_port_t ofp_port)<br>
 {<br>
     struct bridge *br = iface-&gt;port-&gt;bridge;<br>
<br>
     ovs_assert(iface-&gt;ofp_port == OFPP_NONE &amp;&amp; ofp_port != OFPP_NONE);<br>
     iface-&gt;ofp_port = ofp_port;<br>
-    hmap_insert(&amp;br-&gt;ifaces, &amp;iface-&gt;ofp_port_node, hash_int(ofp_port, 0));<br>
+    hmap_insert(&amp;br-&gt;ifaces, &amp;iface-&gt;ofp_port_node,<br>
+                hash_ofp_port(ofp_port, 0));<br>
     iface_set_ofport(iface-&gt;cfg, ofp_port);<br>
 }<br>
<br>
@@ -1318,7 +1320,7 @@ bridge_refresh_one_ofp_port(struct bridge *br,<br>
 {<br>
     const char *name = ofproto_port-&gt;name;<br>
     const char *type = ofproto_port-&gt;type;<br>
-    uint16_t ofp_port = ofproto_port-&gt;ofp_port;<br>
+    ofp_port_t ofp_port = ofproto_port-&gt;ofp_port;<br>
<br>
     struct iface *iface = iface_lookup(br, name);<br>
     if (iface) {<br>
@@ -1421,7 +1423,7 @@ bridge_refresh_ofp_port(struct bridge *br)<br>
 static int<br>
 iface_do_create(const struct bridge *br,<br>
                 const struct if_cfg *if_cfg,<br>
-                uint16_t *ofp_portp, struct netdev **netdevp)<br>
+                ofp_port_t *ofp_portp, struct netdev **netdevp)<br>
 {<br>
     const struct ovsrec_interface *iface_cfg = if_cfg-&gt;cfg;<br>
     const struct ovsrec_port *port_cfg = if_cfg-&gt;parent;<br>
@@ -1449,7 +1451,7 @@ iface_do_create(const struct bridge *br,<br>
     }<br>
<br>
     if (*ofp_portp == OFPP_NONE) {<br>
-        uint16_t ofp_port = if_cfg-&gt;ofport;<br>
+        ofp_port_t ofp_port = if_cfg-&gt;ofport;<br>
<br>
         error = ofproto_port_add(br-&gt;ofproto, netdev, &amp;ofp_port);<br>
         if (error) {<br>
@@ -1485,7 +1487,7 @@ error:<br>
  *<br>
  * Return true if an iface is successfully created, false otherwise. */<br>
 static bool<br>
-iface_create(struct bridge *br, struct if_cfg *if_cfg, uint16_t ofp_port)<br>
+iface_create(struct bridge *br, struct if_cfg *if_cfg, ofp_port_t ofp_port)<br>
 {<br>
     const struct ovsrec_interface *iface_cfg = if_cfg-&gt;cfg;<br>
     const struct ovsrec_port *port_cfg = if_cfg-&gt;parent;<br>
@@ -1496,6 +1498,7 @@ iface_create(struct bridge *br, struct if_cfg *if_cfg, uint16_t ofp_port)<br>
     int error;<br>
     bool ok = true;<br>
<br>
+    VLOG_INFO(&quot;iface_create ofp_port: %u&quot;, ofp_port);<br>
     /* Do the bits that can fail up front.<br>
      *<br>
      * It&#39;s a bit dangerous to call bridge_run_fast() here as ofproto&#39;s<br>
@@ -1547,7 +1550,7 @@ iface_create(struct bridge *br, struct if_cfg *if_cfg, uint16_t ofp_port)<br>
<br>
             error = netdev_open(port-&gt;name, &quot;internal&quot;, &amp;netdev);<br>
             if (!error) {<br>
-                uint16_t fake_ofp_port = if_cfg-&gt;ofport;<br>
+                ofp_port_t fake_ofp_port = if_cfg-&gt;ofport;<br>
<br>
                 ofproto_port_add(br-&gt;ofproto, netdev, &amp;fake_ofp_port);<br>
                 netdev_close(netdev);<br>
@@ -3291,7 +3294,7 @@ iface_configure_lacp(struct iface *iface, struct lacp_slave_settings *s)<br>
     key = smap_get_int(&amp;iface-&gt;cfg-&gt;other_config, &quot;lacp-aggregation-key&quot;, 0);<br>
<br>
     if (portid &lt;= 0 || portid &gt; UINT16_MAX) {<br>
-        portid = iface-&gt;ofp_port;<br>
+        portid = ofp_to_u16(iface-&gt;ofp_port);<br>
     }<br>
<br>
     if (priority &lt;= 0 || priority &gt; UINT16_MAX) {<br>
@@ -3479,12 +3482,13 @@ if_cfg_lookup(const struct bridge *br, const char *name)<br>
 }<br>
<br>
 static struct iface *<br>
-iface_from_ofp_port(const struct bridge *br, uint16_t ofp_port)<br>
+iface_from_ofp_port(const struct bridge *br, ofp_port_t ofp_port)<br>
 {<br>
     struct iface *iface;<br>
<br>
     HMAP_FOR_EACH_IN_BUCKET (iface, ofp_port_node,<br>
-                             hash_int(ofp_port, 0), &amp;br-&gt;ifaces) {<br>
+                             hash_ofp_port(ofp_port, 0),<br>
+                             &amp;br-&gt;ifaces) {<br>
         if (iface-&gt;ofp_port == ofp_port) {<br>
             return iface;<br>
         }<br>
@@ -3520,10 +3524,10 @@ iface_set_mac(struct iface *iface)<br>
<br>
 /* Sets the ofport column of &#39;if_cfg&#39; to &#39;ofport&#39;. */<br>
 static void<br>
-iface_set_ofport(const struct ovsrec_interface *if_cfg, uint16_t ofport)<br>
+iface_set_ofport(const struct ovsrec_interface *if_cfg, ofp_port_t ofport)<br>
 {<br>
     int64_t port_;<br>
-    port_ = (ofport == OFPP_NONE) ? -1 : ofport;<br>
+    port_ = (ofport == OFPP_NONE) ? -1 : ofp_to_u16(ofport);<br>
     if (if_cfg &amp;&amp; !ovsdb_idl_row_is_synthetic(&amp;if_cfg-&gt;header_)) {<br>
         ovsrec_interface_set_ofport(if_cfg, &amp;port_, 1);<br>
     }<br>
@@ -3709,11 +3713,13 @@ iface_is_synthetic(const struct iface *iface)<br>
     return ovsdb_idl_row_is_synthetic(&amp;iface-&gt;cfg-&gt;header_);<br>
 }<br>
<br>
-static uint16_t<br>
+static ofp_port_t<br>
 iface_pick_ofport(const struct ovsrec_interface *cfg)<br>
 {<br>
-    uint16_t ofport = cfg-&gt;n_ofport ? *cfg-&gt;ofport : OFPP_NONE;<br>
-    return cfg-&gt;n_ofport_request ? *cfg-&gt;ofport_request : ofport;<br>
+    ofp_port_t ofport = cfg-&gt;n_ofport ? uint_to_ofp(*cfg-&gt;ofport)<br>
+                                      : OFPP_NONE;<br>
+    return cfg-&gt;n_ofport_request ? uint_to_ofp(*cfg-&gt;ofport_request)<br>
+                                 : ofport;<br>
 }<br>
<br>
<br>
@@ -4091,7 +4097,7 @@ static void<br>
 configure_splinter_port(struct port *port)<br>
 {<br>
     struct ofproto *ofproto = port-&gt;bridge-&gt;ofproto;<br>
-    uint16_t realdev_ofp_port;<br>
+    ofp_port_t realdev_ofp_port;<br>
     const char *realdev_name;<br>
     struct iface *vlandev, *realdev;<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.7.9.5<br>
<br>
</font></span></blockquote></div><br></div>