changing structure
diff --git a/scripts/forwarder_subscriber_with_ACK.py b/scripts/forwarder_subscriber_with_ACK.py
new file mode 100755
index 0000000..e3826a5
--- /dev/null
+++ b/scripts/forwarder_subscriber_with_ACK.py
@@ -0,0 +1,253 @@
+#!/usr/bin/python
+# coding: utf8
+#Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+#
+#This program and the accompanying materials are made available under the
+#terms of the Eclipse Public License v1.0 which accompanies this distribution,
+#and is available at http://www.eclipse.org/legal/epl-v10.html
+
+import signal
+import sys
+import zmq
+import struct
+import socket as socketlib
+import datetime
+import time
+import random
+import thread
+from multiprocessing.pool import ThreadPool
+
+pool = ThreadPool(processes=1)
+
+conflict = False
+topicId = None
+#nodeId = "node3"
+#networkId = "network4"
+nodeId = "node"+sys.argv[1]
+networkId = "network"+sys.argv[2]
+toSend = sys.argv[3]
+source = random.randrange(0,65535)
+topicId = random.randrange(4,255)
+
+def signal_handler(signal, frame):
+    print "\nExiting... Sending DPN Status Indication message with Status = GOODBYE"
+    pub_socket.send("%s" % (struct.pack("!BBBBIB",2,12,topicId,2,source,len(nodeId)) + nodeId + struct.pack('!B',len(networkId)) + networkId))
+    count = 0
+    while True:
+        time.sleep(1)
+        sys.stdout.write("\r"+str(5-count)+" ")
+        sys.stdout.flush()
+        count += 1
+        if(count > 5):
+            print "\n"
+            sys.exit(0)
+
+signal.signal(signal.SIGINT, signal_handler)
+
+def sendAssignId(pub_socket): 
+    global conflict
+    global topicId
+    time.sleep(1)
+    pub_socket.send("%s" % (struct.pack('!BBBIB',1,10,topicId,source,len(nodeId)) + nodeId + struct.pack('!B',len(networkId)) + networkId))
+    count = 0
+    while True:
+        time.sleep(1)
+        sys.stdout.write("\r"+str(9-count)+" ")
+        sys.stdout.flush()
+        count += 1
+        if conflict:
+            conflict = False
+            sendAssignId(pub_socket)
+            return
+        if count > 9:
+            break
+    print "\nDPN Topic = ", topicId
+    print "Node Id = ", nodeId
+    print "Network Id = ", networkId
+    print "Source Id = ", source
+    print "Sending Hello Message . . ."
+    pub_socket.send("%s" % (struct.pack("!BBBBIB",2,12,topicId,1,source,len(nodeId)) + nodeId + struct.pack('!B',len(networkId)) + networkId))
+
+    print "Ready to receive messages. Press Ctrl+C when ready to exit."
+
+rec_port = "5560"
+send_port = "5559"
+# Socket to talk to server
+context = zmq.Context()
+socket = context.socket(zmq.SUB)
+pub_socket = context.socket(zmq.PUB)
+socket.connect ("tcp://localhost:%s" % rec_port)
+pub_socket.connect("tcp://localhost:%s" % send_port)
+topicfilter = ""
+controller_topic= 252
+socket.setsockopt(zmq.SUBSCRIBE, topicfilter)
+print "Listening to port ", rec_port
+print "DPN Lifecycle start up . . . Please wait."
+
+async_result = pool.apply_async(sendAssignId,(pub_socket,))
+
+count = 0
+msgnum1count = 0
+msgnum2count = 0
+msgnum3count = 0
+msgnum4count = 0
+msgnum5count = 0
+msgnum6count = 0
+for update_nbr in range(900000):
+    string = socket.recv()
+    ts = time.time()
+    st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
+ 
+    topic,msgnum = struct.unpack('!BB',string[:2])
+
+    if topic == 1 and msgnum == 10: #Assign_Id
+        top,msg,topId,src,nodeIdLen = struct.unpack('!BBBIB',string[:8])
+        top,msg,topId,src,nodeIdLen,nodeId1,networkIdLen = struct.unpack('!BBBIB'+str(nodeIdLen)+'sB',string[:8+nodeIdLen+1])
+        top,msg,topId,src,nodeIdLen,nodeId1,networkIdLen,networkId1 = struct.unpack('!BBBIB'+str(nodeIdLen)+'sB'+str(networkIdLen)+'s',string[:8+nodeIdLen+1+networkIdLen])
+        #print nodeId1, networkId1
+        if src != source and (topId == topicId or nodeId1 == nodeId):
+            pub_socket.send("%s" % struct.pack('!BBBIBsBs',1,11,topicId,source,len(nodeId),nodeId,len(networkId),networkId))
+        continue
+
+    elif topic == 1 and msgnum == 11: #Assign_Conflict
+        top,msg,topId,src,nodeIdLen = struct.unpack('!BBBIB',string[:8])
+        top,msg,topId,src,nodeIdLen,nodeId1,networkIdLen = struct.unpack('!BBBIB'+str(nodeIdLen)+'sB',string[:8+nodeIdLen+1])
+        top,msg,topId,src,nodeIdLen,nodeId1,networkIdLen,networkId1 = struct.unpack('!BBBIB'+str(nodeIdLen)+'sB'+str(networkIdLen)+'s',string[:8+nodeIdLen+1+networkIdLen])
+        
+        if src != source:
+            if(nodeId == nodeId1):
+                print "Received assign conflict for node id. Change the node id and restart this script."
+                exit(0)
+            if(networkId == networkId1):
+                print "Received assign conflict for network id. Change the network id and restart this script."
+                exit(0)
+            if(top == topicId):
+                print "Received assign conflict for topic id. Generating new topic id and resending Assign Topic Id Message."
+                topicId = random.randrange(0,255)
+            conflict = True
+        continue
+
+    elif topic == topicId and msgnum == 13:
+        top, msg, controller_topic, controller_status = struct.unpack('!BBBB',string[:4])
+        print "DPN Status ACK received. Controller Topic = ",controller_topic
+        continue
+
+    elif topic == 3 and msgnum == 14:
+        top, msg, controller_topic, controller_status = struct.unpack('!BBBB',string[:4])
+        if controller_status == 1:
+            print "Received controller Hello. Controller Topic = ",controller_topic
+            print "Sending Hello To Controller that has a topic id of ", controller_topic
+            pub_socket.send("%s" % (struct.pack("!BBBBIB",controller_topic,12,topicId,1,source,len(nodeId)) + nodeId + struct.pack('!B',len(networkId)) + networkId))
+
+        elif controller_status == 2:
+            print "Received controller Goodbye. Controller Topic =  ",controller_topic
+
+    if topic != topicId:
+        continue
+    print 'Receiving message', count, ' at ', st, ' ..... '
+    count += 1
+    print 'length of message = ', len(string)
+    print 'topic =', topic
+    print 'msgnum =', msgnum
+
+    if msgnum == 1:
+        msgnum1count += 1
+        topic,msgnum, imsi, default_ebi, ue_ip, s1u_sgw_gtpu_teid, s1u_sgw_gtpu_ipv4, sessionid, ctopic, cid, opid = struct.unpack('!cBQBLLLQBLL',string[:40])    
+        print 'imsi = ', imsi
+        ipa = socketlib.inet_ntoa(struct.pack('!L',ue_ip))
+        print 'ue_ip = ', ipa
+        print 'default_ebi = ', default_ebi
+        s1u_sgw_gtpu_ipv4a = socketlib.inet_ntoa(struct.pack('!L',s1u_sgw_gtpu_ipv4))
+        print 's1u_sgw_gtpu_ipv4 = ', s1u_sgw_gtpu_ipv4a
+        print 's1u_sgw_gtpu_teid = ', s1u_sgw_gtpu_teid
+        print 'sessionid = ', sessionid
+        print 'controller topic = ', ctopic
+        print 'cid = ', cid
+        print 'opid = ', opid
+        responsedata = struct.pack('!BBBLL',controller_topic,4, 16, cid, opid)
+	if toSend == "true":
+        	pub_socket.send("%s" % (responsedata))
+        #uncomment the following lines to send a DDN for every create session message 
+        #time.sleep(5)
+        #pub_socket.send("%s" % (struct.pack('!BBQLLB'+str(len(nodeId))+'sB'+str(len(networkId))+'s',controller_topic,5,sessionid,cid,opid,len(nodeId),nodeId,len(networkId),networkId)))
+
+    elif msgnum == 2:
+        msgnum2count += 1
+        topic, msgnum, s1u_enb_gtpu_ipv4, s1u_enb_gtpu_teid, s1u_sgw_gtpu_ipv4, sessionid, ctopic, cid, opid  = struct.unpack("!cBLLLQBLL",string[:31])
+        s1u_enb_gtpu_ipv4a = socketlib.inet_ntoa(struct.pack('!L',s1u_enb_gtpu_ipv4))
+        print 's1u_enb_gtpu_ipv4 = ', s1u_enb_gtpu_ipv4a
+        print 'dl s1u_enb_gtpu_teid = ', s1u_enb_gtpu_teid
+        print 'dl s1u_sgw_gtpu_ipv4 = ', socketlib.inet_ntoa(struct.pack('!L',s1u_sgw_gtpu_ipv4))
+        print 'sessionid = ', sessionid
+        print 'controller topic = ', ctopic
+        print 'cid = ', cid
+        print 'opid = ', opid
+        responsedata = struct.pack('!BBBLL',controller_topic,4, 16, cid, opid)
+	if  toSend == "true":
+        	pub_socket.send("%s" % (responsedata))
+
+    elif msgnum == 3:
+        msgnum3count += 1
+        topic, msgnum, sessionid, ctopic, cid, opid = struct.unpack("!cBQBLL",string[:19])
+        print 'sessionid = ', sessionid
+        print 'controller topic = ', ctopic
+        print 'cid = ', cid
+        print 'opid = ', opid
+        responsedata = struct.pack('!BBBLL',controller_topic,4, 0, cid, opid)
+	if toSend == "true":
+        	pub_socket.send("%s" % (responsedata))
+
+    elif msgnum == 6:
+        if(len(string)==14):
+            #topic,msgnum,bufduration,bufcount,controller_topic,cid,opid = struct.unpack('!BBBHBLL',string[:14])
+            topic,msgnum,controller_topic,cid,opid = struct.unpack('!BBBLL',string[:11])
+            #print "dl-buffering-duration",bufduration
+            #print "dl-buffering-suggested-count",bufcount
+            print "Controller Topic = ",controller_topic
+            print "Client id = ", cid
+            print "Op Id = ", opid
+
+    elif msgnum == 17:
+        print "-------------------------------------------------------------"
+        print "ADC Rule received. Details:"
+        topic,msgnum,selector_type = struct.unpack('!BBB',string[:3])
+
+        #Domain
+        if(selector_type == 0):
+            domain_name_length, = struct.unpack('!B',string[3:4])
+            domain_name, = struct.unpack('!'+str(domain_name_length)+'s',string[4:4+int(domain_name_length)])
+            next_index = 4+int(domain_name_length)
+            print "Domain Name = ",domain_name
+
+        #IP Address
+        if(selector_type == 1 or selector_type == 2):
+            ip_address, = struct.unpack('!L',string[3:7])
+            ip_addressa = socketlib.inet_ntoa(struct.pack('!L',ip_address))
+            next_index = 7
+            print "IP Address = ",ip_addressa
+
+        #IP Prefix
+        if selector_type == 2:
+            ip_prefix, = struct.unpack('!H',string[7:9])
+            next_index += 2
+            print "IP Prefix = ",ip_prefix
+
+        #rule_id, = struct.unpack('!L',string[rule_id_index:rule_id_index+4])
+        #print "Rule Id = ", rule_id
+
+        #rating_group,service_id,sponsor_id_length = struct.unpack('!LLB', string[rule_id_index+4:rule_id_index+4+9])
+        drop,rating_group,service_id,sponsor_id_length = struct.unpack('!BLLB', string[next_index:next_index+10])
+        print "Drop = ", drop
+        print "Rating Group = ", rating_group
+        print "Service Id = ", service_id
+        #print "Sponsor Length = ", sponsor_id_length
+        #sponsor_id, = struct.unpack('!'+str(sponsor_id_length)+'s',string[rule_id_index+4+9:rule_id_index+4+9+int(sponsor_id_length)])
+        sponsor_id, = struct.unpack('!'+str(sponsor_id_length)+'s',string[next_index+10:next_index+10+int(sponsor_id_length)])
+        print "Sponsor = ", sponsor_id 
+        print "-------------------------------------------------------------"
+        #precedence, = struct.unpack('!L',string[rule_id_index+4+9+int(sponsor_id_length):rule_id_index+4+9+int(sponsor_id_length)+4])
+        #print "precedence = ", precedence
+
+    print '================'
+    print 'Total = ', count, 'msgnum1 count', msgnum1count, 'msgnum2 count', msgnum2count, 'msgnum3 count', msgnum3count, 'msgnum4 count', msgnum4count,'msgnum5 count', msgnum5count, 'msgnum6 count', msgnum6count
+socket.close()