more refactoring
diff --git a/oltconstants.py b/oltconstants.py
new file mode 100644
index 0000000..3e6d03c
--- /dev/null
+++ b/oltconstants.py
@@ -0,0 +1,112 @@
+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.pop_vlan(), 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
\ No newline at end of file