Merge branch 'mainstream'
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Wed, 27 Feb 2013 09:01:41 +0000 (10:01 +0100)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Wed, 27 Feb 2013 09:01:41 +0000 (10:01 +0100)
1  2 
Makefile.am
lib/automake.mk
lib/dpif-netdev.c

diff --combined Makefile.am
@@@ -56,6 -56,7 +56,7 @@@ EXTRA_DIST = 
        OPENFLOW-1.1+ \
        PORTING \
        README-gcov \
+       README-lisp \
        REPORTING-BUGS \
        SubmittingPatches \
        WHY-OVS \
@@@ -106,7 -107,6 +107,7 @@@ ro_shell = printf '\043 Generated autom
  
  SUFFIXES += .in
  .in:
 +      @mkdir -p $$(dirname $@)
        $(PERL) $(srcdir)/build-aux/soexpand.pl -I$(srcdir) < $< | \
            sed \
                -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
@@@ -148,7 -148,7 +149,7 @@@ dist-hook-git: distfile
          (cd datapath && $(MAKE) distfiles);                               \
          (cat distfiles; sed 's|^|datapath/|' datapath/distfiles) |        \
            sort -u > all-distfiles;                                        \
 -        (cd $(srcdir) && git ls-files) | grep -v '\.gitignore$$' |        \
 +        (cd $(srcdir) && git ls-files) | grep -vFf $(srcdir)/.non-distfiles |     \
            sort -u > all-gitfiles;                                         \
          comm -1 -3 all-distfiles all-gitfiles > missing-distfiles;        \
          if test -s missing-distfiles; then                                \
@@@ -258,4 -258,3 +259,4 @@@ include rhel/automake.m
  include xenserver/automake.mk
  include python/automake.mk
  include python/compat/automake.mk
 +include planetlab/automake.mk
diff --combined lib/automake.mk
@@@ -10,8 -10,6 +10,6 @@@ noinst_LIBRARIES += lib/libopenvswitch.
  lib_libopenvswitch_a_SOURCES = \
        lib/aes128.c \
        lib/aes128.h \
-       lib/autopath.c \
-       lib/autopath.h \
        lib/backtrace.c \
        lib/backtrace.h \
        lib/bitmap.c \
@@@ -90,8 -88,6 +88,8 @@@
        lib/multipath.c \
        lib/multipath.h \
        lib/netdev-dummy.c \
 +      lib/netdev-tunnel.c \
 +      lib/netdev-pltap.c \
        lib/netdev-provider.h \
        lib/netdev-vport.c \
        lib/netdev-vport.h \
        lib/timeval.h \
        lib/token-bucket.c \
        lib/token-bucket.h \
 +      lib/tunalloc.c \
 +      lib/tunalloc.h \
        lib/type-props.h \
        lib/unaligned.h \
        lib/unicode.c \
