def test_flowspec_user_interface_vpv4(self):
     rules = RULES_BASE + [
         # dst_prefix='10.0.0.0/24
         bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24),
         # src_prefix='20.0.0.1/24'
         bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24),
         # ip_proto='6'
         bgp.FlowSpecIPProtocol(
             operator=bgp.FlowSpecIPProtocol.EQ, value=6),
         # fragment='LF'
         bgp.FlowSpecFragment(
             operator=0,  # Partial match
             value=bgp.FlowSpecFragment.LF),
         # fragment='==FF'
         bgp.FlowSpecFragment(
             operator=bgp.FlowSpecFragment.MATCH,
             value=bgp.FlowSpecFragment.FF),
         # fragment='&==ISF'
         bgp.FlowSpecFragment(
             operator=(bgp.FlowSpecFragment.AND |
                       bgp.FlowSpecFragment.MATCH),
             value=bgp.FlowSpecFragment.ISF),
         # fragment='!=DF'
         bgp.FlowSpecFragment(
             operator=bgp.FlowSpecFragment.NOT,
             value=bgp.FlowSpecFragment.DF)
     ]
     msg = bgp.FlowSpecVPNv4NLRI.from_user(
         route_dist='65001:250',
         dst_prefix='10.0.0.0/24',
         src_prefix='20.0.0.0/24',
         ip_proto='6',
         port='>=8000 & <=9000 | ==80',
         dst_port='8080 >9000&<9050 | <=1000',
         src_port='<=9090 & >=9080 <10100 & >10000',
         icmp_type=0,
         icmp_code=6,
         tcp_flags='SYN+ACK & !=URGENT',
         packet_len='1000 & 1100',
         dscp='22 24',
         fragment='LF ==FF&==ISF | !=DF')
     msg2 = bgp.FlowSpecVPNv4NLRI(route_dist='65001:250', rules=rules)
     binmsg = msg.serialize()
     binmsg2 = msg2.serialize()
     eq_(str(msg), str(msg2))
     eq_(binary_str(binmsg), binary_str(binmsg2))
     msg3, rest = bgp.FlowSpecVPNv4NLRI.parser(binmsg)
     eq_(str(msg), str(msg3))
     eq_(rest, b'')
