From ba93fb6d766d50a81a04b641c56f303eed0df15c Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Fri, 10 May 2019 12:25:15 +0200 Subject: [PATCH] init-ifupdown: support establishing a P2P link Co-authored-by: Isaac Hermida Signed-off-by: Javier Viguera --- .../init-ifupdown/init-ifupdown-1.0/p2plink | 79 +++++++++++++++++++ .../init-ifupdown/init-ifupdown_1.0.bbappend | 9 ++- 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown-1.0/p2plink diff --git a/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown-1.0/p2plink b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown-1.0/p2plink new file mode 100644 index 000000000..539127e16 --- /dev/null +++ b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown-1.0/p2plink @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Copyright 2019, Digi International Inc. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at http://mozilla.org/MPL/2.0/. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Description: create P2P link +# +# Configuration variables in '/etc/network/interfaces': +# Mandatory: +# p2p-peer-mac +# Optional: +# p2p-discover-window +# p2p-freq +# p2p-local-address +# p2p-local-netmask +# + +# Execute only for the p2p0 interface +[ "${IFACE}" = "p2p0" ] || exit 0 + +log() { + systemd-cat -p "${1}" -t p2plink printf "%s" "${2}" +} + +# Exit without error if the peer MAC address is not available +[ -z "${IF_P2P_PEER_MAC}" ] && { log info "Peer MAC address not available"; exit 0; } + +# wpa_cli reports lowercase MACs, so convert to lowercase +IF_P2P_PEER_MAC="$(echo "${IF_P2P_PEER_MAC}" | tr 'A-F' 'a-f')" + +if [ "${MODE}" = "start" ]; then + wpa_cli -i"${IFACE}" p2p_find && sleep 1 + for _ in $(seq "${IF_P2P_DISCOVER_WINDOW:=120}"); do + wpa_cli -i"${IFACE}" p2p_peers discovered | grep -i -qs "${IF_P2P_PEER_MAC}" && { peer_found="1"; break; } + sleep 1 + done + wpa_cli -i"${IFACE}" p2p_stop_find + [ -z "${peer_found}" ] && { log err "p2p discover: peer NOT found"; exit 1; } + + # Peer found, establish the link + log info "establish P2P link" + wpa_cli -i"${IFACE}" p2p_connect "${IF_P2P_PEER_MAC}" pbc go_intent=7 ${IF_P2P_FREQ:+freq=${IF_P2P_FREQ}} + for _ in $(seq 20); do + if wpa_cli status 2>&1 | grep -qs "^wpa_state=COMPLETED$"; then + if wpa_cli status 2>&1 | grep -qs "^mode=P2P GO$"; then + # P2P GO side: verify the remote peer has connected + wpa_cli all_sta 2>&1 | grep -i -qs "^p2p_device_addr=${IF_P2P_PEER_MAC}$" && p2p_link_found="1" + elif wpa_cli status 2>&1 | grep -qs "^mode=station$"; then + p2p_link_found="1" + fi + fi + if [ -n "${p2p_link_found}" ]; then + # Configure the newly created interface + if [ -n "${IF_P2P_LOCAL_ADDRESS}" ]; then + for P2P_IFNAME in $(basename $(echo /sys/class/net/p2p-p2p0-*)); do + echo "${P2P_IFNAME}" | grep -qs 'p2p-p2p0-\*' && continue + ifconfig "${P2P_IFNAME}" "${IF_P2P_LOCAL_ADDRESS}" ${IF_P2P_LOCAL_NETMASK:+netmask ${IF_P2P_LOCAL_NETMASK}} up + break + done + fi + break + fi + sleep 1 + done + + # Give 'ifupdown' a proper error return value if 'wpa_state' is NOT COMPLETED + [ -n "${p2p_link_found}" ] && true || false +fi diff --git a/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend index 7fc60a0b3..d64563721 100644 --- a/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend +++ b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend @@ -8,10 +8,11 @@ INITSCRIPT_PARAMS = "start 03 2 3 4 5 . stop 80 0 6 1 ." inherit systemd SRC_URI_append = " \ + file://ifupdown.service \ file://interfaces.br0.example \ file://interfaces.p2p \ + file://p2plink \ file://resolv \ - file://ifupdown.service \ " SRC_URI_append_ccimx6qpsbc = "\ @@ -37,8 +38,10 @@ SYSTEMD_SERVICE_${PN} = "ifupdown.service" WPA_DRIVER ?= "nl80211" do_install_append() { - # Install DNS servers handler - install -m 0755 ${WORKDIR}/resolv ${D}${sysconfdir}/network/if-up.d/resolv + # Install 'ifupdown' scripts + install -m 0755 ${WORKDIR}/p2plink ${D}${sysconfdir}/network/if-up.d/ + install -m 0755 ${WORKDIR}/resolv ${D}${sysconfdir}/network/if-up.d/ + # Install systemd service install -d ${D}${systemd_unitdir}/system/ install -m 0644 ${WORKDIR}/ifupdown.service ${D}${systemd_unitdir}/system/