`
charlotte
  • 浏览: 124042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ad-hoc hack for Android

阅读更多
Ad-hoc hack for Android


http://szym.net/android/adhoc-wpa-supp.html

Ad-hoc hack for Android
Suppose you want one Android phone to connect to another. Unfortunately, the WifiManager in stock Android ignores ad-hoc networks. There are a couple ways around this:

One is to modify the Android framework to support ad-hoc networks (I recall seeing some custom ROM for Samsung Moment that had this).
Another is to manually configure the wpa_supplicant to connect to an ad-hoc network.
Yet another one is to patch the wpa_supplicant to pretend that ad-hoc networks are regular access points. This was my method.
The original purpose of this patch was to enable an Android device tether to another Android phone using Barnacle Wifi Tether.

ad-hoc support in wpa_supplicant

At this time, Android does not support ad-hoc networks. That is, ad-hoc (IBSS) entries are filtered out from the scan results reported by the wpa_supplicant.

To add ad-hoc network support one could augment the WifiStateTracker to not filter IBSS entries out and set the wpa_supplicant in AP_SCAN 2 mode to establish new IBSS instead of associating with a scanned one. That would require fiddling with the Java framework on the phone.

A more crazy way to do this is to augment the wpa_supplicant to masquerade ad-hoc networks as regular infrastructure access points (APs). This makes changes only to the wpa_supplicant and allows a drop in replacement on rooted phones.

Necessary Changes

The patch below modifies the wpa_supplicant code in the external/wpa_supplicant AOSP repo to make ad-hoc networks appear as regular APs with a (*) prefix.

The patch:

removes the [IBSS] flag from scan results,
masquerades and demasquerades ad-hoc ssid with (*) prefix
sets mode 1 (ad-hoc) if the ssid is for IBSS
permits the supplicant to select an IBSS when associating to a given ssid

diff --git a/ctrl_iface.c b/ctrl_iface.c
index ef93533..5accae6 100644
--- a/ctrl_iface.c
+++ b/ctrl_iface.c
@@ -28,6 +28,13 @@
#include "wpa_ctrl.h"
#include "eap.h"

+#define ANDROID_IBSS_HACK
+
+#ifdef ANDROID_IBSS_HACK
+/// NOTE: don't confuse WifiService.parseScanResult
+#define ANDROID_IBSS_PREFIX "(*)"
+#define ANDROID_IBSS_PREFIX_LEN 3
+#endif

static int wpa_supplicant_global_iface_interfaces(struct wpa_global *global,
  char *buf, int len);
@@ -230,6 +237,13 @@ static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s,
ssid_len = _res;
_ssid = ssid_buf;
}
+#ifdef ANDROID_IBSS_HACK
+ if (ssid->mode == IEEE80211_MODE_IBSS)
+ ret = os_snprintf(pos, end - pos, "ssid=%s%s\nid=%d\n",
+   ANDROID_IBSS_PREFIX, wpa_ssid_txt(_ssid, ssid_len),
+   ssid->id);
+ else
+#endif
ret = os_snprintf(pos, end - pos, "ssid=%s\nid=%d\n",
  wpa_ssid_txt(_ssid, ssid_len),
  ssid->id);
@@ -574,12 +588,14 @@ static int wpa_supplicant_ctrl_iface_scan_results(
return retpos - buf;
pos += ret;
}
+#ifndef ANDROID_IBSS_HACK
if (res->caps & IEEE80211_CAP_IBSS) {
ret = os_snprintf(pos, end - pos, "[IBSS]");
if (ret < 0 || ret >= end - pos)
return retpos - buf;
pos += ret;
}
+#endif
if (!res->wpa_ie_len && !res->rsn_ie_len) {
ret = os_snprintf(pos, end - pos, "\t");
if (ret < 0 || ret >= end - pos)
@@ -587,6 +603,12 @@ static int wpa_supplicant_ctrl_iface_scan_results(
pos += ret;
}

+#ifdef ANDROID_IBSS_HACK
+ if (res->caps & IEEE80211_CAP_IBSS)
+ ret = os_snprintf(pos, end - pos, "\t%s%s",
+   ANDROID_IBSS_PREFIX, wpa_ssid_txt(res->ssid, res->ssid_len));
+ else
+#endif
ret = os_snprintf(pos, end - pos, "\t%s",
  wpa_ssid_txt(res->ssid, res->ssid_len));
if (ret < 0 || ret >= end - pos)
@@ -792,6 +814,21 @@ static int wpa_supplicant_ctrl_iface_set_network(
return -1;
}

+#ifdef ANDROID_IBSS_HACK
+ if (os_strcmp(name, "ssid") == 0) {
+ // check prefix
+ if ((value[0] == '"') && (os_strncmp(value+1, ANDROID_IBSS_PREFIX,
+   ANDROID_IBSS_PREFIX_LEN) == 0)) {
+ if (wpa_config_set(ssid, "mode", "1", 0) < 0) {
+ wpa_printf(MSG_DEBUG, "CTRL_IFACE: failed to set IBSS on '%s'",
+   value);
+ return -1;
+ }
+ value += ANDROID_IBSS_PREFIX_LEN;
+ value[0] = '"';
+ }
+ }
+#endif
if (wpa_config_set(ssid, name, value, 0) < 0) {
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Failed to set network "
   "variable '%s'", name);
@@ -846,6 +883,11 @@ static int wpa_supplicant_ctrl_iface_get_network(
return -1;
}

+#ifdef ANDROID_IBSS_HACK
+ if ((os_strcmp(name, "ssid") == 0) && (ssid->mode == IEEE80211_MODE_IBSS))
+ os_snprintf(buf, buflen, "\"%s%s", ANDROID_IBSS_PREFIX, value+1);
+ else
+#endif
os_snprintf(buf, buflen, "%s", value);
buf[buflen - 1] = '\0';

diff --git a/events.c b/events.c
index bb5be64..c591f30 100644
--- a/events.c
+++ b/events.c
@@ -479,9 +479,12 @@ wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s, struct wpa_ssid *group,
}

if (bss->caps & IEEE80211_CAP_IBSS) {
+//#ifdef ANDROID_IBSS_HACK // FIXME
+ if (ssid->mode != IEEE80211_MODE_IBSS) {
wpa_printf(MSG_DEBUG, "   skip - "
   "IBSS (adhoc) network");
continue;
+ }
}

selected = bss;
分享到:
评论

相关推荐

    Ad-hoc network on Android.pdf

    安卓上的Ad-hoc网络设计文档主要讲述了为安卓操作系统开发Ad-hoc网络协议层的过程,以及使用该层的文本消息应用程序的开发。文档中提到了作者Rabie Khodr Jradi和Lasse Seligmann Reedtz,以及他们来自丹麦技术大学...

    Android 平台上 Ad-Hoc 通信模式的研究与实现

    ### Android平台上Ad-Hoc通信模式的研究与实现 #### 背景与意义 随着无线宽带接入技术和移动终端技术的快速发展,人们对于随时随地便捷地获取互联网信息和服务的需求日益增强,这推动了移动互联网的兴起和发展。...

    基于ad-hoc的测距源代码

    在无线通信领域,Ad-hoc网络是一种自组织的网络架构,其中各个设备可以直接通信,无需固定基础设施。这种网络模式常用于临时组建的网络环境,如灾难救援或移动军事通信。本资源“基于ad-hoc的测距源代码”提供了一种...

    Linux_Ad-hoc_mode_set_aodv-uu.tar.gz_ad hoc_ad-hoc linux_aodv-uu

    Linux Ad-hoc模式是无线网络中的一个特殊配置,它允许设备之间直接通信,而无需通过中央访问点(如路由器)。这种模式在没有基础设施或者需要临时网络连接时特别有用,例如在野外作业、灾难救援或者移动会议等场景。...

    多信道多接口无线Ad-Hoc 网络实现方案

    无线Ad-Hoc网络是一种自组织、对等式的通信网络,其中每个节点都可以作为数据的发送者、接收者或中继者。在多信道多接口无线Ad-Hoc网络实现方案中,这种网络的效率和可靠性得到了显著提升。下面将详细讨论相关知识点...

    android ad-hoc source code

    在Android开发领域,"ad-hoc"通常指的是无线网络中的临时对等网络模式,它允许设备之间直接通信,而不需要中央路由器。在这个场景下,"android ad-hoc source code"可能是指一个针对Android 2.2(Froyo)版本实现的...

    Linux建立ad-hoc实现Wifi共享

    重启Ad-Hoc网络则通过`sudo /XXX/XXX/adhoc-radhoc.sh`命令完成,该命令将重新初始化网络设置,确保Ad-Hoc网络的稳定性和连通性。 #### 脚本详细配置参数解析: 1. **网络接口与参数**: - `ShareNet`: 主网络...

    基于ad-hoc的车联网mac协议vemac仿真

    在车联网(Vehicular Ad-hoc Networks,简称VANETs)中,MAC(Medium Access Control)协议扮演着至关重要的角色。MAC协议是通信协议的底层部分,它负责管理网络设备如何共享无线通信介质,以避免数据包碰撞。在...

    windows mobile ad-hoc tracker

    源代码包“WM-ADHOC-TRACKER Source Code”包含了实现这一功能的全部源代码。开发者可以通过研究这些代码来学习如何在Windows Mobile平台上进行网络编程,特别是如何监控AD-HOC网络。源代码通常包括C++或C#编写的...

    AD-HOC自组网路由协议.pdf

    AD-HOC网络是一种特殊的网络,拉丁语“for this purpose only”,意即某种特殊用途的网络。它的核心要点是,不依赖于已有的基础架构,如wifi AP或者基站,由通信实体自己组网通信。AD-HOC网络有许多应用场景,如军事...

    使用NS-2模拟实现无线AD-hoc网络

    wireless-3node.tcl 无线Ad hoc网络的NS-2模拟脚本 命令格式:$ ns wireless-3node.tcl statistic.sh throughput.sh throughput.awk FTP业务平均吞吐量统计脚本 命令格式:$ sh statistic.sh | sh throughput.sh cbr...

    Ad-hoc在Android手机多媒体通信开发中的应用.pdf

    【Android手机多媒体通信开发中的Ad-hoc应用】 随着信息技术的快速发展,移动电子设备在日常生活中的应用日益普及。在没有网络、信号或基站的环境中,Ad-hoc无线通信网络成为了一种创新的解决方案,它允许设备间...

    ad-hoc 共享网络脚本

    linux启用无线网卡的ad-hoc模式共享网络的脚本

    AD-hoc 自动配置脚本

    openwrt 下自动配置ad-hoc网络的脚本程序,通过修改/etc/config下的uci配置文件实现

    安卓系统补丁ad-hoc

    【安卓系统补丁ad-hoc】是针对Android操作系统的一种特殊更新方式,主要涉及到无线网络连接方面的优化和修复。在Android系统中,ad-hoc模式通常指的是设备之间直接建立的无线网络连接,而非通过传统的接入点(Access...

    安卓2.3.6~2.3.7 ad-hoc补丁

    然而,原生的Android系统在某些版本中并未完全支持ad-hoc模式,特别是对于2.3.6到2.3.7这两个版本,用户可能遇到无法创建或加入ad-hoc网络的问题。 这个补丁的出现是为了克服这一限制,使用户能够在这些特定的...

    Mobile Ad-hoc and Sensor Networks 13th International Conference 无水印原版pdf

    Mobile Ad-hoc and Sensor Networks 13th International Conference 英文无水印原版pdf 第13版 pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权...

    行业分类-设备装置-AD-HOC现金分配网络.zip

    在“行业分类-设备装置-AD-HOC现金分配网络”这一主题中,我们将深入探讨如何利用AD-HOC网络技术来实现高效、安全的现金分配流程。 首先,AD-HOC网络的核心特点是节点间的直接通信。在传统网络中,数据传输通常需要...

    Ad-hoc网络.doc

    Ad-Hoc网络是一种特殊的无线移动网络,主要用于在没有有线基础设施的情况下实现计算机之间的直接通信。这种网络结构省去了传统无线网络中的接入点(AP),使得每个网络节点都可以充当路由器,直接与其他节点进行通信...

Global site tag (gtag.js) - Google Analytics