aboutsummaryrefslogtreecommitdiffstats
path: root/include/uapi/linux/openvswitch.h
diff options
context:
space:
mode:
authorNuman Siddique <nusiddiq@redhat.com>2019-03-25 20:43:46 -0400
committerDavid S. Miller <davem@davemloft.net>2019-03-27 16:53:23 -0400
commit4d5ec89fc8d14dcdab7214a0c13a1c7321dc6ea9 (patch)
treec8f253e5cbc8c1c28b8f9eb6777ba2f4c6cd5c2c /include/uapi/linux/openvswitch.h
parentd7aa033831b3a51ad0c87d706e160e00271761a8 (diff)
net: openvswitch: Add a new action check_pkt_len
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 <blp@ovn.org> Signed-off-by: Numan Siddique <nusiddiq@redhat.com> CC: Gregory Rose <gvrose8192@gmail.com> CC: Pravin B Shelar <pshelar@ovn.org> Acked-by: Pravin B Shelar <pshelar@ovn.org> Tested-by: Greg Rose <gvrose8192@gmail.com> Reviewed-by: Greg Rose <gvrose8192@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/uapi/linux/openvswitch.h')
-rw-r--r--include/uapi/linux/openvswitch.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
index dbe0cbe4f1b7..dfabacee6903 100644
--- a/include/uapi/linux/openvswitch.h
+++ b/include/uapi/linux/openvswitch.h
@@ -798,6 +798,44 @@ struct ovs_action_push_eth {
798 struct ovs_key_ethernet addresses; 798 struct ovs_key_ethernet addresses;
799}; 799};
800 800
801/*
802 * enum ovs_check_pkt_len_attr - Attributes for %OVS_ACTION_ATTR_CHECK_PKT_LEN.
803 *
804 * @OVS_CHECK_PKT_LEN_ATTR_PKT_LEN: u16 Packet length to check for.
805 * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER: Nested OVS_ACTION_ATTR_*
806 * actions to apply if the packer length is greater than the specified
807 * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN.
808 * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL - Nested OVS_ACTION_ATTR_*
809 * actions to apply if the packer length is lesser or equal to the specified
810 * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN.
811 */
812enum ovs_check_pkt_len_attr {
813 OVS_CHECK_PKT_LEN_ATTR_UNSPEC,
814 OVS_CHECK_PKT_LEN_ATTR_PKT_LEN,
815 OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER,
816 OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL,
817 __OVS_CHECK_PKT_LEN_ATTR_MAX,
818
819#ifdef __KERNEL__
820 OVS_CHECK_PKT_LEN_ATTR_ARG /* struct check_pkt_len_arg */
821#endif
822};
823
824#define OVS_CHECK_PKT_LEN_ATTR_MAX (__OVS_CHECK_PKT_LEN_ATTR_MAX - 1)
825
826#ifdef __KERNEL__
827struct check_pkt_len_arg {
828 u16 pkt_len; /* Same value as OVS_CHECK_PKT_LEN_ATTR_PKT_LEN'. */
829 bool exec_for_greater; /* When true, actions in IF_GREATER will
830 * not change flow keys. False otherwise.
831 */
832 bool exec_for_lesser_equal; /* When true, actions in IF_LESS_EQUAL
833 * will not change flow keys. False
834 * otherwise.
835 */
836};
837#endif
838
801/** 839/**
802 * enum ovs_action_attr - Action types. 840 * enum ovs_action_attr - Action types.
803 * 841 *
@@ -842,6 +880,9 @@ struct ovs_action_push_eth {
842 * packet, or modify the packet (e.g., change the DSCP field). 880 * packet, or modify the packet (e.g., change the DSCP field).
843 * @OVS_ACTION_ATTR_CLONE: make a copy of the packet and execute a list of 881 * @OVS_ACTION_ATTR_CLONE: make a copy of the packet and execute a list of
844 * actions without affecting the original packet and key. 882 * actions without affecting the original packet and key.
883 * @OVS_ACTION_ATTR_CHECK_PKT_LEN: Check the packet length and execute a set
884 * of actions if greater than the specified packet length, else execute
885 * another set of actions.
845 * 886 *
846 * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all 887 * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
847 * fields within a header are modifiable, e.g. the IPv4 protocol and fragment 888 * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
@@ -876,6 +917,7 @@ enum ovs_action_attr {
876 OVS_ACTION_ATTR_POP_NSH, /* No argument. */ 917 OVS_ACTION_ATTR_POP_NSH, /* No argument. */
877 OVS_ACTION_ATTR_METER, /* u32 meter ID. */ 918 OVS_ACTION_ATTR_METER, /* u32 meter ID. */
878 OVS_ACTION_ATTR_CLONE, /* Nested OVS_CLONE_ATTR_*. */ 919 OVS_ACTION_ATTR_CLONE, /* Nested OVS_CLONE_ATTR_*. */
920 OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */
879 921
880 __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted 922 __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
881 * from userspace. */ 923 * from userspace. */