From: Alan Quillin <[email protected]>
Adds support for setting TCP flags using the nicira extensions for OF1.0
and OF1.2+
Allows using the extensions with OF1.2+ for OVS versions < 2.4 where the
TCP flags
OF extension is not yet supported.
Signed-off-by: Alan Quillin <[email protected]>
---
ryu/ofproto/nx_match.py | 71
+++++++++++++++++++++++++++++++++++++++++++++
ryu/ofproto/ofproto_v1_0.py | 3 ++
2 files changed, 74 insertions(+)
diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py
index 281fdc2..d17fc73 100644
--- a/ryu/ofproto/nx_match.py
+++ b/ryu/ofproto/nx_match.py
@@ -22,6 +22,7 @@ from ryu import exception
from ryu.lib import mac
from ryu.lib import type_desc
from ryu.lib.pack_utils import msg_pack_into
+from ryu.ofproto import ether
from ryu.ofproto import ofproto_parser
from ryu.ofproto import ofproto_v1_0
from ryu.ofproto import inet
@@ -94,6 +95,7 @@ class Flow(ofproto_parser.StringifyMixin):
self.regs = [0] * FLOW_N_REGS
self.ipv6_label = 0
self.pkt_mark = 0
+ self.tcp_flags = 0
class FlowWildcards(ofproto_parser.StringifyMixin):
@@ -116,6 +118,7 @@ class FlowWildcards(ofproto_parser.StringifyMixin):
self.regs_mask = [0] * FLOW_N_REGS
self.wildcards = ofproto_v1_0.OFPFW_ALL
self.pkt_mark_mask = 0
+ self.tcp_flags_mask = 0
class ClsRule(ofproto_parser.StringifyMixin):
@@ -312,6 +315,10 @@ class ClsRule(ofproto_parser.StringifyMixin):
self.flow.pkt_mark = pkt_mark
self.wc.pkt_mark_mask = mask
+ def set_tcp_flags(self, tcp_flags, mask):
+ self.flow.tcp_flags = tcp_flags
+ self.wc.tcp_flags_mask = mask
+
def flow_format(self):
# Tunnel ID is only supported by NXM
if self.wc.tun_id_mask != 0:
@@ -332,6 +339,9 @@ class ClsRule(ofproto_parser.StringifyMixin):
if self.wc.regs_bits > 0:
return ofproto_v1_0.NXFF_NXM
+ if self.flow.tcp_flags > 0:
+ return ofproto_v1_0.NXFF_NXM
+
return ofproto_v1_0.NXFF_OPENFLOW10
def match_tuple(self):
@@ -948,6 +958,19 @@ class MFPktMark(MFField):
rule.wc.pkt_mark_mask)
+@_register_make
+@_set_nxm_headers([ofproto_v1_0.NXM_NX_TCP_FLAGS,
+ ofproto_v1_0.NXM_NX_TCP_FLAGS_W])
+class MFTcpFlags(MFField):
+ @classmethod
+ def make(cls, header):
+ return cls(header, MF_PACK_STRING_BE16)
+
+ def put(self, buf, offset, rule):
+ return self.putm(buf, offset, rule.flow.tcp_flags,
+ rule.wc.tcp_flags_mask)
+
+
def serialize_nxm_match(rule, buf, offset):
old_offset = offset
@@ -1029,6 +1052,22 @@ def serialize_nxm_match(rule, buf, offset):
if header != 0:
offset += nxm_put(buf, offset, header, rule)
+ if rule.flow.tcp_flags != 0:
+ # TCP Flags can only be used if the ethernet type is IPv4 or IPv6
+ if rule.flow.dl_type in (ether.ETH_TYPE_IP, ether.ETH_TYPE_IPV6):
+ # TCP Flags can only be used if the ip protocol is TCP
+ if rule.flow.nw_proto == inet.IPPROTO_TCP:
+ if rule.wc.tcp_flags_mask == UINT16_MAX:
+ header = ofproto_v1_0.NXM_NX_TCP_FLAGS
+ else:
+ header = ofproto_v1_0.NXM_NX_TCP_FLAGS_W
+ else:
+ header = 0
+ else:
+ header = 0
+ if header != 0:
+ offset += nxm_put(buf, offset, header, rule)
+
# IP Source and Destination
if rule.flow.nw_src != 0:
if rule.wc.nw_src_mask == UINT32_MAX:
@@ -1206,10 +1245,19 @@ Argument Value Description
================ =============== ==================================
eth_dst_nxm MAC address Ethernet destination address.
eth_src_nxm MAC address Ethernet source address.
+eth_type_nxm Integer 16bit Ethernet type. Needed to support Nicira
+ extensions that require the eth_type to
+ be set. (i.e. tcp_flags_nxm)
+ip_proto_nxm Integer 8bit IP protocol. Needed to support Nicira
+ extensions that require the ip_proto to
+ be set. (i.e. tcp_flags_nxm)
tunnel_id_nxm Integer 64bit Tunnel identifier.
tun_ipv4_src IPv4 address Tunnel IPv4 source address.
tun_ipv4_dst IPv4 address Tunnel IPv4 destination address.
pkt_mark Integer 32bit Packet metadata mark.
+tcp_flags_nxm Integer 16bit TCP Flags. Requires setting fields:
+ eth_type_nxm = |IP or IPv6| and
+ ip_proto_nxm = TCP
conj_id Integer 32bit Conjunction ID used only with
the conjunction action
ct_state Integer 32bit Conntrack state.
@@ -1220,15 +1268,38 @@ _dp_hash Integer 32bit Flow hash computed
in Datapath.
reg<idx> Integer 32bit Packet register.
<idx> is register number 0-7.
================ =============== ==================================
+
+Example:: Setting the TCP flags via the nicira extensions.
+ This is required when using OVS version < 2.4.
+
+ When using the nxm fields, you need to use any nxm prereq
+ fields as well or you will receive a OFPBMC_BAD_PREREQ error
+
+ # WILL NOT work
+ flag = tcp.TCP_ACK
+ match = parser.OFPMatch(
+ tcp_flags_nxm=(flag, flag),
+ ip_proto=inet.IPPROTO_TCP,
+ eth_type=eth_type)
+
+ # works
+ flag = tcp.TCP_ACK
+ match = parser.OFPMatch(
+ tcp_flags_nxm=(flag, flag),
+ ip_proto_nxm=inet.IPPROTO_TCP,
+ eth_type_nxm=eth_type)
"""
oxm_types = [
oxm_fields.NiciraExtended0('eth_dst_nxm', 1, type_desc.MacAddr),
oxm_fields.NiciraExtended0('eth_src_nxm', 2, type_desc.MacAddr),
+ oxm_fields.NiciraExtended0('eth_type_nxm', 3, type_desc.Int2),
+ oxm_fields.NiciraExtended0('ip_proto_nxm', 6, type_desc.Int1),
oxm_fields.NiciraExtended1('tunnel_id_nxm', 16, type_desc.Int8),
oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4),
+ oxm_fields.NiciraExtended1('tcp_flags_nxm', 34, type_desc.Int2),
oxm_fields.NiciraExtended1('conj_id', 37, type_desc.Int4),
oxm_fields.NiciraExtended1('ct_state', 105, type_desc.Int4),
oxm_fields.NiciraExtended1('ct_zone', 106, type_desc.Int2),
diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
index c6cd973..afc59d0 100644
--- a/ryu/ofproto/ofproto_v1_0.py
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -589,6 +589,9 @@ NXM_NX_IP_TTL = nxm_header(0x0001, 29, 1)
NXM_NX_PKT_MARK = nxm_header(0x0001, 33, 4)
NXM_NX_PKT_MARK_W = nxm_header_w(0x0001, 33, 4)
+NXM_NX_TCP_FLAGS = nxm_header(0x0001, 34, 2)
+NXM_NX_TCP_FLAGS_W = nxm_header_w(0x0001, 34, 2)
+
def nxm_nx_reg(idx):
return nxm_header(0x0001, idx, 4)
--
2.1.4
------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel