Commit f6baf958 authored by Lubomir Rintel's avatar Lubomir Rintel Committed by Bernd Eckenfels

Add Bluetooth socket support

Signed-off-by: default avatarBernd Eckenfels <bernd@eckenfels.net>
parent ca46fb15
...@@ -59,6 +59,7 @@ bool 'X.25 (CCITT) protocol family' HAVE_AFX25 y ...@@ -59,6 +59,7 @@ bool 'X.25 (CCITT) protocol family' HAVE_AFX25 y
bool 'Econet protocol family' HAVE_AFECONET y bool 'Econet protocol family' HAVE_AFECONET y
bool 'DECnet protocol family' HAVE_AFDECnet n bool 'DECnet protocol family' HAVE_AFDECnet n
bool 'Ash protocol family' HAVE_AFASH y bool 'Ash protocol family' HAVE_AFASH y
bool 'Bluetooth protocol family' HAVE_BLUETOOTH y
* *
* *
* Device Hardware types. * Device Hardware types.
......
...@@ -38,6 +38,7 @@ int flag_econet; ...@@ -38,6 +38,7 @@ int flag_econet;
int flag_rose; int flag_rose;
int flag_x25 = 0; int flag_x25 = 0;
int flag_ash; int flag_ash;
int flag_bluetooth;
struct aftrans_t { struct aftrans_t {
...@@ -91,6 +92,9 @@ struct aftrans_t { ...@@ -91,6 +92,9 @@ struct aftrans_t {
{ {
"ash", "ash", &flag_ash "ash", "ash", &flag_ash
}, },
{
"bluetooth", "bluetooth", &flag_bluetooth
},
{ {
0, 0, 0 0, 0, 0
} }
......
...@@ -135,6 +135,7 @@ extern int flag_x25; ...@@ -135,6 +135,7 @@ extern int flag_x25;
extern int flag_rose; extern int flag_rose;
extern int flag_inet; extern int flag_inet;
extern int flag_inet6; extern int flag_inet6;
extern int flag_bluetooth;
extern char afname[]; extern char afname[];
...@@ -150,6 +151,7 @@ extern char afname[]; ...@@ -150,6 +151,7 @@ extern char afname[];
{"ddp", 0, 0, 1}, \ {"ddp", 0, 0, 1}, \
{"rose", 0, 0, 1}, \ {"rose", 0, 0, 1}, \
{"unix", 0, 0, 1}, \ {"unix", 0, 0, 1}, \
{"bluetooth", 0, 0, 1}, \
{"tcpip", 0, 0, 1} {"tcpip", 0, 0, 1}
#define AFTRANS_CNT 12 #define AFTRANS_CNT 12
......
...@@ -53,6 +53,8 @@ ...@@ -53,6 +53,8 @@
#define _PATH_PROCNET_X25_ROUTE "/proc/net/x25_routes" #define _PATH_PROCNET_X25_ROUTE "/proc/net/x25_routes"
#define _PATH_PROCNET_DEV_MCAST "/proc/net/dev_mcast" #define _PATH_PROCNET_DEV_MCAST "/proc/net/dev_mcast"
#define _PATH_PROCNET_ATALK_ROUTE "/proc/net/atalk_route" #define _PATH_PROCNET_ATALK_ROUTE "/proc/net/atalk_route"
#define _PATH_SYS_BLUETOOTH_L2CAP "/sys/class/bluetooth/l2cap"
#define _PATH_SYS_BLUETOOTH_RFCOMM "/sys/class/bluetooth/rfcomm"
/* pathname for the netlink device */ /* pathname for the netlink device */
#define _PATH_DEV_ROUTE "/dev/route" #define _PATH_DEV_ROUTE "/dev/route"
......
...@@ -99,6 +99,10 @@ ...@@ -99,6 +99,10 @@
#include "util.h" #include "util.h"
#include "proc.h" #include "proc.h"
#if HAVE_BLUETOOTH
#include <bluetooth/bluetooth.h>
#endif
#define PROGNAME_WIDTH 20 #define PROGNAME_WIDTH 20
#if !defined(s6_addr32) && defined(in6a_words) #if !defined(s6_addr32) && defined(in6a_words)
...@@ -158,6 +162,8 @@ int flag_wide= 0; ...@@ -158,6 +162,8 @@ int flag_wide= 0;
int flag_prg = 0; int flag_prg = 0;
int flag_arg = 0; int flag_arg = 0;
int flag_ver = 0; int flag_ver = 0;
int flag_l2cap = 0;
int flag_rfcomm = 0;
FILE *procinfo; FILE *procinfo;
...@@ -1611,6 +1617,116 @@ static int ipx_info(void) ...@@ -1611,6 +1617,116 @@ static int ipx_info(void)
} }
#endif #endif
#if HAVE_BLUETOOTH
const char *bluetooth_state(int state)
{
switch (state) {
case BT_CONNECTED:
return _("CONNECTED");
case BT_OPEN:
return _("OPEN");
case BT_BOUND:
return _("BOUND");
case BT_LISTEN:
return _("LISTEN");
case BT_CONNECT:
return _("CONNECT");
case BT_CONNECT2:
return _("CONNECT2");
case BT_CONFIG:
return _("CONFIG");
case BT_DISCONN:
return _("DISCONN");
case BT_CLOSED:
return _("CLOSED");
default:
return _("UNKNOWN");
}
}
static void l2cap_do_one(int nr, const char *line, const char *prot)
{
char daddr[18], saddr[18];
unsigned state, psm, dcid, scid, imtu, omtu, sec_level;
int num;
const char *bt_state, *bt_sec_level;
num = sscanf(line, "%17s %17s %d %d 0x%04x 0x%04x %d %d %d",
daddr, saddr, &state, &psm, &dcid, &scid, &imtu, &omtu, &sec_level);
if (num < 9) {
fprintf(stderr, _("warning, got bogus l2cap line.\n"));
return;
}
if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND))
return;
if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND))
return;
bt_state = bluetooth_state(state);
switch (sec_level) {
case BT_SECURITY_SDP:
bt_sec_level = _("SDP");
break;
case BT_SECURITY_LOW:
bt_sec_level = _("LOW");
break;
case BT_SECURITY_MEDIUM:
bt_sec_level = _("MEDIUM");
break;
case BT_SECURITY_HIGH:
bt_sec_level = _("HIGH");
break;
default:
bt_sec_level = _("UNKNOWN");
}
printf("l2cap %-17s %-17s %-9s %7d 0x%04x 0x%04x %7d %7d %-7s\n",
(strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr),
(strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr),
bt_state, psm, dcid, scid, imtu, omtu, bt_sec_level);
}
static int l2cap_info(void)
{
printf("%-6s %-17s %-17s %-9s %7s %-6s %-6s %7s %7s %-7s\n",
"Proto", "Destination", "Source", "State", "PSM", "DCID", "SCID", "IMTU", "OMTU", "Security");
INFO_GUTS(_PATH_SYS_BLUETOOTH_L2CAP, "AF BLUETOOTH", l2cap_do_one, "l2cap");
}
static void rfcomm_do_one(int nr, const char *line, const char *prot)
{
char daddr[18], saddr[18];
unsigned state, channel;
int num;
const char *bt_state;
num = sscanf(line, "%17s %17s %d %d", daddr, saddr, &state, &channel);
if (num < 4) {
fprintf(stderr, _("warning, got bogus rfcomm line.\n"));
return;
}
if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND))
return;
if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND))
return;
bt_state = bluetooth_state(state);
printf("rfcomm %-17s %-17s %-9s %7d\n",
(strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr),
(strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr),
bt_state, channel);
}
static int rfcomm_info(void)
{
printf("%-6s %-17s %-17s %-9s %7s\n", "Proto", "Destination", "Source", "State", "Channel");
INFO_GUTS(_PATH_SYS_BLUETOOTH_RFCOMM, "AF BLUETOOTH", rfcomm_do_one, "rfcomm");
}
#endif
static int iface_info(void) static int iface_info(void)
{ {
if (skfd < 0) { if (skfd < 0) {
...@@ -1705,6 +1821,8 @@ int main ...@@ -1705,6 +1821,8 @@ int main
{"udplite", 0, 0, 'U'}, {"udplite", 0, 0, 'U'},
{"raw", 0, 0, 'w'}, {"raw", 0, 0, 'w'},
{"unix", 0, 0, 'x'}, {"unix", 0, 0, 'x'},
{"l2cap", 0, 0, '2'},
{"rfcomm", 0, 0, 'f'},
{"listening", 0, 0, 'l'}, {"listening", 0, 0, 'l'},
{"all", 0, 0, 'a'}, {"all", 0, 0, 'a'},
{"timers", 0, 0, 'o'}, {"timers", 0, 0, 'o'},
...@@ -1836,6 +1954,12 @@ int main ...@@ -1836,6 +1954,12 @@ int main
case 'w': case 'w':
flag_raw++; flag_raw++;
break; break;
case '2':
flag_l2cap++;
break;
case 'f':
flag_rfcomm++;
break;
case 'x': case 'x':
if (aftrans_opt("unix")) if (aftrans_opt("unix"))
exit(1); exit(1);
...@@ -1858,8 +1982,12 @@ int main ...@@ -1858,8 +1982,12 @@ int main
!(flag_inet || flag_inet6)) !(flag_inet || flag_inet6))
flag_inet = flag_inet6 = 1; flag_inet = flag_inet6 = 1;
if (flag_bluetooth && !(flag_l2cap || flag_rfcomm))
flag_l2cap = flag_rfcomm = 1;
flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx
+ flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose; + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose
+ flag_l2cap + flag_rfcomm;
if (flag_mas) { if (flag_mas) {
#if HAVE_FW_MASQUERADE && HAVE_AFINET #if HAVE_FW_MASQUERADE && HAVE_AFINET
...@@ -2084,7 +2212,40 @@ int main ...@@ -2084,7 +2212,40 @@ int main
} }
#endif #endif
} }
if (!flag_arg || flag_l2cap || flag_rfcomm) {
#if HAVE_BLUETOOTH
printf(_("Active Bluetooth connections ")); /* xxx */
if (flag_all)
printf(_("(servers and established)"));
else {
if (flag_lst)
printf(_("(only servers)"));
else
printf(_("(w/o servers)"));
}
printf("\n");
#else
if (flag_arg) {
i = 1;
ENOSUPP("netstat", "AF BLUETOOTH");
}
#endif
}
#if HAVE_BLUETOOTH
if (!flag_arg || flag_l2cap) {
i = l2cap_info();
if (i)
return (i);
}
if (!flag_arg || flag_rfcomm) {
i = rfcomm_info();
if (i)
return (i);
}
#endif
if (!flag_cnt || i) if (!flag_cnt || i)
break; break;
wait_continous(); wait_continous();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment