Re: [ovs-dev] [RFC v4 1/1] datapath: Add a new action check_pkt_len

2019-02-24 Thread Numan Siddique
On Sat, Feb 23, 2019 at 2:35 AM Gregory Rose  wrote:

> Numan,
>
> I intend to test and review this on my local net-next branch but I'm not
> feeling well so it will probably be
> early next week before I can do that.  Sorry for the delay...
>
>
No worries. Please take your time.
If you want to test it out, you probably need the corresponding
ovs-vswitchd patch.
I still need to address the review comments from Ben. But you can use the
one from here -
https://github.com/numansiddique/ovs/tree/ovn_mtu_fix/rfc_v4_p4
https://github.com/numansiddique/ovs/commits/ovn_mtu_fix/rfc_v4_p4 for your
testing.

Thanks
Numan



- Greg
>
> On 2/21/2019 10:42 AM, nusid...@redhat.com wrote:
> > From: Numan Siddique 
> >
> > [Please note, this patch is submitted as RFC in ovs-dev ML to
> > get feedback before submitting to netdev ML. You need net-next tree
> > to apply this patch]
> >
> > This patch adds a new action - 'check_pkt_len' which checks the
> > packet length and executes a set of actions if the packet
> > length is greater than the specified length or executes
> > another set of actions if the packet length is lesser or equal to.
> >
> > This action takes below nlattrs
> >* OVS_CHECK_PKT_LEN_ATTR_PKT_LEN - 'pkt_len' to check for
> >
> >* OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER - Nested actions
> >  to apply if the packet length is greater than the specified
> 'pkt_len'
> >
> >* OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL - Nested
> >  actions to apply if the packet length is lesser or equal to the
> >  specified 'pkt_len'.
> >
> > The main use case for adding this action is to solve the packet
> > drops because of MTU mismatch in OVN virtual networking solution.
> > When a VM (which belongs to a logical switch of OVN) sends a packet
> > destined to go via the gateway router and if the nic which provides
> > external connectivity, has a lesser MTU, OVS drops the packet
> > if the packet length is greater than this MTU.
> >
> > With the help of this action, OVN will check the packet length
> > and if it is greater than the MTU size, it will generate an
> > ICMP packet (type 3, code 4) and includes the next hop mtu in it
> > so that the sender can fragment the packets.
> >
> > Reported-at:
> > https://mail.openvswitch.org/pipermail/ovs-discuss/2018-July/047039.html
> > Suggested-by: Ben Pfaff 
> > Signed-off-by: Numan Siddique 
> > CC: Ben Pfaff 
> > CC: Greg Rose 
> > CC: Lorenzo Bianconi 
> > ---
> >
> > v3 -> v4
> > 
> >   * v4 only has 1 patch - datapath patch which implements the
> >   * check_pkt_len action
> >   * Addressed the review comments from Lorenzo, Ben and Greg
> >
> >
> >   include/uapi/linux/openvswitch.h |  42 
> >   net/openvswitch/actions.c|  49 +
> >   net/openvswitch/flow_netlink.c   | 171 +++
> >   3 files changed, 262 insertions(+)
> >
> > diff --git a/include/uapi/linux/openvswitch.h
> b/include/uapi/linux/openvswitch.h
> > index dbe0cbe4f1b7..05ab885c718d 100644
> > --- a/include/uapi/linux/openvswitch.h
> > +++ b/include/uapi/linux/openvswitch.h
> > @@ -798,6 +798,44 @@ struct ovs_action_push_eth {
> >   struct ovs_key_ethernet addresses;
> >   };
> >
> > +/*
> > + * enum ovs_check_pkt_len_attr - Attributes for
> %OVS_ACTION_ATTR_CHECK_PKT_LEN.
> > + *
> > + * @OVS_CHECK_PKT_LEN_ATTR_PKT_LEN: u16 Packet length to check for.
> > + * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER: Nested OVS_ACTION_ATTR_*
> > + * actions to apply if the packer length is greater than the specified
> > + * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN.
> > + * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL - Nested
> OVS_ACTION_ATTR_*
> > + * actions to apply if the packer length is lesser or equal to the
> specified
> > + * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN.
> > + */
> > +enum ovs_check_pkt_len_attr {
> > + OVS_CHECK_PKT_LEN_ATTR_UNSPEC,
> > + OVS_CHECK_PKT_LEN_ATTR_PKT_LEN,
> > + OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER,
> > + OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL,
> > + __OVS_CHECK_PKT_LEN_ATTR_MAX,
> > +
> > +#ifdef __KERNEL__
> > + OVS_CHECK_PKT_LEN_ATTR_ARG  /* struct check_pkt_len_arg  */
> > +#endif
> > +};
> > +
> > +#define OVS_CHECK_PKT_LEN_ATTR_MAX (__OVS_CHECK_PKT_LEN_ATTR_MAX - 1)
> > +
> > +#ifdef __KERNEL__
> > +struct check_pkt_len_arg {
> > + u16 pkt_len;/* Same value as OVS_CHECK_PKT_LEN_ATTR_PKT_LEN'.
> */
> > + bool exec_for_greater;  /* When true, actions in IF_GREATE will
> > +  * not change flow keys. False otherwise.
> > +  */
> > + bool exec_for_lesser_equal; /* When true, actions in IF_LESS_EQUAL
> > +  * will not change flow keys. False
> > +  * otherwise.
> > +  */
> > +};
> > +#endif
> > +
> >   /**
> >* enum ovs_action_attr - Action types.
> >*
> > @@ -842,6 +

Re: [ovs-dev] Avoid packet drop on LACP bond after link up

2019-02-24 Thread 0-day Robot
Bleep bloop.  Greetings Nitin Katiyar, I am a robot and I have tried out your 
patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


build:
/bin/sh ./libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. 
   -I ./include -I ./include -I ./lib -I ./lib-Wstrict-prototypes -Wall 
-Wextra -Wno-sign-compare -Wpointer-arith -Wformat -Wformat-security 
-Wswitch-enum -Wunused-parameter -Wbad-function-cast -Wcast-align 
-Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes 
-Wmissing-field-initializers -fno-strict-aliasing -Wshadow -Werror -Werror   -g 
-O2 -MT lib/jhash.lo -MD -MP -MF $depbase.Tpo -c -o lib/jhash.lo lib/jhash.c &&\
mv -f $depbase.Tpo $depbase.Plo
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I ./include -I ./include 
-I ./lib -I ./lib -Wstrict-prototypes -Wall -Wextra -Wno-sign-compare 
-Wpointer-arith -Wformat -Wformat-security -Wswitch-enum -Wunused-parameter 
-Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition 
-Wmissing-prototypes -Wmissing-field-initializers -fno-strict-aliasing -Wshadow 
-Werror -Werror -g -O2 -MT lib/jhash.lo -MD -MP -MF lib/.deps/jhash.Tpo -c 
lib/jhash.c -o lib/jhash.o
depbase=`echo lib/json.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ./libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. 
   -I ./include -I ./include -I ./lib -I ./lib-Wstrict-prototypes -Wall 
-Wextra -Wno-sign-compare -Wpointer-arith -Wformat -Wformat-security 
-Wswitch-enum -Wunused-parameter -Wbad-function-cast -Wcast-align 
-Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes 
-Wmissing-field-initializers -fno-strict-aliasing -Wshadow -Werror -Werror   -g 
-O2 -MT lib/json.lo -MD -MP -MF $depbase.Tpo -c -o lib/json.lo lib/json.c &&\
mv -f $depbase.Tpo $depbase.Plo
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I ./include -I ./include 
-I ./lib -I ./lib -Wstrict-prototypes -Wall -Wextra -Wno-sign-compare 
-Wpointer-arith -Wformat -Wformat-security -Wswitch-enum -Wunused-parameter 
-Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition 
-Wmissing-prototypes -Wmissing-field-initializers -fno-strict-aliasing -Wshadow 
-Werror -Werror -g -O2 -MT lib/json.lo -MD -MP -MF lib/.deps/json.Tpo -c 
lib/json.c -o lib/json.o
depbase=`echo lib/jsonrpc.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ./libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. 
   -I ./include -I ./include -I ./lib -I ./lib-Wstrict-prototypes -Wall 
-Wextra -Wno-sign-compare -Wpointer-arith -Wformat -Wformat-security 
-Wswitch-enum -Wunused-parameter -Wbad-function-cast -Wcast-align 
-Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes 
-Wmissing-field-initializers -fno-strict-aliasing -Wshadow -Werror -Werror   -g 
-O2 -MT lib/jsonrpc.lo -MD -MP -MF $depbase.Tpo -c -o lib/jsonrpc.lo 
lib/jsonrpc.c &&\
mv -f $depbase.Tpo $depbase.Plo
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I ./include -I ./include 
-I ./lib -I ./lib -Wstrict-prototypes -Wall -Wextra -Wno-sign-compare 
-Wpointer-arith -Wformat -Wformat-security -Wswitch-enum -Wunused-parameter 
-Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition 
-Wmissing-prototypes -Wmissing-field-initializers -fno-strict-aliasing -Wshadow 
-Werror -Werror -g -O2 -MT lib/jsonrpc.lo -MD -MP -MF lib/.deps/jsonrpc.Tpo -c 
lib/jsonrpc.c -o lib/jsonrpc.o
depbase=`echo lib/lacp.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ./libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. 
   -I ./include -I ./include -I ./lib -I ./lib-Wstrict-prototypes -Wall 
-Wextra -Wno-sign-compare -Wpointer-arith -Wformat -Wformat-security 
-Wswitch-enum -Wunused-parameter -Wbad-function-cast -Wcast-align 
-Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes 
-Wmissing-field-initializers -fno-strict-aliasing -Wshadow -Werror -Werror   -g 
-O2 -MT lib/lacp.lo -MD -MP -MF $depbase.Tpo -c -o lib/lacp.lo lib/lacp.c &&\
mv -f $depbase.Tpo $depbase.Plo
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I ./include -I ./include 
-I ./lib -I ./lib -Wstrict-prototypes -Wall -Wextra -Wno-sign-compare 
-Wpointer-arith -Wformat -Wformat-security -Wswitch-enum -Wunused-parameter 
-Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition 
-Wmissing-prototypes -Wmissing-field-initializers -fno-strict-aliasing -Wshadow 
-Werror -Werror -g -O2 -MT lib/lacp.lo -MD -MP -MF lib/.deps/lacp.Tpo -c 
lib/lacp.c -o lib/lacp.o
lib/lacp.c: In function 'lacp_process_packet':
lib/lacp.c:329:52: error: unused parameter 'bond' [-Werror=unused-parameter]
 lacp_process_packet(struct lacp *lacp, const void *bond, const void *slave_,
^
cc1: all warnings being treated as errors
make[2]: *** [lib/lacp.lo] Error 1
make[2]: Leaving directory 
`/var/lib/jenkins/jobs/upstream_build_from_pw/workspace'
make[1

[ovs-dev] [PATCH v2 2/2] Avoid packet drop on LACP bond after link up

2019-02-24 Thread Nitin Katiyar
Problem:

On certain Fortville NICs it has been observed that PHY UP detection can
get delayed (sometimes up to 4-5 secs). When the driver fails to fetch
PHY status as UP even though its actually UP,  LACP packets can get
exchanged and LACP slave brought UP. In such a case, the remote end
would start sending traffic on that slave, but OVS drops it, as the
bond-slave is not yet enabled due to PHY DOWN.

Fix:

The main intention here is delay LACP negotiation until carrier (PHY)
status is read as UP.

1. In port_run()/bundle_run(), cache the carrier status in
  "struct ofport_dpif"/"struct bond_slave".

2. When carrier state is DOWN, do not send any LACPDUs and
  drop any received LACPDUs.

3. When LACP state changes or LACPDU is received, trigger re-checking
  of carrier-state (in port_run()) by incrementing the connectivity
  sequence number to find out the true carrier state as fast as
  possible.

Signed-off-by: Nitin Katiyar 
Signed-off-by: Manohar Krishnappa Chidambaraswamy 
Co-authored-by: Manohar Krishnappa Chidambaraswamy 
---
 lib/lacp.c | 40 +---
 lib/lacp.h |  4 ++--
 ofproto/bond.c | 30 ++
 ofproto/bond.h |  3 +++
 ofproto/ofproto-dpif.c | 10 +++---
 tests/ofproto-dpif.at  |  3 +++
 6 files changed, 78 insertions(+), 12 deletions(-)

diff --git a/lib/lacp.c b/lib/lacp.c
index 7ac85f9..359b6ce 100644
--- a/lib/lacp.c
+++ b/lib/lacp.c
@@ -33,6 +33,7 @@
 #include "unixctl.h"
 #include "openvswitch/vlog.h"
 #include "util.h"
+#include "ofproto/bond.h"
 
 VLOG_DEFINE_THIS_MODULE(lacp);
 
@@ -148,7 +149,7 @@ static void slave_get_actor(struct slave *, struct 
lacp_info *actor)
 OVS_REQUIRES(mutex);
 static void slave_get_priority(struct slave *, struct lacp_info *priority)
 OVS_REQUIRES(mutex);
-static bool slave_may_tx(const struct slave *)
+static bool slave_may_tx(const void *bond, const struct slave *)
 OVS_REQUIRES(mutex);
 static struct slave *slave_lookup(const struct lacp *, const void *slave)
 OVS_REQUIRES(mutex);
@@ -334,6 +335,7 @@ lacp_process_packet(struct lacp *lacp, const void *bond, 
const void *slave_,
 const struct lacp_pdu *pdu;
 long long int tx_rate;
 struct slave *slave;
+bool carrier_up = false;
 bool lacp_may_enable = false;
 
 lacp_lock();
@@ -350,6 +352,21 @@ lacp_process_packet(struct lacp *lacp, const void *bond, 
const void *slave_,
 goto out;
 }
 
+/*
+ * On some NICs L1 state reporting is slow. In case LACP packets are
+ * received while carrier (L1) state is still down, drop the LACPDU and
+ * trigger re-checking of L1 state.
+ */
+carrier_up = bond_slave_get_carrier(bond, slave_);
+if (!carrier_up) {
+seq_change(connectivity_seq_get());
+
+VLOG_INFO_RL(&rl, "carrier still DOWN - conn seq changed for %s, "
+  "dropping packet\n", slave->name);
+
+goto out;
+}
+
 slave->status = LACP_CURRENT;
 tx_rate = lacp->fast ? LACP_FAST_TIME_TX : LACP_SLOW_TIME_TX;
 timer_set_duration(&slave->rx, LACP_RX_MULTIPLIER * tx_rate);