diff --combined lib/dpif-netdev.c
@@@ -151,7 -151,7 +151,7 @@@ static int dpif_netdev_open(const struc
                              bool create, struct dpif **);
  static int dp_netdev_output_userspace(struct dp_netdev *, const struct ofpbuf *,
                                      int queue_no, const struct flow *,
-                                     uint64_t arg);
+                                     const struct nlattr *userdata);
  static void dp_netdev_execute_actions(struct dp_netdev *,
                                        struct ofpbuf *, struct flow *,
                                        const struct nlattr *actions,
@@@ -187,17 -187,10 +187,17 @@@ dpif_netdev_class_is_dummy(const struc
      return class != &dpif_netdev_class;
  }
  
 +static bool
 +dpif_netdev_class_is_planetlab(const struct dpif_class *class)
 +{
 +    return class == &dpif_planetlab_class;
 +}
 +
  static const char *
  dpif_netdev_port_open_type(const struct dpif_class *class, const char *type)
  {
      return strcmp(type, "internal") ? type
 +                  : dpif_netdev_class_is_planetlab(class) ? "pltap"
                    : dpif_netdev_class_is_dummy(class) ? "dummy"
                    : "tap";
  }
@@@ -223,8 -216,7 +223,8 @@@ choose_port(struct dp_netdev *dp, cons
  {
      int port_no;
  
 -    if (dp->class != &dpif_netdev_class) {
 +    if (dp->class != &dpif_netdev_class && 
 +        dp->class != &dpif_planetlab_class) {
          const char *p;
          int start_no = 0;
  
@@@ -1051,7 -1043,7 +1051,7 @@@ dp_netdev_port_input(struct dp_netdev *
          dp->n_hit++;
      } else {
          dp->n_missed++;
-         dp_netdev_output_userspace(dp, packet, DPIF_UC_MISS, &key, 0);
+         dp_netdev_output_userspace(dp, packet, DPIF_UC_MISS, &key, NULL);
      }
  }
  
@@@ -1116,37 -1108,51 +1116,51 @@@ dp_netdev_output_port(struct dp_netdev 
  
  static int
  dp_netdev_output_userspace(struct dp_netdev *dp, const struct ofpbuf *packet,
-                          int queue_no, const struct flow *flow, uint64_t arg)
+                            int queue_no, const struct flow *flow,
+                            const struct nlattr *userdata)
  {
      struct dp_netdev_queue *q = &dp->queues[queue_no];
-     struct dp_netdev_upcall *u;
-     struct dpif_upcall *upcall;
-     struct ofpbuf *buf;
-     size_t key_len;
-     if (q->head - q->tail >= MAX_QUEUE_LEN) {
-         dp->n_lost++;
-         return ENOBUFS;
-     }
+     if (q->head - q->tail < MAX_QUEUE_LEN) {
+         struct dp_netdev_upcall *u = &q->upcalls[q->head++ & QUEUE_MASK];
+         struct dpif_upcall *upcall = &u->upcall;
+         struct ofpbuf *buf = &u->buf;
+         size_t buf_size;
+         upcall->type = queue_no;
+         /* Allocate buffer big enough for everything. */
+         buf_size = ODPUTIL_FLOW_KEY_BYTES + 2 + packet->size;
+         if (userdata) {
+             buf_size += NLA_ALIGN(userdata->nla_len);
+         }
+         ofpbuf_init(buf, buf_size);
  
-     u = &q->upcalls[q->head++ & QUEUE_MASK];
+         /* Put ODP flow. */
+         odp_flow_key_from_flow(buf, flow, flow->in_port);
+         upcall->key = buf->data;
+         upcall->key_len = buf->size;
  
-     buf = &u->buf;
-     ofpbuf_init(buf, ODPUTIL_FLOW_KEY_BYTES + 2 + packet->size);
-     odp_flow_key_from_flow(buf, flow, flow->in_port);
-     key_len = buf->size;
-     ofpbuf_pull(buf, key_len);
-     ofpbuf_reserve(buf, 2);
-     ofpbuf_put(buf, packet->data, packet->size);
+         /* Put userdata. */
+         if (userdata) {
+             upcall->userdata = ofpbuf_put(buf, userdata,
+                                           NLA_ALIGN(userdata->nla_len));
+         }
  
-     upcall = &u->upcall;
-     upcall->type = queue_no;
-     upcall->packet = buf;
-     upcall->key = buf->base;
-     upcall->key_len = key_len;
-     upcall->userdata = arg;
+         /* Put packet.
+          *
+          * We adjust 'data' and 'size' in 'buf' so that only the packet itself
+          * is visible in 'upcall->packet'.  The ODP flow and (if present)
+          * userdata become part of the headroom. */
+         ofpbuf_put_zeros(buf, 2);
+         buf->data = ofpbuf_put(buf, packet->data, packet->size);
+         buf->size = packet->size;
+         upcall->packet = buf;
  
-     return 0;
+         return 0;
+     } else {
+         dp->n_lost++;
+         return ENOBUFS;
+     }
  }
  
  static void
@@@ -1188,11 -1194,9 +1202,9 @@@ dp_netdev_action_userspace(struct dp_ne
                            struct ofpbuf *packet, struct flow *key,
                            const struct nlattr *a)
  {
-     const struct nlattr *userdata_attr;
-     uint64_t userdata;
+     const struct nlattr *userdata;
  
-     userdata_attr = nl_attr_find_nested(a, OVS_USERSPACE_ATTR_USERDATA);
-     userdata = userdata_attr ? nl_attr_get_u64(userdata_attr) : 0;
+     userdata = nl_attr_find_nested(a, OVS_USERSPACE_ATTR_USERDATA);
      dp_netdev_output_userspace(dp, packet, DPIF_UC_ACTION, key, userdata);
  }
  
@@@ -1241,6 -1245,10 +1253,10 @@@ execute_set_action(struct ofpbuf *packe
          packet_set_udp_port(packet, udp_key->udp_src, udp_key->udp_dst);
          break;
  
+      case OVS_KEY_ATTR_MPLS:
+          set_mpls_lse(packet, nl_attr_get_be32(a));
+          break;
       case OVS_KEY_ATTR_UNSPEC:
       case OVS_KEY_ATTR_ENCAP:
       case OVS_KEY_ATTR_ETHERTYPE:
@@@ -1287,6 -1295,16 +1303,16 @@@ dp_netdev_execute_actions(struct dp_net
              eth_pop_vlan(packet);
              break;
  
+         case OVS_ACTION_ATTR_PUSH_MPLS: {
+             const struct ovs_action_push_mpls *mpls = nl_attr_get(a);
+             push_mpls(packet, mpls->mpls_ethertype, mpls->mpls_lse);
+             break;
+          }
+         case OVS_ACTION_ATTR_POP_MPLS:
+             pop_mpls(packet, nl_attr_get_be16(a));
+             break;
          case OVS_ACTION_ATTR_SET:
              execute_set_action(packet, nl_attr_get(a));
              break;
      }
  }
  
 +#define DPIF_NETDEV_CLASS_FUNCTIONS                   \
 +    dpif_netdev_enumerate,                            \
 +    dpif_netdev_port_open_type,                               \
 +    dpif_netdev_open,                                 \
 +    dpif_netdev_close,                                        \
 +    dpif_netdev_destroy,                              \
 +    dpif_netdev_run,                                  \
 +    dpif_netdev_wait,                                 \
 +    dpif_netdev_get_stats,                            \
 +    dpif_netdev_port_add,                             \
 +    dpif_netdev_port_del,                             \
 +    dpif_netdev_port_query_by_number,                 \
 +    dpif_netdev_port_query_by_name,                   \
 +    dpif_netdev_get_max_ports,                                \
 +    NULL,                       /* port_get_pid */    \
 +    dpif_netdev_port_dump_start,                      \
 +    dpif_netdev_port_dump_next,                               \
 +    dpif_netdev_port_dump_done,                               \
 +    dpif_netdev_port_poll,                            \
 +    dpif_netdev_port_poll_wait,                               \
 +    dpif_netdev_flow_get,                             \
 +    dpif_netdev_flow_put,                             \
 +    dpif_netdev_flow_del,                             \
 +    dpif_netdev_flow_flush,                           \
 +    dpif_netdev_flow_dump_start,                      \
 +    dpif_netdev_flow_dump_next,                               \
 +    dpif_netdev_flow_dump_done,                               \
 +    dpif_netdev_execute,                              \
 +    NULL,                       /* operate */         \
 +    dpif_netdev_recv_set,                             \
 +    dpif_netdev_queue_to_priority,                    \
 +    dpif_netdev_recv,                                 \
 +    dpif_netdev_recv_wait,                            \
 +    dpif_netdev_recv_purge,                           \
 +
  const struct dpif_class dpif_netdev_class = {
      "netdev",
 -    dpif_netdev_enumerate,
 -    dpif_netdev_port_open_type,
 -    dpif_netdev_open,
 -    dpif_netdev_close,
 -    dpif_netdev_destroy,
 -    dpif_netdev_run,
 -    dpif_netdev_wait,
 -    dpif_netdev_get_stats,
 -    dpif_netdev_port_add,
 -    dpif_netdev_port_del,
 -    dpif_netdev_port_query_by_number,
 -    dpif_netdev_port_query_by_name,
 -    dpif_netdev_get_max_ports,
 -    NULL,                       /* port_get_pid */
 -    dpif_netdev_port_dump_start,
 -    dpif_netdev_port_dump_next,
 -    dpif_netdev_port_dump_done,
 -    dpif_netdev_port_poll,
 -    dpif_netdev_port_poll_wait,
 -    dpif_netdev_flow_get,
 -    dpif_netdev_flow_put,
 -    dpif_netdev_flow_del,
 -    dpif_netdev_flow_flush,
 -    dpif_netdev_flow_dump_start,
 -    dpif_netdev_flow_dump_next,
 -    dpif_netdev_flow_dump_done,
 -    dpif_netdev_execute,
 -    NULL,                       /* operate */
 -    dpif_netdev_recv_set,
 -    dpif_netdev_queue_to_priority,
 -    dpif_netdev_recv,
 -    dpif_netdev_recv_wait,
 -    dpif_netdev_recv_purge,
 +    DPIF_NETDEV_CLASS_FUNCTIONS
 +};
 +
 +const struct dpif_class dpif_planetlab_class = {
 +    "planetlab",
 +    DPIF_NETDEV_CLASS_FUNCTIONS
  };
  
  static void
@@@ -1377,4 -1387,3 +1403,4 @@@ dpif_dummy_register(bool override
  
      dpif_dummy_register__("dummy");
  }
 +