| from oftest.testutils import * |
| import oftest.packet as scapy |
| from oftest import config |
| |
| import ofp |
| |
| # These parameters can be altered from the command line using the -t or --test-params= options. |
| # Example: -t 'onu_port=129;olt_port=288;device_type=pmc' |
| # |
| onu_port = test_param_get("onu_port", 130) |
| onu_port2 = test_param_get("onu_port2", 131) |
| olt_port = test_param_get("olt_port", 258) |
| device_type = test_param_get("device_type", "normal") # options: "normal", "pmc", "cpqd" |
| |
| |
| def createAllGroupAdd(group_id, ports=[]): |
| buckets = [] |
| |
| for portNum in ports: |
| buckets.append(ofp.common.bucket(watch_port=ofp.OFPP_ANY, watch_group=ofp.OFPG_ANY, |
| actions=[ofp.action.output(port=portNum)])) |
| |
| group_add = ofp.message.group_add(group_type=ofp.OFPGT_ALL, group_id=group_id, buckets=buckets) |
| |
| return group_add |
| |
| |
| def createAllGroupMod(group_id, ports=[]): |
| buckets = [] |
| |
| for portNum in ports: |
| buckets.append(ofp.common.bucket(watch_port=ofp.OFPP_ANY, watch_group=ofp.OFPG_ANY, |
| actions=[ofp.action.output(port=portNum)])) |
| |
| group_mod = ofp.message.group_mod(command=ofp.OFPGC_MODIFY, group_type=ofp.OFPGT_ALL, group_id=group_id, |
| buckets=buckets) |
| |
| return group_mod |
| |
| def buildIgmp(payload): |
| pkt = pkt = IGMPv3.fixup(scapy.Ether() / scapy.IP() / payload) |
| if len(pkt) < 60: |
| pad_len = 60 - len(pkt) |
| pad = scapy.scapy.layers.l2.Padding() |
| pad.load = '\x00' * pad_len |
| pkt = pkt / pad |
| return pkt |
| |
| def double_vlan_udp_packet(pktlen=100, |
| eth_dst='00:01:02:03:04:05', |
| eth_src='00:06:07:08:09:0a', |
| dl_vlan_enable=False, |
| c_vlan_vid=0, |
| c_vlan_pcp=0, |
| s_vlan_vid=0, |
| s_vlan_pcp=0, |
| ip_src='192.168.0.1', |
| ip_dst='192.168.0.2', |
| ip_tos=0, |
| ip_ttl=64, |
| udp_sport=1234, |
| udp_dport=80, |
| ip_ihl=None, |
| ip_options=False, |
| eth_type=0x8100 |
| ): |
| """ |
| Return a double vlan tagged dataplane UDP packet |
| Supports a few parameters: |
| @param len Length of packet in bytes w/o CRC |
| @param eth_dst Destination MAC |
| @param eth_src Source MAC |
| @param dl_vlan_enable True if the packet is with vlan, False otherwise |
| @param c_vlan_vid CVLAN ID |
| @param c_vlan_pcp CVLAN priority |
| @param s_vlan_vid SVLAN ID |
| @param s_vlan_pcp SVLAN priority |
| @param ip_src IP source |
| @param ip_dst IP destination |
| @param ip_tos IP ToS |
| @param ip_ttl IP TTL |
| @param udp_dport UDP destination port |
| @param udp_sport UDP source port |
| |
| Generates a simple UDP packet. Users shouldn't assume anything about |
| this packet other than that it is a valid ethernet/IP/UDP frame. |
| """ |
| |
| if MINSIZE > pktlen: |
| pktlen = MINSIZE |
| |
| # Note Dot1Q.id is really CFI |
| if (dl_vlan_enable): |
| pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=eth_type) / \ |
| scapy.Dot1Q(prio=s_vlan_pcp, vlan=s_vlan_vid) / \ |
| scapy.Dot1Q(prio=c_vlan_pcp, vlan=c_vlan_vid) / \ |
| scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl) / \ |
| scapy.UDP(sport=udp_sport, dport=udp_dport) |
| else: |
| if not ip_options: |
| pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \ |
| scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \ |
| scapy.UDP(sport=udp_sport, dport=udp_dport) |
| |
| else: |
| pkt = scapy.Ether(dst=eth_dst, src=eth_src) / \ |
| scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl, options=ip_options) / \ |
| scapy.UDP(sport=udp_sport, dport=udp_dport) |
| |
| pkt = pkt / ("D" * (pktlen - len(pkt))) |
| |
| return pkt |