161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#!/usr/bin/python
261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# Tests p2p_group_add
361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt######### MAY NEED TO RUN AS SUDO #############
461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport dbus
661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport sys, os
761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport time
861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport gobject
961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport getopt
1061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport threading
1161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfrom dbus.mainloop.glib import DBusGMainLoop
1261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef usage():
1461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Usage:"
1561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  %s -i <interface_name> [-p <persistent>] \ " \
1661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		% sys.argv[0]
1761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "		[-f <frequency>] [-o <group_object_path>] \ "
1861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  		[-w <wpas_dbus_interface>]"
1961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Options:"
2061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -i = interface name"
2161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -p = persistant group = 0 (0=false, 1=true)"
2261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -f = frequency"
2361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -o = persistent group object path"
2461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -w = wpas dbus interface = fi.w1.wpa_supplicant1"
2561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Example:"
2661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  %s -i wlan0" % sys.argv[0]
2761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# Required Signals
2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef GroupStarted(properties):
3061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if properties.has_key("group_object"):
3161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print 'Group Formation Complete %s' \
3261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			% properties["group_object"]
3361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef WpsFailure(status, etc):
3661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "WPS Authentication Failure".format(status)
3761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print etc
3861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
3961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtclass P2P_Group_Add (threading.Thread):
4161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Needed Variables
4261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global bus
4361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_object
4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global interface_object
4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global p2p_interface
4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global interface_name
4761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas
4861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interface
4961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global path
5061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global persistent
5161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global frequency
5261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global persistent_group_object
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Dbus Paths
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_opath
5661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_opath
5761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_interface
5861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_p2pdevice
5961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Arguements
6161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global P2PDictionary
6261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
6361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Constructor
6461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def __init__(self,interface_name,wpas_dbus_interface,persistent,frequency,
6561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt						persistent_group_object):
6661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Initializes variables and threads
6761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.interface_name = interface_name
6861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interface = wpas_dbus_interface
6961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.persistent = persistent
7061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.frequency = frequency
7161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.persistent_group_object = persistent_group_object
7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Initializes thread and daemon allows for ctrl-c kill
7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		threading.Thread.__init__(self)
7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.daemon = True
7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Generating interface/object paths
7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_opath = "/" + \
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface.replace(".","/")
8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_wpas_dbus_interfaces_opath = self.wpas_dbus_opath + \
8161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				"/Interfaces"
8261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interfaces_interface = \
8361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface + ".Interface"
8461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interfaces_p2pdevice = \
8561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interfaces_interface \
8661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				+ ".P2PDevice"
8761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Getting interfaces and objects
8961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		DBusGMainLoop(set_as_default=True)
9061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus = dbus.SystemBus()
9161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_object = self.bus.get_object(
9261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface,
9361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_opath)
9461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas = dbus.Interface(self.wpas_object,
9561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface)
9661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
9761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Try to see if supplicant knows about interface
9861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# If not, throw an exception
9961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		try:
10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.path = self.wpas.GetInterface(
10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					self.interface_name)
10261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		except dbus.DBusException, exc:
10361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			error = 'Error:\n  Interface ' + self.interface_name \
10461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				+ ' was not found'
10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print error
10661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			usage()
10761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			os._exit(0)
10861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
10961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.interface_object = self.bus.get_object(
11061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface, self.path)
11161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.p2p_interface = dbus.Interface(self.interface_object,
11261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interfaces_p2pdevice)
11361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
11461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		#Adds listeners
11561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(GroupStarted,
11661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
11761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="GroupStarted")
11861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(WpsFailure,
11961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
12061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="WpsFailed")
12161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
12261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Sets up p2p_group_add dictionary
12361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def constructArguements(self):
12461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.P2PDictionary = {'persistent':self.persistent}
12561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
12661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (self.frequency != None):
12761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (int(self.frequency) > 0):
12861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.P2PDictionary.update({'frequency':int(self.frequency)})
12961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			else:
13061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "Error:\n  Frequency must be greater than 0"
13161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				usage()
13261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				os._exit(0)
13361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
13461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (self.persistent_group_object != None):
13561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.P2PDictionary.update({'persistent_group_object':
13661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt						self.persistent_group_object})
13761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
13861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Run p2p_group_remove
13961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def run(self):
14061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		try:
14161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.p2p_interface.GroupAdd(self.P2PDictionary)
14261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
14361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		except:
14461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print "Error:\n  Could not preform group add"
14561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			usage()
14661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			os._exit(0)
14761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
14861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Allows other threads to keep working while MainLoop runs
14961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Required for timeout implementation
15061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		gobject.MainLoop().get_context().iteration(True)
15161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		gobject.threads_init()
15261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		gobject.MainLoop().run()
15361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
15561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtif __name__ == "__main__":
15661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
15761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Defaults for optional inputs
15861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# 0 = false, 1 = true
15961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	persistent = False
16061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	frequency = None
16161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	persistent_group_object = None
16261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	wpas_dbus_interface = 'fi.w1.wpa_supplicant1'
16361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
16461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# interface_name is required
16561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	interface_name = None
16661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
16761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Using getopts to handle options
16861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	try:
16961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		options, args = getopt.getopt(sys.argv[1:],"hi:p:f:o:w:")
17061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
17161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	except getopt.GetoptError:
17261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
17361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
17461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
17561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# If theres a switch, override default option
17661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for key, value in options:
17761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Help
17861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (key == "-h"):
17961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			usage()
18061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			quit()
18161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Interface Name
18261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-i"):
18361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			interface_name = value
18461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Timeout
18561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-p"):
18661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (value == '0'):
18761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				persistent = False
18861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			elif (value == '1'):
18961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				persistent = True
19061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			else:
19161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "Error:\n  Persistent can only be 1 or 0"
19261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				usage()
19361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				os._exit(0)
19461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Frequency
19561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-f"):
19661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			frequency = value
19761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Persistent group object path
19861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-o"):
19961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			persistent_group_object = value
20061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Dbus interface
20161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-w"):
20261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpas_dbus_interface = value
20361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else:
20461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			assert False, "unhandled option"
20561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
20661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Interface name is required and was not given
20761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (interface_name == None):
20861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  interface_name is required"
20961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
21061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
21161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
21261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	try:
21361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		p2p_group_add_test = P2P_Group_Add(interface_name,wpas_dbus_interface,
21461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					persistent,frequency,persistent_group_object)
21561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	except:
21661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  Invalid Arguements"
21761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
21861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	p2p_group_add_test.constructArguements()
21961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	p2p_group_add_test.start()
22061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	time.sleep(5)
22161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Error:\n  Group formation timed out"
22261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
223