On Mon, Jun 18, 2012 at 10:26:41AM +0900, FUJITA Tomonori wrote:
> Signed-off-by: FUJITA Tomonori <[email protected]>
> ---
>  ryu/ofproto/ofproto_v1_2.py |   69 
> +++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 69 insertions(+), 0 deletions(-)
> 
> diff --git a/ryu/ofproto/ofproto_v1_2.py b/ryu/ofproto/ofproto_v1_2.py
> index 7c9227c..b1ff9ef 100644
> --- a/ryu/ofproto/ofproto_v1_2.py
> +++ b/ryu/ofproto/ofproto_v1_2.py
> @@ -771,6 +771,75 @@ OFP_EXPERIMENTER_HEADER_SIZE = 16
>  assert (calcsize(OFP_EXPERIMENTER_HEADER_PACK_STR) + OFP_HEADER_SIZE ==
>          OFP_EXPERIMENTER_HEADER_SIZE)
>  
> +
> +# OXM
> +
> +
> +def oxm_tlv_header__(class_, field, hasmask, length):
> +    return (class_ << 16) | (field << 9) | (hasmask << 8) | length
> +
> +
> +def oxm_tlv_header(field, bits):
> +    length = (bits + 7) / 8

I'm not sure that this always gives the correct result.

For example, OXM_OF_IPV6_FLABEL, has 20 bits, which the above
will calculate as 3 bytes. The OVS implementation uses 4 bytes.
The latter seems to be correct to me.

