mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-17 01:04:40 +08:00
Add experimental mRouter support
This commit is contained in:
parent
472036c7d2
commit
4f20f27924
@ -45,7 +45,6 @@ int dun_kill_all_connections(void);
|
||||
int dun_open_connection(int sk, char *pppd, char **pppd_opts, int wait);
|
||||
|
||||
/* SDP functions */
|
||||
int dun_sdp_register(uint8_t channel);
|
||||
int dun_sdp_register(uint8_t channel, int mrouter);
|
||||
void dun_sdp_unregister(void);
|
||||
int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel);
|
||||
|
||||
int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel, int mrouter);
|
||||
|
55
dund/main.c
55
dund/main.c
@ -72,6 +72,7 @@ static int persist;
|
||||
static int use_sdp = 1;
|
||||
static int encrypt;
|
||||
static int master;
|
||||
static int mrouter;
|
||||
static int search_duration = 10;
|
||||
static uint use_cache;
|
||||
|
||||
@ -97,16 +98,32 @@ enum {
|
||||
KILL
|
||||
} modes;
|
||||
|
||||
static int create_connection(char *dst, bdaddr_t *bdaddr, int mrouter);
|
||||
|
||||
static int do_listen(void)
|
||||
{
|
||||
struct sockaddr_rc sa;
|
||||
int sk;
|
||||
|
||||
if (mrouter) {
|
||||
if (!cache.valid)
|
||||
return -1;
|
||||
|
||||
if (create_connection(cache.dst, &cache.bdaddr, mrouter) < 0) {
|
||||
syslog(LOG_ERR, "Cannot connect to mRouter device. %s(%d)",
|
||||
strerror(errno), errno);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!channel)
|
||||
channel = DUN_DEFAULT_CHANNEL;
|
||||
|
||||
if (use_sdp)
|
||||
dun_sdp_register(channel);
|
||||
dun_sdp_register(channel, mrouter);
|
||||
|
||||
if (mrouter)
|
||||
syslog(LOG_INFO, "Waiting for mRouter callback on channel %d", channel);
|
||||
|
||||
/* Create RFCOMM socket */
|
||||
sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
|
||||
@ -145,9 +162,15 @@ static int do_listen(void)
|
||||
syslog(LOG_ERR, "Fork failed. %s(%d)", strerror(errno), errno);
|
||||
default:
|
||||
close(nsk);
|
||||
if (mrouter) {
|
||||
close(sk);
|
||||
terminate = 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
close(sk);
|
||||
|
||||
if (msdun && ms_dun(nsk, 1, msdun) < 0) {
|
||||
syslog(LOG_ERR, "MSDUN failed. %s(%d)", strerror(errno), errno);
|
||||
exit(0);
|
||||
@ -178,7 +201,7 @@ static int do_listen(void)
|
||||
* 1 - non critical error
|
||||
* 0 - success
|
||||
*/
|
||||
static int create_connection(char *dst, bdaddr_t *bdaddr)
|
||||
static int create_connection(char *dst, bdaddr_t *bdaddr, int mrouter)
|
||||
{
|
||||
struct sockaddr_rc sa;
|
||||
int sk, err = 0, ch;
|
||||
@ -188,13 +211,13 @@ static int create_connection(char *dst, bdaddr_t *bdaddr)
|
||||
ch = cache.channel;
|
||||
|
||||
} else if (!channel) {
|
||||
syslog(LOG_INFO, "Searching for %s on %s", "LAP", dst);
|
||||
syslog(LOG_INFO, "Searching for %s on %s", mrouter ? "SP" : "LAP", dst);
|
||||
|
||||
if (dun_sdp_search(&src_addr, bdaddr, &ch) <= 0)
|
||||
if (dun_sdp_search(&src_addr, bdaddr, &ch, mrouter) <= 0)
|
||||
return 0;
|
||||
} else
|
||||
ch = channel;
|
||||
|
||||
|
||||
syslog(LOG_INFO, "Connecting to %s channel %d", dst, ch);
|
||||
|
||||
sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
|
||||
@ -216,6 +239,12 @@ static int create_connection(char *dst, bdaddr_t *bdaddr)
|
||||
sa.rc_bdaddr = *bdaddr;
|
||||
|
||||
if (!connect(sk, (struct sockaddr *) &sa, sizeof(sa)) ) {
|
||||
if (mrouter) {
|
||||
sleep(1);
|
||||
close(sk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
syslog(LOG_INFO, "Connection established");
|
||||
|
||||
if (msdun && ms_dun(sk, 0, msdun) < 0) {
|
||||
@ -271,7 +300,7 @@ static int do_connect(void)
|
||||
|
||||
if (cache.valid) {
|
||||
/* Use cached bdaddr */
|
||||
r = create_connection(cache.dst, &cache.bdaddr);
|
||||
r = create_connection(cache.dst, &cache.bdaddr, 0);
|
||||
if (r < 0) {
|
||||
terminate = 1;
|
||||
break;
|
||||
@ -294,7 +323,7 @@ static int do_connect(void)
|
||||
char dst[40];
|
||||
ba2str(&ii[i].bdaddr, dst);
|
||||
|
||||
r = create_connection(dst, &ii[i].bdaddr);
|
||||
r = create_connection(dst, &ii[i].bdaddr, 0);
|
||||
if (r < 0) {
|
||||
terminate = 1;
|
||||
break;
|
||||
@ -351,19 +380,21 @@ static struct option main_lopts[] = {
|
||||
{ "cache", 0, 0, 'C' },
|
||||
{ "pppd", 1, 0, 'd' },
|
||||
{ "msdun", 2, 0, 'X' },
|
||||
{ "mrouter", 1, 0, 'm' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static char main_sopts[] = "hsc:k:Kr:S:lnp::DQ::EMP:C::P:X";
|
||||
|
||||
static char main_help[] =
|
||||
"LAP (LAN Access over PPP) daemon version " VERSION " \n"
|
||||
"Bluetooth LAP (LAN Access over PPP) daemon version " VERSION " \n"
|
||||
"Usage:\n"
|
||||
"\tdund <options> [pppd options]\n"
|
||||
"Options:\n"
|
||||
"\t--show --list -l Show active LAP connections\n"
|
||||
"\t--listen -s Listen for LAP connections\n"
|
||||
"\t--connect -c <bdaddr> Create LAP connection\n"
|
||||
"\t--mrouter -m <bdaddr> Create mRouter connection\n"
|
||||
"\t--search -Q[duration] Search and connect\n"
|
||||
"\t--kill -k <bdaddr> Kill LAP connection\n"
|
||||
"\t--killall -K Kill all LAP connections\n"
|
||||
@ -467,6 +498,12 @@ int main(int argc, char **argv)
|
||||
msdun = 10;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
mode = LISTEN;
|
||||
dst = strdup(optarg);
|
||||
mrouter = 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
printf(main_help);
|
||||
@ -533,7 +570,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
openlog("dund", LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON);
|
||||
syslog(LOG_INFO, "Bluetooth DUN daemon");
|
||||
syslog(LOG_INFO, "Bluetooth DUN daemon version %s", VERSION);
|
||||
|
||||
if (src) {
|
||||
src_dev = hci_devid(src);
|
||||
|
12
dund/sdp.c
12
dund/sdp.c
@ -55,7 +55,7 @@ void dun_sdp_unregister(void)
|
||||
sdp_close(session);
|
||||
}
|
||||
|
||||
int dun_sdp_register(uint8_t channel)
|
||||
int dun_sdp_register(uint8_t channel, int mrouter)
|
||||
{
|
||||
sdp_list_t *svclass, *pfseq, *apseq, *root, *aproto;
|
||||
uuid_t root_uuid, l2cap, rfcomm, dun;
|
||||
@ -92,16 +92,16 @@ int dun_sdp_register(uint8_t channel)
|
||||
aproto = sdp_list_append(NULL, apseq);
|
||||
sdp_set_access_protos(record, aproto);
|
||||
|
||||
sdp_uuid16_create(&dun, LAN_ACCESS_SVCLASS_ID);
|
||||
sdp_uuid16_create(&dun, mrouter ? SERIAL_PORT_SVCLASS_ID : LAN_ACCESS_SVCLASS_ID);
|
||||
svclass = sdp_list_append(NULL, &dun);
|
||||
sdp_set_service_classes(record, svclass);
|
||||
|
||||
sdp_uuid16_create(&profile[0].uuid, LAN_ACCESS_PROFILE_ID);
|
||||
sdp_uuid16_create(&profile[0].uuid, mrouter ? SERIAL_PORT_PROFILE_ID : LAN_ACCESS_PROFILE_ID);
|
||||
profile[0].version = 0x0100;
|
||||
pfseq = sdp_list_append(NULL, &profile[0]);
|
||||
sdp_set_profile_descs(record, pfseq);
|
||||
|
||||
sdp_set_info_attr(record, "LAN Access Point", NULL, NULL);
|
||||
sdp_set_info_attr(record, mrouter ? "mRouter" : "LAN Access Point", NULL, NULL);
|
||||
|
||||
status = sdp_record_register(session, record, 0);
|
||||
if (status) {
|
||||
@ -112,7 +112,7 @@ int dun_sdp_register(uint8_t channel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel)
|
||||
int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel, int mrouter)
|
||||
{
|
||||
sdp_session_t *s;
|
||||
sdp_list_t *srch, *attrs, *rsp;
|
||||
@ -127,7 +127,7 @@ int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel)
|
||||
return -1;
|
||||
}
|
||||
|
||||
sdp_uuid16_create(&svclass, LAN_ACCESS_SVCLASS_ID);
|
||||
sdp_uuid16_create(&svclass, mrouter ? SERIAL_PORT_SVCLASS_ID : LAN_ACCESS_SVCLASS_ID);
|
||||
srch = sdp_list_append(NULL, &svclass);
|
||||
|
||||
attr = SDP_ATTR_PROTO_DESC_LIST;
|
||||
|
Loading…
Reference in New Issue
Block a user