Beispiel #2
0
    def test_user_interface(self):
        rules = [
            # dst_prefix='10.0.0.0/24
            bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24),
            # src_prefix='20.0.0.1/24'
            bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24),
            # ip_proto='6'
            bgp.FlowSpecIPProtocol(operator=bgp.FlowSpecIPProtocol.EQ,
                                   value=6),
            # port='>=8000'
            bgp.FlowSpecPort(operator=(bgp.FlowSpecPort.GT
                                       | bgp.FlowSpecPort.EQ),
                             value=8000),
            # port='&<=9000'
            bgp.FlowSpecPort(
                operator=(bgp.FlowSpecPort.AND | bgp.FlowSpecPort.LT
                          | bgp.FlowSpecPort.EQ),
                value=9000),
            # port='==80'
            bgp.FlowSpecPort(operator=bgp.FlowSpecPort.EQ, value=80),
            # dst_port=8080
            bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.EQ, value=8080),
            # dst_port='>9000'
            bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.GT, value=9000),
            # dst_port='&<9050'
            bgp.FlowSpecDestPort(operator=(bgp.FlowSpecDestPort.AND
                                           | bgp.FlowSpecDestPort.LT),
                                 value=9050),
            # dst_port='<=1000'
            bgp.FlowSpecDestPort(operator=(bgp.FlowSpecDestPort.LT
                                           | bgp.FlowSpecDestPort.EQ),
                                 value=1000),
            # src_port='<=9090'
            bgp.FlowSpecSrcPort(operator=(bgp.FlowSpecSrcPort.LT
                                          | bgp.FlowSpecSrcPort.EQ),
                                value=9090),
            # src_port='& >=9080'
            bgp.FlowSpecSrcPort(
                operator=(bgp.FlowSpecSrcPort.AND | bgp.FlowSpecSrcPort.GT
                          | bgp.FlowSpecSrcPort.EQ),
                value=9080),
            # src_port='<10100'
            bgp.FlowSpecSrcPort(operator=bgp.FlowSpecSrcPort.LT, value=10100),
            # src_port='>10000'
            bgp.FlowSpecSrcPort(operator=(bgp.FlowSpecSrcPort.AND
                                          | bgp.FlowSpecSrcPort.GT),
                                value=10000),
            # icmp_type=0
            bgp.FlowSpecIcmpType(operator=bgp.FlowSpecIcmpType.EQ, value=0),
            # icmp_code=6
            bgp.FlowSpecIcmpCode(operator=bgp.FlowSpecIcmpCode.EQ, value=6),
            # tcp_flags='ACK+FIN'
            bgp.FlowSpecTCPFlags(
                operator=0,  # Partial match
                value=(bgp.FlowSpecTCPFlags.SYN | bgp.FlowSpecTCPFlags.ACK)),
            # tcp_flags='&!=URGENT'
            bgp.FlowSpecTCPFlags(operator=(bgp.FlowSpecTCPFlags.AND
                                           | bgp.FlowSpecTCPFlags.NOT),
                                 value=bgp.FlowSpecTCPFlags.URGENT),
            # packet_len=1000
            bgp.FlowSpecPacketLen(operator=bgp.FlowSpecPacketLen.EQ,
                                  value=1000),
            # packet_len=1100
            bgp.FlowSpecPacketLen(operator=(bgp.FlowSpecTCPFlags.AND
                                            | bgp.FlowSpecPacketLen.EQ),
                                  value=1100),
            # dscp=22
            bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=22),
            # dscp=24
            bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=24),
            # fragment='LF'
            bgp.FlowSpecFragment(
                operator=0,  # Partial match
                value=bgp.FlowSpecFragment.LF),
            # fragment='==FF'
            bgp.FlowSpecFragment(operator=bgp.FlowSpecFragment.MATCH,
                                 value=bgp.FlowSpecFragment.FF),
            # fragment='&==ISF'
            bgp.FlowSpecFragment(operator=(bgp.FlowSpecFragment.AND
                                           | bgp.FlowSpecFragment.MATCH),
                                 value=bgp.FlowSpecFragment.ISF),
            # fragment='!=DF'
            bgp.FlowSpecFragment(operator=bgp.FlowSpecFragment.NOT,
                                 value=bgp.FlowSpecFragment.DF)
        ]

        msg = bgp.FlowSpecIPv4NLRI.from_user(
            dst_prefix='10.0.0.0/24',
            src_prefix='20.0.0.0/24',
            ip_proto='6',
            port='>=8000 & <=9000 | ==80',
            dst_port='8080 >9000&<9050 | <=1000',
            src_port='<=9090 & >=9080 <10100 & >10000',
            icmp_type=0,
            icmp_code=6,
            tcp_flags='SYN+ACK & !=URGENT',
            packet_len='1000 & 1100',
            dscp='22 24',
            fragment='LF ==FF&==ISF | !=DF')
        msg2 = bgp.FlowSpecIPv4NLRI(rules=rules)
        binmsg = msg.serialize()
        binmsg2 = msg2.serialize()
        eq_(str(msg), str(msg2))
        eq_(binary_str(binmsg), binary_str(binmsg2))
        msg3, rest = bgp.FlowSpecIPv4NLRI.parser(binmsg)
        eq_(str(msg), str(msg3))
        eq_(rest, b'')

        msg = bgp.FlowSpecVPNv4NLRI.from_user(
            route_dist='65001:250',
            dst_prefix='10.0.0.0/24',
            src_prefix='20.0.0.0/24',
            ip_proto='6',
            port='>=8000 & <=9000 | ==80',
            dst_port='8080 >9000&<9050 | <=1000',
            src_port='<=9090 & >=9080 <10100 & >10000',
            icmp_type=0,
            icmp_code=6,
            tcp_flags='SYN+ACK & !=URGENT',
            packet_len='1000 & 1100',
            dscp='22 24',
            fragment='LF ==FF&==ISF | !=DF')
        msg2 = bgp.FlowSpecVPNv4NLRI(route_dist='65001:250', rules=rules)
        binmsg = msg.serialize()
        binmsg2 = msg2.serialize()
        eq_(str(msg), str(msg2))
        eq_(binary_str(binmsg), binary_str(binmsg2))
        msg3, rest = bgp.FlowSpecVPNv4NLRI.parser(binmsg)
        eq_(str(msg), str(msg3))
        eq_(rest, b'')