adding igmp capability to tester container

Change-Id: Ib1632da1ad8864afdc3e148e840929690365c66b
diff --git a/docker/config/igmp.py b/docker/config/igmp.py
new file mode 100644
index 0000000..9c18f84
--- /dev/null
+++ b/docker/config/igmp.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from igmpv3 import IGMPv3, IGMP_TYPE_V3_MEMBERSHIP_REPORT, IGMP_V3_GR_TYPE_EXCLUDE, IGMPv3gr, IGMP_V3_GR_TYPE_INCLUDE
+from scapy.data import ETH_P_IP
+from scapy.layers.inet import IP
+from scapy.layers.l2 import Ether
+from scapy.sendrecv import sendp
+import argparse
+
+"""
+Send an igmp join
+"""
+
+IGMP_ETH = Ether(type=ETH_P_IP)
+IGMP_IP = IP(dst='224.0.0.22')
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+
+    _help = ('Emit a join message')
+    parser.add_argument('-j', '--join',
+                        dest='join',
+                        action='store_true',
+                        default=False,
+                        help=_help)
+
+    _help = ('Emit a leave message')
+    parser.add_argument('-l', '--leave',
+                        dest='join',
+                        action='store_false',
+                        default=False,
+                        help=_help)
+
+    _help = ('Group address to use')
+    parser.add_argument('-m', '--mcaddr',
+                        dest='mcaddr',
+                        action='store',
+                        default='229.10.20.30',
+                        help = _help)
+
+    _help = ('Interface to use')
+    parser.add_argument('-i', '--iface',
+                        dest='iface',
+                        action='store',
+                        default='eth0',
+                        help = _help)
+
+    return parser.parse_args()
+
+
+def send(igmp):
+    ip_pkt = IGMP_ETH/IGMP_IP
+    pkt = ip_pkt/igmp
+    IGMPv3.fixup(pkt)
+
+    sendp(pkt, iface=args.iface)
+
+def send_join(args):
+    igmp = IGMPv3(type=IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30, gaddr="224.0.0.22")
+    igmp.grps = [IGMPv3gr( rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr=args.mcaddr)]
+
+    send(igmp)
+
+
+def send_leave(args):
+
+    igmp = IGMPv3(type=IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30, gaddr="224.0.0.22c")
+    igmp.grps = [IGMPv3gr(rtype=IGMP_V3_GR_TYPE_INCLUDE, mcaddr=args.mcaddr)]
+
+    send(igmp)
+
+
+if __name__ == '__main__':
+    args = parse_args()
+
+    if args.join:
+        send_join(args)
+    else:
+        send_leave(args)