@@ -529,7 +546,8 @@ lacp_slave_is_current(const struct lacp *lacp, const void 
*slave_)
 
 /* This function should be called periodically to update 'lacp'. */
 void
-lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex)
+lacp_run(struct lacp *lacp, const void *bond,
+ lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex)
 {
 struct slave *slave;
 
@@ -559,7 +577,7 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) 
OVS_EXCLUDED(mutex)
 HMAP_FOR_EACH (slave, node, &lacp->slaves) {
 struct lacp_info actor;
 
-if (!slave_may_tx(slave)) {
+if (!slave_may_tx(bond, slave)) {
 continue;
 }
 
@@ -588,13 +606,13 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) 
OVS_EXCLUDED(mutex)
 
 /* Causes poll_block() to wake up when lacp_run() needs to be called again. */
 void
-lacp_wait(struct lacp *lacp) OVS_EXCLUDED(mutex)
+lacp_wait(struct lacp *lacp, const void *bond) OVS_EXCLUDED(mutex)
 {
 struct slave *slave;
 
 lacp_lock();
 HMAP_FOR_EACH (slave, node, &lacp->slaves) {
-if (slave_may_tx(slave)) {
+if (slave_may_tx(bond, slave)) {
 timer_wait(&slave->tx);
 }
 
@@ -818,9 +836,17 @@ slave_get_priority(struct slave *slave, struct lacp_info 
*priority)
 }
 
 static bool
-slave_may_tx(const struct slave *slave) OVS_REQUIRES(mutex)
+slave_may_tx(const void *bond, const struct slave *slave)
+OVS_REQUIRES(mutex)
 {
-return slave->lacp->active || slave->status != LACP_DEFAULTED;
+bool carrier_up = true;
+
+if (bond) {
+carrier_up = bond_slave_get_carrier(bond, slave->aux);
+}
+
+return carrier_up &&
+(slave->lacp->active || slave->status != LACP_DEFAULTED);
 }
 
 static struct slave *
diff --git a/lib/lacp.h b/lib/lacp.h
index 1505c2c..9a302c9 100644
--- a/lib/

[ovs-dev] [PATCH v2 1/2] Avoid packet drop on LACP bond after link up

2019-02-24 Thread Nitin Katiyar
Problem:

During port DOWN->UP of link (slave) in a LACP bond, after receiving the
LACPDU with SYNC set for both actor and partner, the bond-slave remains
"disabled" until OVS main thread runs LACP state machine and eventually
"enables" the bond-slave. With this, we have observed delays in the order
of 350ms and packets are  dropped in OVS due to bond-admissibility check
(packets received on slave in "disabled" state are dropped).

Fix:

When a LACPDU is received, evaluate whether LACP slave can be enabled
(slave_may_enable()) and set LACP slave's may_enable from the datapath
thread itself. When may_enable = TRUE, it means L1 state is UP and
LACP-SYNC is done and it is waiting for the main thread to enable the
slave. Relax the check in bond_check_admissibility() to check for both
"enable" and "may_enable" of the LACP slave. This would avoid dropping
of packets until the main thread enables the slave from bundle_run().

Signed-off-by: Nitin Katiyar 
Signed-off-by: Manohar Krishnappa Chidambaraswamy 
Co-authored-by: Manohar Krishnappa Chidambaraswamy 
---
 lib/lacp.c   | 12 ++--
 lib/lacp.h   |  3 ++-
 ofproto/bond.c   | 16 +---
 ofproto/ofproto-dpif-xlate.c | 11 ++-
 4 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/lib/lacp.c b/lib/lacp.c
index d6b36aa..7ac85f9 100644
--- a/lib/lacp.c
+++ b/lib/lacp.c
@@ -154,6 +154,7 @@ static struct slave *slave_lookup(const struct lacp *, 
const void *slave)
 OVS_REQUIRES(mutex);
 static bool info_tx_equal(struct lacp_info *, struct lacp_info *)
 OVS_REQUIRES(mutex);
+static bool slave_may_enable__(struct slave *slave) OVS_REQUIRES(mutex);
 
 static unixctl_cb_func lacp_unixctl_show;
 static unixctl_cb_func lacp_unixctl_show_stats;
@@ -324,8 +325,8 @@ lacp_is_active(const struct lacp *lacp) OVS_EXCLUDED(mutex)
 /* Processes 'packet' which was received on 'slave_'.  This function should be
  * called on all packets received on 'slave_' with Ethernet Type ETH_TYPE_LACP.
  */
-void
-lacp_process_packet(struct lacp *lacp, const void *slave_,
+bool
+lacp_process_packet(struct lacp *lacp, const void *bond, const void *slave_,
 const struct dp_packet *packet)
 OVS_EXCLUDED(mutex)
 {
@@ -333,6 +334,7 @@ lacp_process_packet(struct lacp *lacp, const void *slave_,
 const struct lacp_pdu *pdu;
 long long int tx_rate;
 struct slave *slave;
+bool lacp_may_enable = false;
 
 lacp_lock();
 slave = slave_lookup(lacp, slave_);
@@ -362,8 +364,14 @@ lacp_process_packet(struct lacp *lacp, const void *slave_,
 slave->partner = pdu->actor;
 }
 
+/* Evaluate may_enable here to avoid dropping of packets till main thread
+ * sets may_enable to true. */
+lacp_may_enable = slave_may_enable__(slave);
+
 out:
 lacp_unlock();
+
+return lacp_may_enable;
 }
 
 /* Returns the lacp_status of the given 'lacp' object (which may be NULL). */
diff --git a/lib/lacp.h b/lib/lacp.h
index f35cff5..1505c2c 100644
--- a/lib/lacp.h
+++ b/lib/lacp.h
@@ -46,7 +46,8 @@ struct lacp *lacp_ref(const struct lacp *);
 void lacp_configure(struct lacp *, const struct lacp_settings *);
 bool lacp_is_active(const struct lacp *);
 
-void lacp_process_packet(struct lacp *, const void *slave,
+bool lacp_process_packet(struct lacp *, const void *bond,
+ const void *slave,
  const struct dp_packet *packet);
 enum lacp_status lacp_status(const struct lacp *);
 
diff --git a/ofproto/bond.c b/ofproto/bond.c
index d2a8b1f..cd6fd33 100644
--- a/ofproto/bond.c
+++ b/ofproto/bond.c
@@ -794,6 +794,7 @@ bond_check_admissibility(struct bond *bond, const void 
*slave_,
 {
 enum bond_verdict verdict = BV_DROP;
 struct bond_slave *slave;
+static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
 
 ovs_rwlock_rdlock(&rwlock);
 slave = bond_slave_lookup(bond, slave_);
@@ -811,7 +812,11 @@ bond_check_admissibility(struct bond *bond, const void 
*slave_,
  * drop all incoming traffic except if lacp_fallback_ab is enabled. */
 switch (bond->lacp_status) {
 case LACP_NEGOTIATED:
-verdict = slave->enabled ? BV_ACCEPT : BV_DROP;
+/* To reduce packet-drops due to delay in enabling of slave (post
+ * LACP-SYNC), from main thread, check for may_enable as well.
+ * When may_enable is TRUE, it means LACP is UP and waiting for the
+ * main thread to run LACP state machine and enable the slave. */
+verdict = (slave->enabled || slave->may_enable) ? BV_ACCEPT : BV_DROP;
 goto out;
 case LACP_CONFIGURED:
 if (!bond->lacp_fallback_ab) {
@@ -847,8 +852,6 @@ bond_check_admissibility(struct bond *bond, const void 
*slave_,
 /* Drop all packets which arrive on backup slaves.  This is similar to
  * how Linux bonding handles active-backup bonds. */
 if (bond->active_slave != slave) {
-static struct 

[ovs-dev] Hongkong or china representative needed urgently (job offer)

2019-02-24 Thread Hassan Jamel
I am the owner of Hassan Jamel Industries ltd. and it is a firm based in 
Morocco in Africa. Our company have problems collecting money for the already 
supplied works 

because the international USD currency is high in Morocco and when we receive 
USD payment to our bank account, we get payed by our local currency which is 
devalued by 

our bank. This becomes a great loss for us and we loose alot of money almost in 
every business we had 

We need your help to receive payments from our customers which will be 
transferred to your Bank Account. After cashing the fund, then we would inform 
you on how to 

resend the rest of the money to us. As your income, you will be getting 5% of 
any amount of USD you receive and process for us. This will save alot of money 
for us if 

we can receive USD not in Morocco. If you are interested in our offer, please 
reply to me to continue further:.

Best Regards
Hassan Jamel 
Managing Director
Hassan Jamel Industries ltd 
Email: hassanjamel0...@gmail.com
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH V5 0/2] Do not rewrite fields with the same values as matched

2019-02-24 Thread Eli Britstein


On 2/22/2019 6:42 PM, Ben Pfaff wrote:
> On Sun, Feb 17, 2019 at 09:18:46AM +, Eli Britstein wrote:
>> This patch set avoids unnecessary rewrite actions to fields with the
>> same values as matched on.
>>
>> Patch 1 is a pre-step of generating ovs key fields macros
>> Patch 2 avoids the unnecessary rewrites and adapts the tests accordingly
> Thanks for the revision.
>
> Do you foresee other uses of OVS_KEY_FIELD in the future?  As is,
> there's a lot of duplication here from the numerous declarations like
>
>  struct ovs_key_field_properties ovs_key_nd_extensions_properties[] = {
> #define OVS_KEY_FIELD(type, name) {offsetof(struct ovs_key_nd_extensions, 
> name), sizeof(type)},
>  OVS_KEY_ND_EXTENSIONS_FIELDS
>  {0, 0}
> #undef OVS_KEY_FIELD
>  };
>
> If this is the only currently foreseen use, it would be better to have
> the code generator just generate the declarations directly instead of
> forcing these later duplications.

Please note the definitions are not exactly duplicated - each define 
refers to a different struct. Currently I don't know what other uses 
will be needed/done in the future. However, I think we should remain 
with more generic and flexible code, that will allow easier use of those 
macros in the future rather than specific macros.

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev