loxi-prep: move message parsing to ofp.message
diff --git a/src/python/oftest/parse.py b/src/python/oftest/parse.py
index ac76a16..0005313 100644
--- a/src/python/oftest/parse.py
+++ b/src/python/oftest/parse.py
@@ -1,14 +1,10 @@
"""
-OpenFlow message parsing functions
+Utility parsing functions
"""
import sys
import logging
-import message
-import error
-import action
-import cstruct
-from action_list import action_list
+import of10 as ofp
try:
import scapy.all as scapy
except:
@@ -17,161 +13,6 @@
except:
sys.exit("Need to install scapy for packet parsing")
-"""
-of_message.py
-Contains wrapper functions and classes for the of_message namespace
-that are generated by hand. It includes the rest of the wrapper
-function information into the of_message namespace
-"""
-
-parse_logger = logging.getLogger("parse")
-#parse_logger.setLevel(logging.DEBUG)
-
-# These message types are subclassed
-msg_type_subclassed = [
- cstruct.OFPT_STATS_REQUEST,
- cstruct.OFPT_STATS_REPLY,
- cstruct.OFPT_ERROR
-]
-
-# Maps from sub-types to classes
-stats_reply_to_class_map = {
- cstruct.OFPST_DESC : message.desc_stats_reply,
- cstruct.OFPST_AGGREGATE : message.aggregate_stats_reply,
- cstruct.OFPST_FLOW : message.flow_stats_reply,
- cstruct.OFPST_TABLE : message.table_stats_reply,
- cstruct.OFPST_PORT : message.port_stats_reply,
- cstruct.OFPST_QUEUE : message.queue_stats_reply
-}
-
-stats_request_to_class_map = {
- cstruct.OFPST_DESC : message.desc_stats_request,
- cstruct.OFPST_AGGREGATE : message.aggregate_stats_request,
- cstruct.OFPST_FLOW : message.flow_stats_request,
- cstruct.OFPST_TABLE : message.table_stats_request,
- cstruct.OFPST_PORT : message.port_stats_request,
- cstruct.OFPST_QUEUE : message.queue_stats_request
-}
-
-error_to_class_map = {
- cstruct.OFPET_HELLO_FAILED : message.hello_failed_error_msg,
- cstruct.OFPET_BAD_REQUEST : message.bad_request_error_msg,
- cstruct.OFPET_BAD_ACTION : message.bad_action_error_msg,
- cstruct.OFPET_FLOW_MOD_FAILED : message.flow_mod_failed_error_msg,
- cstruct.OFPET_PORT_MOD_FAILED : message.port_mod_failed_error_msg,
- cstruct.OFPET_QUEUE_OP_FAILED : message.queue_op_failed_error_msg
-}
-
-# Map from header type value to the underlieing message class
-msg_type_to_class_map = {
- cstruct.OFPT_HELLO : message.hello,
- cstruct.OFPT_ERROR : message.error,
- cstruct.OFPT_ECHO_REQUEST : message.echo_request,
- cstruct.OFPT_ECHO_REPLY : message.echo_reply,
- cstruct.OFPT_VENDOR : message.vendor,
- cstruct.OFPT_FEATURES_REQUEST : message.features_request,
- cstruct.OFPT_FEATURES_REPLY : message.features_reply,
- cstruct.OFPT_GET_CONFIG_REQUEST : message.get_config_request,
- cstruct.OFPT_GET_CONFIG_REPLY : message.get_config_reply,
- cstruct.OFPT_SET_CONFIG : message.set_config,
- cstruct.OFPT_PACKET_IN : message.packet_in,
- cstruct.OFPT_FLOW_REMOVED : message.flow_removed,
- cstruct.OFPT_PORT_STATUS : message.port_status,
- cstruct.OFPT_PACKET_OUT : message.packet_out,
- cstruct.OFPT_FLOW_MOD : message.flow_mod,
- cstruct.OFPT_PORT_MOD : message.port_mod,
- cstruct.OFPT_STATS_REQUEST : message.stats_request,
- cstruct.OFPT_STATS_REPLY : message.stats_reply,
- cstruct.OFPT_BARRIER_REQUEST : message.barrier_request,
- cstruct.OFPT_BARRIER_REPLY : message.barrier_reply,
- cstruct.OFPT_QUEUE_GET_CONFIG_REQUEST : message.queue_get_config_request,
- cstruct.OFPT_QUEUE_GET_CONFIG_REPLY : message.queue_get_config_reply
-}
-
-def _of_message_to_object(binary_string):
- """
- Map a binary string to the corresponding class.
-
- Appropriately resolves subclasses
- """
- hdr = message.ofp_header()
- hdr.unpack(binary_string)
- logging.info(hdr.show())
- # FIXME: Add error detection
- if not hdr.type in msg_type_subclassed:
- return msg_type_to_class_map[hdr.type]()
- if hdr.type == cstruct.OFPT_STATS_REQUEST:
- sub_hdr = message.ofp_stats_request()
- sub_hdr.unpack(binary_string)
- try:
- obj = stats_request_to_class_map[sub_hdr.stats_type]()
- except KeyError:
- obj = None
- return obj
- elif hdr.type == cstruct.OFPT_STATS_REPLY:
- sub_hdr = message.ofp_stats_reply()
- sub_hdr.unpack(binary_string)
- try:
- obj = stats_reply_to_class_map[sub_hdr.stats_type]()
- except KeyError:
- obj = None
- return obj
- elif hdr.type == cstruct.OFPT_ERROR:
- sub_hdr = message.ofp_error_msg()
- sub_hdr.unpack(binary_string)
- return error_to_class_map[sub_hdr.err_type]()
- else:
- parse_logger.error("Cannot parse pkt to message")
- return None
-
-def of_message_parse(binary_string, raw=False):
- """
- Parse an OpenFlow packet
-
- Parses a raw OpenFlow packet into a Python class, with class
- members fully populated.
-
- @param binary_string The packet (string) to be parsed
- @param raw If true, interpret the packet as an L2 packet. Not
- yet supported.
- @return An object of some message class or None if fails
- Note that any data beyond that parsed is not returned
-
- """
-
- if raw:
- parse_logger.error("raw packet message parsing not supported")
- return None
-
- obj = _of_message_to_object(binary_string)
- if obj:
- obj.unpack(binary_string)
- return obj
-
-
-def of_header_parse(binary_string, raw=False):
- """
- Parse only the header from an OpenFlow packet
-
- Parses the header from a raw OpenFlow packet into a
- an ofp_header Python class.
-
- @param binary_string The packet (string) to be parsed
- @param raw If true, interpret the packet as an L2 packet. Not
- yet supported.
- @return An ofp_header object
-
- """
-
- if raw:
- parse_logger.error("raw packet message parsing not supported")
- return None
-
- hdr = message.ofp_header()
- hdr.unpack(binary_string)
-
- return hdr
-
map_wc_field_to_match_member = {
'OFPFW_DL_VLAN' : 'vlan_vid',
'OFPFW_DL_SRC' : 'eth_src',
@@ -270,7 +111,7 @@
#@todo check min length of packet
if pkt_format.upper() != "L2":
- parse_logger.error("Only L2 supported for packet_to_flow")
+ logging.error("Only L2 supported for packet_to_flow")
return None
if type(packet) == type(""):
@@ -282,63 +123,63 @@
try:
(dot1q, ip, tcp, udp, icmp, arp) = packet_type_classify(ether)
except:
- parse_logger.error("packet_to_flow_match: Classify error")
+ logging.error("packet_to_flow_match: Classify error")
return None
- match = cstruct.ofp_match()
- match.wildcards = cstruct.OFPFW_ALL
+ match = ofp.ofp_match()
+ match.wildcards = ofp.OFPFW_ALL
#@todo Check if packet is other than L2 format
match.eth_dst = parse_mac(ether.dst)
- match.wildcards &= ~cstruct.OFPFW_DL_DST
+ match.wildcards &= ~ofp.OFPFW_DL_DST
match.eth_src = parse_mac(ether.src)
- match.wildcards &= ~cstruct.OFPFW_DL_SRC
+ match.wildcards &= ~ofp.OFPFW_DL_SRC
match.eth_type = ether.type
- match.wildcards &= ~cstruct.OFPFW_DL_TYPE
+ match.wildcards &= ~ofp.OFPFW_DL_TYPE
if dot1q:
match.vlan_vid = dot1q.vlan
match.vlan_pcp = dot1q.prio
match.eth_type = dot1q.type
else:
- match.vlan_vid = cstruct.OFP_VLAN_NONE
+ match.vlan_vid = ofp.OFP_VLAN_NONE
match.vlan_pcp = 0
- match.wildcards &= ~cstruct.OFPFW_DL_VLAN
- match.wildcards &= ~cstruct.OFPFW_DL_VLAN_PCP
+ match.wildcards &= ~ofp.OFPFW_DL_VLAN
+ match.wildcards &= ~ofp.OFPFW_DL_VLAN_PCP
if ip:
match.ipv4_src = parse_ip(ip.src)
- match.wildcards &= ~cstruct.OFPFW_NW_SRC_MASK
+ match.wildcards &= ~ofp.OFPFW_NW_SRC_MASK
match.ipv4_dst = parse_ip(ip.dst)
- match.wildcards &= ~cstruct.OFPFW_NW_DST_MASK
+ match.wildcards &= ~ofp.OFPFW_NW_DST_MASK
match.ip_dscp = ip.tos
- match.wildcards &= ~cstruct.OFPFW_NW_TOS
+ match.wildcards &= ~ofp.OFPFW_NW_TOS
if tcp:
match.ip_proto = 6
- match.wildcards &= ~cstruct.OFPFW_NW_PROTO
+ match.wildcards &= ~ofp.OFPFW_NW_PROTO
elif not tcp and udp:
tcp = udp
match.ip_proto = 17
- match.wildcards &= ~cstruct.OFPFW_NW_PROTO
+ match.wildcards &= ~ofp.OFPFW_NW_PROTO
if tcp:
match.tcp_src = tcp.sport
- match.wildcards &= ~cstruct.OFPFW_TP_SRC
+ match.wildcards &= ~ofp.OFPFW_TP_SRC
match.tcp_dst = tcp.dport
- match.wildcards &= ~cstruct.OFPFW_TP_DST
+ match.wildcards &= ~ofp.OFPFW_TP_DST
if icmp:
match.ip_proto = 1
match.tcp_src = icmp.type
match.tcp_dst = icmp.code
- match.wildcards &= ~cstruct.OFPFW_NW_PROTO
+ match.wildcards &= ~ofp.OFPFW_NW_PROTO
if arp:
match.ip_proto = arp.op
- match.wildcards &= ~cstruct.OFPFW_NW_PROTO
+ match.wildcards &= ~ofp.OFPFW_NW_PROTO
match.ipv4_src = parse_ip(arp.psrc)
- match.wildcards &= ~cstruct.OFPFW_NW_SRC_MASK
+ match.wildcards &= ~ofp.OFPFW_NW_SRC_MASK
match.ipv4_dst = parse_ip(arp.pdst)
- match.wildcards &= ~cstruct.OFPFW_NW_DST_MASK
+ match.wildcards &= ~ofp.OFPFW_NW_DST_MASK
return match