Wi-Fi Direct

Wi-Fi Direct is a Wi-Fi standard that allows devices to connect with each other without requiring a Wi-Fi access point. Wi-Fi Direct negotiates the link with a Wi-Fi Protected Setup (WPS) system that assigns each device a limited wireless access point.

Establishing a peer-to-peer (P2P) link has the following phases:

  • P2P discovery, which allows to search for P2P devices in the vicinity

  • P2P group formation, a P2P group is formed with the identification of one of the devices as group owner. A device can either become group owner (GO) autonomously if configured to do so or it can be negotiated between devices with the exchange of GO intents.

  • P2P provisioning, which authenticates the link by using either Push Button Configuration (PBC) or PIN authentication.

  • P2P connection, when the connection between a Group Owner (GO) and a Group Client (GC) is actually established.

P2P interfaces

The QCA6564 driver on load creates a p2p0 interface that is used by the wpa_supplicant for P2P group formation. Once a group is formed, virtual p2p-p2p0-N interfaces are created, where N is an index starting at 0. These virtual interfaces are then used for provisioning.

  • Group additions, find, and connect operations happen on the p2p0 interface.

  • Provisioning occurs on the virtual p2p-p2p0-N interfaces.

This configuration requires MAC addresses to be different and unique. See Wireless virtual MAC addresses for more information. Configure the virtual interfaces before attempting to connect more than one device.

Enable P2P on the driver

The p2p0 interface is disabled by default to improve the performance of the wlan0 interface in client infrastructure mode.

To enable P2P during driver load, create an options file for the wlan module at /etc/modprobe.d/wlan.conf with the following contents:

/etc/modprobe.d/wlan.conf
options wlan enable_p2p=1

Optionally, you can also pass the enable_p2p argument from U-Boot in the linux kernel command line by configuring the U-Boot environment as follows:

=> env set extra_bootargs $extra_bootargs wlan.enable_p2p=1

Automatic P2P connection setup

This topic explains how to do an automatic P2P connection with negotiated GO and PBC join, where any of the peers can adopt the GO role.

  1. Find the MAC address of the remote peer you want to connect to, which you can get using iw dev command under the p2p0 interface:

    ~# iw dev
    phy#0
            Interface p2p0
                    ifindex 7
                    wdev 0x2
                    addr 02:04:f3:8d:40:03
                    type managed
                    txpower 0.00 dBm
            Interface wlan0
                    ifindex 6
                    wdev 0x1
                    addr 00:04:f3:8d:40:03
                    type managed
                    txpower 0.00 dBm
  2. Edit the file /etc/network/interfaces and add the remote peer MAC address using the parameter p2p-peer-mac at the p2p0 interface entry:

    /etc/network/interfaces
    # WiFi P2P interface
    #auto p2p0
    iface p2p0 inet static
            address 192.168.45.30
            netmask 255.255.255.0
            wpa-driver nl80211
            wpa-conf /etc/wpa_supplicant_p2p.conf
            p2p-peer-mac 02:04:f3:8d:40:03
    

    Other optional configurable parameters of the P2P connection include:

    • p2p-discover-window: Duration in seconds on the peer discovery operation (default of 120 seconds).

    • p2p-freq: Frequency for the channel used in the P2P connection (negotiated by default). Digi recommends you select a fixed frequency because it improves resiliency.

    • p2p-local-address: The local IP address assigned to the P2P interface (no default IP assigned).

    • p2p-local-netmask: The network mask assigned to the P2P interface (no default mask assigned).

  3. Repeat the previous step (this time with your device’s MAC) on the peer device.

  4. Reboot the devices with the following command:

    ~# reboot
  5. Bring up the p2p0 interface simultaneously at both ends:

    ~# ifup p2p0

This creates a Wi-Fi direct connection using negotiated GO and PBC join. For details on this automatic P2P connection, see the script /etc/network/if-up.d/p2plink.

Manual P2P connection setup

The following examples will use two ConnectCore 6UL devices to establish P2P connections. Before running any of the examples, bring up the p2p0 interface on both peers with:

~# ifup p2p0
The examples below use wpa-supplicant P2P-specific commands. For more information about these commands, see the wpa_supplicant and Wi-Fi P2P README.

Autonomous GO creation

Create Autonomous Group Owner (GO) and join using PBC method
Peer (GO) ---- PBC --- Peer (GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_group_add

 

3

 

p2p_find

4

 

p2p_connect <CC6UL1_mac_addr> pbc join

5

Ctrl+C to exit

Ctrl+C to exit

6

wpa_cli -i p2p-p2p0-0 wps_pbc

 

7

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

8

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>
Create Autonomous GO and join using PIN from GO
Peer (GO) ---- PIN --- Peer (GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_group_add

 

3

 

p2p_find

4

Ctrl+C to exit

 

5

wpa_cli -ip2p-p2p0-0 wps_pin any

(shows <pin>)

 

6

 

p2p_connect <CC6UL1_mac_addr> <pin> join

7

 

Ctrl+C to exit

8

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

9

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>
Create Autonomous GO and join using PIN from GC
Peer (GO) ---- PIN --- Peer (GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_group_add

 

3

 

p2p_find

4

 

p2p_connect <CC6UL1_mac_addr> pin join

(shows <pin>)

5

Ctrl+C to exit

Ctrl+C to exit

6

wpa_cli -ip2p-p2p0-0 wps_pin any <pin>

 

7

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

8

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>
Create Autonomous GO and invite GC using PBC
Peer (GO) ---- PBC --- Peer (GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_group_add

 

3

 

p2p_find

4

p2p_invite group=p2p-p2p0-0 peer=<CC6UL2_mac_addr>

 

5

 

p2p_connect <CC6UL1_mac_addr> pbc join

6

Ctrl+C to exit

Ctrl+C to exit

7

wpa_cli -i p2p-p2p0-0 wps_pbc

 

8

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

9

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>
For any of these methods, if you want to use the 5GHz frequency, issue p2p_group_add freq=5180 in step two.

Negotiated GO

Negotiate GO and join using PIN
Peer (GO | GC) ---- PIN --- Peer (GO | GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_find

 

3

 

p2p_find

4

p2p_connect <CC6UL2_mac_addr> pin go_intent=1

 

5

 

p2p_connect <CC6UL1_mac_addr> <pin> go_intent=15

6

Ctrl+C to exit

Ctrl+C to exit

7

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

8

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>
Negotiate GO and join using PBC
Peer (GO | GC) ---- PBC --- Peer (GO | GC)
Step Peer CC6UL1 Peer CC6UL2

1

wpa_cli -ip2p0
wpa_cli -ip2p0

2

p2p_find

 

3

 

p2p_find

4

p2p_connect <CC6UL2_mac_addr> pbc go_intent=1

 

5

 

p2p_connect <CC6UL1_mac_addr> pbc go_intent=14

6

Ctrl+C to exit

Ctrl+C to exit

7

ifconfig p2p-p2p0-0 <CC6UL1_ip_addr>
ifconfig p2p-p2p0-0 <CC6UL2_ip_addr>

8

ping <CC6UL2_ip_addr>
ping <CC6UL1_ip_addr>