On Thu, Jun 21, 2012 at 02:55:02PM +0900, FUJITA Tomonori wrote: > v6 address and mask are represented in a list including four int > values like the following: > > set_ipv6_src_masked([0xf1234567, 3, 4, 7], [0xffff0000, 0, 0, 0]) > > Signed-off-by: FUJITA Tomonori <[email protected]> > --- > ryu/ofproto/nx_match.py | 74 > ++++++++++++++++++++++++++++++++++++++++++- > ryu/ofproto/ofproto_v1_0.py | 5 +++ > 2 files changed, 78 insertions(+), 1 deletions(-) > > diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py > index 799d90d..209d1c2 100644 > --- a/ryu/ofproto/nx_match.py > +++ b/ryu/ofproto/nx_match.py > @@ -16,6 +16,7 @@ > # limitations under the License. > > import struct > +import itertools > > from ryu import exception > from ryu.lib import mac > @@ -84,6 +85,8 @@ class Flow(object): > self.tun_id = 0 > self.arp_spa = 0 > self.arp_tpa = 0 > + self.ipv6_src = [] > + self.ipv6_dst = [] > self.ipv6_label = 0 > > > @@ -99,6 +102,8 @@ class FlowWildcards(object): > self.arp_spa_mask = 0 > self.arp_tpa_mask = 0 > self.vlan_tci_mask = 0 > + self.ipv6_src_mask = [] > + self.ipv6_dst_mask = [] > self.wildcards = FWW_ALL > > > @@ -228,6 +233,20 @@ class ClsRule(object): > self.wc.wildcards &= ~FWW_IPV6_LABEL > self.flow.ipv6_label = label > > + def set_ipv6_src_masked(self, src, mask): > + self.wc.ipv6_src_mask = mask > + self.flow.ipv6_src = [x & y for (x, y) in itertools.izip(src, mask)] > + > + def set_ipv6_src(self, src): > + self.flow.ipv6_src = src > + > + def set_ipv6_dst_masked(self, dst, mask): > + self.wc.ipv6_dst_mask = mask > + self.flow.ipv6_dst = [x & y for (x, y) in itertools.izip(dst, mask)] > + > + def set_ipv6_dst(self, dst): > + self.flow.ipv6_dst = dst > + > def flow_format(self): > # Tunnel ID is only supported by NXM > if self.wc.tun_id_mask != 0: > @@ -317,6 +336,17 @@ class MFField(object): > else: > return self.putw(buf, offset, value, mask) > > + def _putv6(self, buf, offset, value): > + ofproto_parser.msg_pack_into(self.pack_str, buf, offset, > + *value) > + return self.n_bytes > + > + def putv6(self, buf, offset, value, mask): > + _len = self._putv6(buf, offset, value) > + if len(mask): > + return _len + self._putv6(buf, offset + _len, mask) > + return _len > +
s/_len/len_/ please. Otherwise looks good. Reviewed-by: Isaku Yamahata <[email protected]> > > @_register_make > @_set_nxm_headers([ofproto_v1_0.NXM_OF_IN_PORT]) > @@ -508,6 +538,34 @@ class MFArpSha(MFField): > > > @_register_make > +@_set_nxm_headers([ofproto_v1_0.NXM_NX_IPV6_SRC, > + ofproto_v1_0.NXM_NX_IPV6_SRC_W]) > +class MFIPV6Src(MFField): > + @classmethod > + def make(cls): > + return cls('!4I') > + > + def put(self, buf, offset, rule): > + return self.putv6(buf, offset, > + rule.flow.ipv6_src, > + rule.wc.ipv6_src_mask) > + > + > +@_register_make > +@_set_nxm_headers([ofproto_v1_0.NXM_NX_IPV6_DST, > + ofproto_v1_0.NXM_NX_IPV6_DST_W]) > +class MFIPV6Dst(MFField): > + @classmethod > + def make(cls): > + return cls('!4I') > + > + def put(self, buf, offset, rule): > + return self.putv6(buf, offset, > + rule.flow.ipv6_dst, > + rule.wc.ipv6_dst_mask) > + > + > +@_register_make > @_set_nxm_headers([ofproto_v1_0.NXM_NX_ARP_THA]) > class MFArpTha(MFField): > @classmethod > @@ -669,7 +727,7 @@ def serialize_nxm_match(rule, buf, offset): > header = ofproto_v1_0.NXM_OF_IP_DST_W > offset += nxm_put(buf, offset, header, rule) > > - # XXX: IPv6 > + # IPv6 > if not rule.wc.wildcards & FWW_NW_PROTO and (rule.flow.nw_proto > == IPPROTO_ICMPV6): > if rule.wc.tp_src_mask != 0: > @@ -682,6 +740,20 @@ def serialize_nxm_match(rule, buf, offset): > if not rule.wc.wildcards & FWW_IPV6_LABEL: > offset += nxm_put(buf, offset, ofproto_v1_0.NXM_NX_IPV6_LABEL, rule) > > + if len(rule.flow.ipv6_src): > + if len(rule.wc.ipv6_src_mask): > + header = ofproto_v1_0.NXM_NX_IPV6_SRC_W > + else: > + header = ofproto_v1_0.NXM_NX_IPV6_SRC > + offset += nxm_put(buf, offset, header, rule) > + > + if len(rule.flow.ipv6_dst): > + if len(rule.wc.ipv6_dst_mask): > + header = ofproto_v1_0.NXM_NX_IPV6_DST_W > + else: > + header = ofproto_v1_0.NXM_NX_IPV6_DST > + offset += nxm_put(buf, offset, header, rule) > + > # ARP > if rule.flow.arp_spa != 0: > if rule.wc.arp_spa_mask == UINT32_MAX: > diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py > index 4564843..bc1ce5c 100644 > --- a/ryu/ofproto/ofproto_v1_0.py > +++ b/ryu/ofproto/ofproto_v1_0.py > @@ -707,6 +707,11 @@ NXM_NX_TUN_ID_W = nxm_header_w(0x0001, 16, 8) > NXM_NX_ARP_SHA = nxm_header(0x0001, 17, 6) > NXM_NX_ARP_THA = nxm_header(0x0001, 18, 6) > > +NXM_NX_IPV6_SRC = nxm_header(0x0001, 19, 16) > +NXM_NX_IPV6_SRC_W = nxm_header_w(0x0001, 19, 16) > +NXM_NX_IPV6_DST = nxm_header(0x0001, 20, 16) > +NXM_NX_IPV6_DST_W = nxm_header_w(0x0001, 20, 16) > + > NXM_NX_ICMPV6_TYPE = nxm_header(0x0001, 21, 1) > NXM_NX_ICMPV6_CODE = nxm_header(0x0001, 22, 1) > > -- > 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 > -- yamahata ------------------------------------------------------------------------------ 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