> +    return oxm_tlv_header__(OFPXMC_OPENFLOW_BASIC, field, 0, length)
> +
> +
> +def oxm_tlv_header_w(field, bits):
> +    length = ((bits + 7) / 8) * 2
> +    return oxm_tlv_header__(OFPXMC_OPENFLOW_BASIC, field, 1, length)
> +
> +
> +OXM_OF_IN_PORT = oxm_tlv_header(OFPXMT_OFB_IN_PORT, 32)
> +OXM_OF_IN_PHY_PORT = oxm_tlv_header(OFPXMT_OFB_IN_PHY_PORT, 32)
> +OXM_OF_METADATA = oxm_tlv_header(OFPXMT_OFB_METADATA, 64)
> +OXM_OF_METADATA_W = oxm_tlv_header_w(OFPXMT_OFB_METADATA, 64)
> +OXM_OF_ETH_DST = oxm_tlv_header(OFPXMT_OFB_ETH_DST, 48)
> +OXM_OF_ETH_DST_W = oxm_tlv_header_w(OFPXMT_OFB_ETH_DST, 48)
> +OXM_OF_ETH_SRC = oxm_tlv_header(OFPXMT_OFB_ETH_SRC, 48)
> +OXM_OF_ETH_SRC_W = oxm_tlv_header_w(OFPXMT_OFB_ETH_SRC, 48)
> +OXM_OF_ETH_TYPE = oxm_tlv_header(OFPXMT_OFB_ETH_TYPE, 16)
> +OXM_OF_VLAN_VID = oxm_tlv_header(OFPXMT_OFB_VLAN_VID, 13)
> +OXM_OF_VLAN_VID_W = oxm_tlv_header_w(OFPXMT_OFB_VLAN_VID, 13)
> +OXM_OF_VLAN_PCP = oxm_tlv_header(OFPXMT_OFB_VLAN_PCP, 3)
> +OXM_OF_IP_DSCP = oxm_tlv_header(OFPXMT_OFB_IP_DSCP, 6)
> +OXM_OF_IP_ECN = oxm_tlv_header(OFPXMT_OFB_IP_ECN, 2)
> +OXM_OF_IP_PROTO = oxm_tlv_header(OFPXMT_OFB_IP_PROTO, 8)
> +OXM_OF_IPV4_SRC = oxm_tlv_header(OFPXMT_OFB_IPV4_SRC, 32)
> +OXM_OF_IPV4_SRC_W = oxm_tlv_header_w(OFPXMT_OFB_IPV4_SRC, 32)
> +OXM_OF_IPV4_DST = oxm_tlv_header(OFPXMT_OFB_IPV4_DST, 32)
> +OXM_OF_IPV4_DST_W = oxm_tlv_header_w(OFPXMT_OFB_IPV4_DST, 32)
> +OXM_OF_TCP_SRC = oxm_tlv_header(OFPXMT_OFB_TCP_SRC, 16)
> +OXM_OF_TCP_DST = oxm_tlv_header(OFPXMT_OFB_TCP_DST, 16)
> +OXM_OF_UDP_SRC = oxm_tlv_header(OFPXMT_OFB_UDP_SRC, 16)
> +OXM_OF_UDP_DST = oxm_tlv_header(OFPXMT_OFB_UDP_DST, 16)
> +OXM_OF_SCTP_SRC = oxm_tlv_header(OFPXMT_OFB_SCTP_SRC, 16)
> +OXM_OF_SCTP_DST = oxm_tlv_header(OFPXMT_OFB_SCTP_DST, 16)
> +OXM_OF_ICMPV4_TYPE = oxm_tlv_header(OFPXMT_OFB_ICMPV4_TYPE, 8)
> +OXM_OF_ICMPV4_CODE = oxm_tlv_header(OFPXMT_OFB_ICMPV4_CODE, 8)
> +OXM_OF_ARP_OP = oxm_tlv_header(OFPXMT_OFB_ARP_OP, 16)
> +OXM_OF_ARP_SPA = oxm_tlv_header(OFPXMT_OFB_ARP_SPA, 32)
> +OXM_OF_ARP_SPA_W = oxm_tlv_header_w(OFPXMT_OFB_ARP_SPA, 32)
> +OXM_OF_ARP_TPA = oxm_tlv_header(OFPXMT_OFB_ARP_TPA, 32)
> +OXM_OF_ARP_TPA_W = oxm_tlv_header_w(OFPXMT_OFB_ARP_TPA, 32)
> +OXM_OF_ARP_SHA = oxm_tlv_header(OFPXMT_OFB_ARP_SHA, 48)
> +OXM_OF_ARP_SHA_W = oxm_tlv_header_w(OFPXMT_OFB_ARP_SHA, 48)
> +OXM_OF_ARP_THA = oxm_tlv_header(OFPXMT_OFB_ARP_THA, 48)
> +OXM_OF_ARP_THA_W = oxm_tlv_header_w(OFPXMT_OFB_ARP_THA, 48)
> +OXM_OF_IPV6_SRC = oxm_tlv_header(OFPXMT_OFB_IPV6_SRC, 128)
> +OXM_OF_IPV6_SRC_W = oxm_tlv_header_w(OFPXMT_OFB_IPV6_SRC, 128)
> +OXM_OF_IPV6_DST = oxm_tlv_header(OFPXMT_OFB_IPV6_DST, 128)
> +OXM_OF_IPV6_DST_W = oxm_tlv_header_w(OFPXMT_OFB_IPV6_DST, 128)
> +OXM_OF_IPV6_FLABEL = oxm_tlv_header(OFPXMT_OFB_IPV6_FLABEL, 20)
> +OXM_OF_IPV6_FLABEL_W = oxm_tlv_header_w(OFPXMT_OFB_IPV6_FLABEL, 20)
> +OXM_OF_ICMPV6_TYPE = oxm_tlv_header(OFPXMT_OFB_ICMPV6_TYPE, 8)
> +OXM_OF_ICMPV6_CODE = oxm_tlv_header(OFPXMT_OFB_ICMPV6_CODE, 8)
> +OXM_OF_IPV6_ND_TARGET = oxm_tlv_header(OFPXMT_OFB_IPV6_ND_TARGET, 128)
> +OXM_OF_IPV6_ND_SLL = oxm_tlv_header(OFPXMT_OFB_IPV6_ND_SLL, 48)
> +OXM_OF_IPV6_NT_TLL = oxm_tlv_header(OFPXMT_OFB_IPV6_NT_TLL, 48)
> +OXM_OF_MPLS_LABEL = oxm_tlv_header(OFPXMT_OFB_MPLS_LABEL, 20)
> +OXM_OF_MPLS_TC = oxm_tlv_header(OFPXMT_OFB_MPLS_TC, 3)
> +
> +
>  # define constants
>  OFP_VERSION = 0x03
>  OFP_TCP_PORT = 6633
> -- 
> 1.7.4.4
> 
> 
> ------------------------------------------------------------------------------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and 
> threat landscape has changed and how IT managers can respond. Discussions 
> will include endpoint security, mobile security and the latest in malware 
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> Ryu-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ryu-devel
> 

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to