diff options
-rw-r--r-- | dund/dund.h | 5 | ||||
-rw-r--r-- | dund/main.c | 55 | ||||
-rw-r--r-- | dund/sdp.c | 12 |
3 files changed, 54 insertions, 18 deletions
diff --git a/dund/dund.h b/dund/dund.h index 4a8af59b..92626310 100644 --- a/dund/dund.h +++ b/dund/dund.h @@ -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); diff --git a/dund/main.c b/dund/main.c index 61d3d941..51ad1db3 100644 --- a/dund/main.c +++ b/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); @@ -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; |