161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#!/usr/bin/python
261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# Tests p2p_connect
361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# Will try to connect to another peer
461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# and form a group
561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt######### MAY NEED TO RUN AS SUDO #############
661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport dbus
861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport sys, os
961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport time
1061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport gobject
1161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtimport getopt
1261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfrom dbus.mainloop.glib import DBusGMainLoop
1361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef usage():
1661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Usage:"
1761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  %s -i <interface_name> -m <wps_method> \ " \
1861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		% sys.argv[0]
1961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "		-a <addr> [-p <pin>] [-g <go_intent>] \ "
2061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  		[-w <wpas_dbus_interface>]"
2161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Options:"
2261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -i = interface name"
2361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -m = wps method"
2461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -a = peer address"
2561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -p = pin number (8 digits)"
2661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -g = group owner intent"
2761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  -w = wpas dbus interface = fi.w1.wpa_supplicant1"
2861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Example:"
2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "  %s -i wlan0 -a 0015008352c0 -m display -p 12345670" % sys.argv[0]
3061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt# Required Signals
3361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef GONegotiationSuccess(status):
3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "Go Negotiation Success"
3561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef GONegotiationFailure(status):
3761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print 'Go Negotiation Failed. Status:'
3861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print format(status)
3961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
4061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef GroupStarted(properties):
4261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if properties.has_key("group_object"):
4361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print 'Group Formation Complete %s' \
4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			% properties["group_object"]
4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtdef WpsFailure(status, etc):
4861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print "WPS Authentication Failure".format(status)
4961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print etc
5061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
5161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtclass P2P_Connect():
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Needed Variables
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global bus
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_object
5661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global interface_object
5761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global p2p_interface
5861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global ifname
5961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interface
6161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global timeout
6261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global path
6361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wps_method
6461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global go_intent
6561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global addr
6661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global pin
6761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
6861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Dbus Paths
6961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_opath
7061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_opath
7161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_interface
7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global wpas_dbus_interfaces_p2pdevice
7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Dictionary of Arguements
7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	global p2p_connect_arguements
7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Constructor
7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def __init__(self,ifname,wpas_dbus_interface,addr,
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					pin,wps_method,go_intent):
8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Initializes variables and threads
8161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.ifname = ifname
8261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interface = wpas_dbus_interface
8361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wps_method = wps_method
8461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.go_intent = go_intent
8561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.addr = addr
8661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.pin = pin
8761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Generating interface/object paths
8961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_opath = \
9061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			"/" + self.wpas_dbus_interface.replace(".","/")
9161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_wpas_dbus_interfaces_opath = \
9261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.wpas_dbus_opath + "/Interfaces"
9361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interfaces_interface = \
9461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.wpas_dbus_interface + ".Interface"
9561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_dbus_interfaces_p2pdevice = \
9661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.wpas_dbus_interfaces_interface + ".P2PDevice"
9761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
9861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Getting interfaces and objects
9961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		DBusGMainLoop(set_as_default=True)
10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus = dbus.SystemBus()
10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas_object = self.bus.get_object(
10261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface,
10361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_opath)
10461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.wpas = dbus.Interface(
10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_object, self.wpas_dbus_interface)
10661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
10761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# See if wpa_supplicant already knows about this interface
10861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.path = None
10961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		try:
11061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.path = self.wpas.GetInterface(ifname)
11161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		except:
11261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if not str(exc).startswith(
11361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface + \
11461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				".InterfaceUnknown:"):
11561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				raise exc
11661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			try:
11761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				path = self.wpas.CreateInterface(
11861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					{'Ifname': ifname, 'Driver': 'test'})
11961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				time.sleep(1)
12061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
12161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			except dbus.DBusException, exc:
12261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				if not str(exc).startswith(
12361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					self.wpas_dbus_interface + \
12461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					".InterfaceExists:"):
12561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					raise exc
12661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
12761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Get Interface and objects
12861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.interface_object = self.bus.get_object(
12961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interface,self.path)
13061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.p2p_interface = dbus.Interface(
13161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.interface_object,
13261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.wpas_dbus_interfaces_p2pdevice)
13361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
13461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Add signals
13561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(GONegotiationSuccess,
13661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
13761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="GONegotiationSuccess")
13861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(GONegotiationFailure,
13961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
14061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="GONegotiationFailure")
14161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(GroupStarted,
14261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
14361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="GroupStarted")
14461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.bus.add_signal_receiver(WpsFailure,
14561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			dbus_interface=self.wpas_dbus_interfaces_p2pdevice,
14661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			signal_name="WpsFailed")
14761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
14861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
14961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	#Constructing all the arguements needed to connect
15061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def constructArguements(self):
15161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Adding required arguements
15261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		self.p2p_connect_arguements = {'wps_method':self.wps_method,
15361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			'peer':dbus.ObjectPath(self.path+'/Peers/'+self.addr)}
15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
15561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Display requires a pin, and a go intent of 15
15661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (self.wps_method == 'display'):
15761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.pin != None):
15861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.p2p_connect_arguements.update({'pin':self.pin})
15961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			else:
16061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "Error:\n  Pin required for wps_method=display"
16161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				usage()
16261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				quit()
16361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
16461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.go_intent != None and int(self.go_intent) != 15):
16561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "go_intent overwritten to 15"
16661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
16761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.go_intent = '15'
16861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
16961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Keypad requires a pin, and a go intent of less than 15
17061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (self.wps_method == 'keypad'):
17161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.pin != None):
17261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.p2p_connect_arguements.update({'pin':self.pin})
17361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			else:
17461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "Error:\n  Pin required for wps_method=keypad"
17561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				usage()
17661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				quit()
17761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
17861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.go_intent != None and int(self.go_intent) == 15):
17961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				error = "Error :\n Group Owner intent cannot be" + \
18061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					" 15 for wps_method=keypad"
18161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print error
18261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				usage()
18361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				quit()
18461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
18561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Doesn't require pin
18661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# for ./wpa_cli, p2p_connect [mac] [pin#], wps_method=keypad
18761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (self.wps_method == 'pin'):
18861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.pin != None):
18961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "pin ignored"
19061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
19161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# No pin is required for pbc so it is ignored
19261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (self.wps_method == 'pbc'):
19361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (self.pin != None):
19461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				print "pin ignored"
19561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
19661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else:
19761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print "Error:\n  wps_method not supported or does not exist"
19861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			usage()
19961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			quit()
20061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
20161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Go_intent is optional for all arguements
20261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (self.go_intent != None):
20361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			self.p2p_connect_arguements.update(
20461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				{'go_intent':dbus.Int32(self.go_intent)})
20561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
20661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Running p2p_connect
20761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	def run(self):
20861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		try:
20961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			result_pin = self.p2p_interface.Connect(
21061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				self.p2p_connect_arguements)
21161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
21261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		except dbus.DBusException, exc:
21361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				raise exc
21461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
21561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (self.wps_method == 'pin' and \
21661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		not self.p2p_connect_arguements.has_key('pin') ):
21761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print "Connect return with pin value of %d " % int(result_pin)
21861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		gobject.MainLoop().run()
21961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
22061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtif __name__ == "__main__":
22161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
22261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Required
22361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	interface_name = None
22461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	wps_method = None
22561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	addr = None
22661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
22761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Conditionally optional
22861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pin = None
22961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
23061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Optional
23161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	wpas_dbus_interface = 'fi.w1.wpa_supplicant1'
23261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	go_intent = None
23361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
23461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Using getopts to handle options
23561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	try:
23661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		options, args = getopt.getopt(sys.argv[1:],"hi:m:a:p:g:w:")
23761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
23861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	except getopt.GetoptError:
23961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
24061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
24161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
24261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# If theres a switch, override default option
24361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for key, value in options:
24461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Help
24561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (key == "-h"):
24661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			usage()
24761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			quit()
24861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Interface Name
24961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-i"):
25061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			interface_name = value
25161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# WPS Method
25261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-m"):
25361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wps_method = value
25461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Address
25561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-a"):
25661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			addr = value
25761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Pin
25861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-p"):
25961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pin = value
26061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Group Owner Intent
26161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-g"):
26261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			go_intent = value
26361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		# Dbus interface
26461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		elif (key == "-w"):
26561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpas_dbus_interface = value
26661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else:
26761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			assert False, "unhandled option"
26861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
26961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Required Arguements check
27061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (interface_name == None or wps_method == None or addr == None):
27161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  Required arguements not specified"
27261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
27361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
27461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
27561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Group Owner Intent Check
27661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (go_intent != None and (int(go_intent) > 15 or int(go_intent) < 0) ):
27761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  Group Owner Intent must be between 0 and 15 inclusive"
27861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
27961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
28061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
28161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	# Pin Check
28261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (pin != None and len(pin) != 8):
28361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  Pin is not 8 digits"
28461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
28561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
28661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
28761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	try:
28861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		p2p_connect_test = P2P_Connect(interface_name,wpas_dbus_interface,
28961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			addr,pin,wps_method,go_intent)
29061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
29161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	except:
29261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		print "Error:\n  Invalid Arguements"
29361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		usage()
29461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		quit()
29561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
29661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	p2p_connect_test.constructArguements()
29761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	p2p_connect_test.run()
29861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
29961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os._exit(0)
300