ofproto/nx_actions: Add NXAction used only in OpenFlow1.0

There is NXAction to be used only in OpenFlow1.0.
These actions are supported by default in OpenFlow1.2 or later.
Therefore, it becomes unnecessary as the NXAction.
But, to add the NXAction in order to be able to use in OpenFlow1.0.
Actions to be added are as following.
 - NXActionSetQueue
 - NXActionDecTtl
 - NXActionPushMpls
 - NXActionPopMpls
 - NXActionSetMplsTtl
 - NXActionDecMplsTtl
 - NXActionSetMplsLabel
 - NXActionSetMplsTc

Signed-off-by: Shinpei Muraoka <shinpei.muraoka@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Shinpei Muraoka 2016-07-11 10:44:15 +09:00 committed by FUJITA Tomonori
parent 8cb23e19a7
commit 3b1a314bd0
2 changed files with 181 additions and 0 deletions

View File

@ -44,6 +44,12 @@ NXAST_EXIT = 17
NXAST_DEC_TTL = 18
NXAST_FIN_TIMEOUT = 19
NXAST_CONTROLLER = 20
NXAST_PUSH_MPLS = 23
NXAST_POP_MPLS = 24
NXAST_SET_MPLS_TTL = 25
NXAST_DEC_MPLS_TTL = 26
NXAST_SET_MPLS_LABEL = 30
NXAST_SET_MPLS_TC = 31
NXAST_CONJUNCTION = 34
NXAST_CT = 35
NXAST_NAT = 36

View File

@ -201,6 +201,28 @@ def generate(ofp_name, ofpp_name):
# fixup
return bytearray() if self.data is None else self.data
# For OpenFlow1.0 only
class NXActionSetQueue(NXAction):
_subtype = nicira_ext.NXAST_SET_QUEUE
# queue_id
_fmt_str = '!2xI'
def __init__(self, queue_id,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionSetQueue, self).__init__()
self.queue_id = queue_id
@classmethod
def parser(cls, buf):
(queue_id,) = struct.unpack_from(cls._fmt_str, buf, 0)
return cls(queue_id)
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0, self.queue_id)
return data
class NXActionPopQueue(NXAction):
_subtype = nicira_ext.NXAST_POP_QUEUE
@ -558,6 +580,25 @@ def generate(ofp_name, ofpp_name):
msg_pack_into(self._fmt_str, data, 0)
return data
# For OpenFlow1.0 only
class NXActionDecTtl(NXAction):
_subtype = nicira_ext.NXAST_DEC_TTL
_fmt_str = '!6x'
def __init__(self,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionDecTtl, self).__init__()
@classmethod
def parser(cls, buf):
return cls()
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0)
return data
class NXActionController(NXAction):
_subtype = nicira_ext.NXAST_CONTROLLER
@ -592,6 +633,132 @@ def generate(ofp_name, ofpp_name):
self.reason)
return data
# For OpenFlow1.0 only
class NXActionMplsBase(NXAction):
# ethertype
_fmt_str = '!H4x'
def __init__(self,
ethertype,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionMplsBase, self).__init__()
self.ethertype = ethertype
@classmethod
def parser(cls, buf):
(ethertype,) = struct.unpack_from(
cls._fmt_str, buf)
return cls(ethertype)
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0,
self.ethertype)
return data
# For OpenFlow1.0 only
class NXActionPushMpls(NXActionMplsBase):
_subtype = nicira_ext.NXAST_PUSH_MPLS
# For OpenFlow1.0 only
class NXActionPopMpls(NXActionMplsBase):
_subtype = nicira_ext.NXAST_POP_MPLS
# For OpenFlow1.0 only
class NXActionSetMplsTtl(NXAction):
_subtype = nicira_ext.NXAST_SET_MPLS_TTL
# ethertype
_fmt_str = '!B5x'
def __init__(self,
ttl,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionSetMplsTtl, self).__init__()
self.ttl = ttl
@classmethod
def parser(cls, buf):
(ttl,) = struct.unpack_from(
cls._fmt_str, buf)
return cls(ttl)
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0,
self.ttl)
return data
# For OpenFlow1.0 only
class NXActionDecMplsTtl(NXAction):
_subtype = nicira_ext.NXAST_DEC_MPLS_TTL
# ethertype
_fmt_str = '!6x'
def __init__(self,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionDecMplsTtl, self).__init__()
@classmethod
def parser(cls, buf):
return cls()
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0)
return data
# For OpenFlow1.0 only
class NXActionSetMplsLabel(NXAction):
_subtype = nicira_ext.NXAST_SET_MPLS_LABEL
# ethertype
_fmt_str = '!2xI'
def __init__(self,
label,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionSetMplsLabel, self).__init__()
self.label = label
@classmethod
def parser(cls, buf):
(label,) = struct.unpack_from(
cls._fmt_str, buf)
return cls(label)
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0,
self.label)
return data
# For OpenFlow1.0 only
class NXActionSetMplsTc(NXAction):
_subtype = nicira_ext.NXAST_SET_MPLS_TC
# ethertype
_fmt_str = '!B5x'
def __init__(self,
tc,
type_=None, len_=None, vendor=None, subtype=None):
super(NXActionSetMplsTc, self).__init__()
self.tc = tc
@classmethod
def parser(cls, buf):
(tc,) = struct.unpack_from(
cls._fmt_str, buf)
return cls(tc)
def serialize_body(self):
data = bytearray()
msg_pack_into(self._fmt_str, data, 0,
self.tc)
return data
class NXActionFinTimeout(NXAction):
_subtype = nicira_ext.NXAST_FIN_TIMEOUT
@ -972,6 +1139,7 @@ def generate(ofp_name, ofpp_name):
add_attr('NXActionUnknown', NXActionUnknown)
classes = [
'NXActionSetQueue',
'NXActionPopQueue',
'NXActionRegLoad',
'NXActionNote',
@ -983,7 +1151,14 @@ def generate(ofp_name, ofpp_name):
'NXActionOutputReg',
'NXActionLearn',
'NXActionExit',
'NXActionDecTtl',
'NXActionController',
'NXActionPushMpls',
'NXActionPopMpls',
'NXActionSetMplsTtl',
'NXActionDecMplsTtl',
'NXActionSetMplsLabel',
'NXActionSetMplsTc',
'NXActionFinTimeout',
'NXActionConjunction',
'NXActionMultipath',