1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
"""Defines Header classes and related items."""
# System imports
from enum import Enum
from random import randint
# Local source tree imports
from pyof.v0x01.foundation.base import OFP_VERSION, GenericStruct
from pyof.v0x01.foundation.basic_types import UBInt8, UBInt16, UBInt32
# Third-party imports
__all__ = ('Header', 'Type')
# Max xid of a message considering it's size (UBInt32 on v0x01)
MAXID = 2147483647
# Enums
class Type(Enum):
"""Enumeration of Message Types."""
# Symetric/Immutable messages
OFPT_HELLO = 0
OFPT_ERROR = 1
OFPT_ECHO_REQUEST = 2
OFPT_ECHO_REPLY = 3
OFPT_VENDOR = 4
# Switch configuration messages
# Controller/Switch messages
OFPT_FEATURES_REQUEST = 5
OFPT_FEATURES_REPLY = 6
OFPT_GET_CONFIG_REQUEST = 7
OFPT_GET_CONFIG_REPLY = 8
OFPT_SET_CONFIG = 9
# Async messages
OFPT_PACKET_IN = 10
OFPT_FLOW_REMOVED = 11
OFPT_PORT_STATUS = 12
# Controller command messages
# Controller/switch message
OFPT_PACKET_OUT = 13
OFPT_FLOW_MOD = 14
OFPT_PORT_MOD = 15
# Statistics messages
# Controller/Switch message
OFPT_STATS_REQUEST = 16
OFPT_STATS_REPLY = 17
# Barrier messages
# Controller/Switch message
OFPT_BARRIER_REQUEST = 18
OFPT_BARRIER_REPLY = 19
# Queue Configuration messages
# Controller/Switch message
OFPT_QUEUE_GET_CONFIG_REQUEST = 20
OFPT_QUEUE_GET_CONFIG_REPLY = 21
# Classes
class Header(GenericStruct):
"""Representation of an OpenFlow message Header."""
version = UBInt8(OFP_VERSION)
message_type = UBInt8(enum_ref=Type)
length = UBInt16()
xid = UBInt32()
def __init__(self, message_type=None, length=None, xid=randint(0, MAXID)):
"""The constructor takes the optional parameters below.
Args:
message_type (Type): Type of the message.
xid (int): ID of the message. Defaults to a random integer.
length (int): Length of the message, including the header itself.
"""
super().__init__()
self.message_type = message_type
self.length = length
self.xid = xid
|