void p2p_enable(struct p2p *p) { if(p->enable == -1 ) { if(p->wpa_open == 1){ p->wpa_open = 0; system("killall wpa_supplicant"); #ifdef DHCP system("killall dhclient"); #endif } if(p->ap_open ==1){ p->ap_open = 0; system("killall hostapd"); #ifdef DHCP system("killall dhcpd"); #endif } memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set enable=0", p->ifname); system( p->cmd ); return; } p->p2p_get=0; memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set enable=%d", p->ifname, p->enable); system( p->cmd ); if( p->enable == P2P_ROLE_DISABLE ) { p->have_p2p_dev = 0; p->wps_info = 0; p->pin = 12345670; if(p->res == 0) { p->res = 1; } if(p->res_go == 0) { p->res_go = 1; } p->wpa_open = 0; system("killall wpa_supplicant"); #ifdef DHCP system("killall dhclient"); #endif system("clear"); p->ap_open = 0; system("killall hostapd"); #ifdef DHCP system("killall dhcpd"); #endif system("clear"); } else if( p->enable == P2P_ROLE_DEVICE ) { char msg[5] = "NULL"; #ifdef P2P_AUTO p->res = pthread_create(&p->pthread, NULL, &polling_status, (void *)p); #endif if( p->res !=0 ) { p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Thread creation failed" ); } if(p->wpa_open == 1){ p->wpa_open = 0; system("killall wpa_supplicant"); #ifdef DHCP system("killall dhclient"); #endif } if(p->ap_open ==1){ p->ap_open = 0; system("killall hostapd"); #ifdef DHCP system("killall dhcpd"); #endif } p->intent = 1; p2p_intent(p); p2p_set_opch(p, NULL, 0); usleep(50000); p2p_softap_ssid(p, NULL, 0); p2p_setDN(p); p2p_scan( p ); } else if( p->enable == P2P_ROLE_CLIENT ) { if(p->ap_open ==1){ p->ap_open = 0; system("killall hostapd"); #ifdef DHCP system("killall dhcpd"); #endif } p2p_status(p, 0); p2p_role(p, 0); p2p_intent(p); } else if( p->enable == P2P_ROLE_GO ) { if(p->wpa_open == 1){ p->wpa_open = 0; system("killall wpa_supplicant"); #ifdef DHCP system("killall dhclient"); #endif } p2p_status(p, 0); p2p_role(p, 0); p2p_intent(p); p2p_set_opch(p, NULL, 0); usleep(50000); p2p_softap_ssid(p, NULL, 0); if(p->ap_open != 1) { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s -B %s > temp.txt",p->ap_path, p->ap_conf); system( p->cmd ); p->ap_open = 1; } #ifdef P2P_AUTO p->res_go = pthread_create(&p->pthread_go, NULL, &polling_client, (void *)p); #endif if( p->res_go != 0 ) { p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Thread creation failed" ); } } }
//int main() int main(int argc, char **argv) { char peerifa[40] = { 0x00 }; char scan[CMD_SZ]; struct p2p p2pstruct; struct p2p *p=NULL; if ( argc != 2 ) { printf( "usage: %s <ifname>\n", argv[0] ); return 1; } p = &p2pstruct; if( p != NULL) { memset(p, 0x00, sizeof(struct p2p)); init_p2p(p); } strcpy(p->ifname, argv[1] ); /* Disable P2P functionalities at first*/ p->enable=P2P_ROLE_DISABLE; p2p_enable(p); p2p_get_hostapd_conf(p); usleep(50000); rename_intf(p); //do //{ /* Enable P2P (option e) */ printf("Enable P2P\n"); p->enable = P2P_ROLE_DEVICE; p2p_enable(p); p->show_scan_result=1; /* Set Intent 1 (option i) */ printf("Set Intent 1\n"); p->intent = 15; p2p_intent(p); /* Scan Wi-Fi Direct Devices (option a) */ //printf("Scaning for Wi-Fi Direct Devices\n"); //p2p_scan(p); /* Set Peer Device Address (option m) */ printf("Set Peer Device Address\n"); p2p_devaddr(p); /* Provision Discovery (option p) */ printf("Provision Discovery\n"); char msg[CMD_SZ]; memset( msg, 0x00, CMD_SZ ); char dis_msg[CMD_SZ]; memset( dis_msg, 0x00, CMD_SZ ); char label_msg[CMD_SZ]; memset( label_msg, 0x00, CMD_SZ ); if(strncmp(p->peer_devaddr, "00:00:00:00:00:00", 17) == 0) { strcpy( msg, "Please insert peer P2P device at first" ); p2p_prov_disc_no_addr(p, msg); p->show_scan_result = 1; } else { strcpy( msg, "Please insert WPS configuration method ;[0]display, [1]keypad, [2]pbc, [3]label:\n" ); strcpy( dis_msg, "Please insert PIN code displays on peer device screen:" ); strcpy( label_msg, "Please insert PIN code displays on peer label:" ); p2p_prov_disc(p, msg, dis_msg, label_msg); } // ui_screen(p); // printf("*insert cmd:"); // memset( scan, 0x00, CMD_SZ ); // scanf("%s", scan); // if( p->thread_trigger == THREAD_NONE ) //Active mode for user interface // { // if( strncmp(scan, "e", 1) == 0 ) //Enable // { // p->show_scan_result = 1; // ui_screen(p); // printf("Please insert enable mode;[0]Disable, [1]Device, [2]Client, [3]GO:"); // scanf("%d",&p->enable); // p2p_enable(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "a", 1) == 0 ) // Scan P2P device // { // p2p_scan(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "d", 1) == 0 ) // Set device name // { // p->p2p_get = 0; // printf("Please insert device name :"); // scanf("\n%[^\n]", p->dev_name); // p2p_setDN(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "i", 1) == 0 ) // Intent // { // p->show_scan_result = 1; // ui_screen(p); // printf("Please insert intent from [0~15(must be softap)] :"); // scanf("%d",&p->intent); // p2p_intent(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "w", 1) == 0 ) // WPS_info // { // p->show_scan_result = 1; // ui_screen(p); // printf("Please insert WPS method\n"); // printf("[0]None, [1]Peer Display PIN, [2]Self Display Pin, [3]PBC :"); // scanf("%d",&p->wps_info); // p2p_wpsinfo(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "c", 1) == 0 ) // PIN_code // { // char ins_no[CMD_SZ], ins_no_again[CMD_SZ]; // memset(ins_no, 0x00, CMD_SZ); // strcpy(ins_no, "Please insert 8-digit number, eg:12345670 :" ); // memset(ins_no_again, 0x00, CMD_SZ); // strcpy(ins_no_again, "Invalid number, insert again, eg:12345670 :" ); // p2p_pincode(p, ins_no, ins_no_again); // p->show_scan_result = 1; // } // else if( strncmp(scan, "m", 1) == 0 ) // Set peer device address // { // p->show_scan_result = 1; // ui_screen(p); // printf("Please insert number in scan list:"); // p2p_devaddr(p); // p->show_scan_result = 1; // } // else if( strncmp(scan, "r", 1) == 0 ) // Get role // { // p2p_role(p,1); // p->show_scan_result = 1; // } // else if( strncmp(scan, "s", 1) == 0 ) // Get status // { // p2p_status(p, 1); // p->show_scan_result = 1; // } // else if( strncmp(scan, "p", 1) == 0 ) // Provision discovery // { // char msg[CMD_SZ]; // memset( msg, 0x00, CMD_SZ ); // char dis_msg[CMD_SZ]; // memset( dis_msg, 0x00, CMD_SZ ); // char label_msg[CMD_SZ]; // memset( label_msg, 0x00, CMD_SZ ); // if(strncmp(p->peer_devaddr, "00:00:00:00:00:00", 17) == 0) // { // strcpy( msg, "Please insert peer P2P device at first" ); // p2p_prov_disc_no_addr(p, msg); // p->show_scan_result = 1; // } // else // { // strcpy( msg, "Please insert WPS configuration method ;[0]display, [1]keypad, [2]pbc, [3]label:\n" ); // strcpy( dis_msg, "Please insert PIN code displays on peer device screen:" ); // strcpy( label_msg, "Please insert PIN code displays on peer label:" ); // p2p_prov_disc(p, msg, dis_msg, label_msg); // } // } // else if( strncmp(scan, "n", 1) == 0 ) // Set negotiation // { // p2p_set_nego(p); // } // else if( strncmp(scan, "f", 1) == 0 ) // Reflash current state // { // p->show_scan_result = 1; // p2p_status(p, 0); // p2p_role(p, 0); // p2p_ifaddr(p); // if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ ) // { // char peer_devaddr[18]; // char peer_req_cm[4]; // memset( peer_devaddr, 0x00, 18); // memset( peer_req_cm, 0x00, 4); // p2p_peer_devaddr(p, peer_devaddr); // p2p_peer_req_cm(p, peer_req_cm); // p2p_peer_info(p, p->peer_devaddr, peer_req_cm); // } // #ifndef P2P_AUTO // else // { // if( p->role == P2P_ROLE_CLIENT ) // { // p2p_client_mode(p); // } // else if( p->role == P2P_ROLE_GO ) // { // p2p_go_mode(p); // } // } // #endif //P2P_AUTO // } // else if( strncmp(scan, "x", 1) == 0 ) // Start wpa_supplicant/hostapd // { // if( p->role == P2P_ROLE_CLIENT ) // { // p2p_client_mode(p); // } // else if( p->role == P2P_ROLE_GO ) // { // p2p_go_mode(p); // } // } // else if( strncmp(scan, "h", 1) == 0 ) // Set operation channel // { // char msg[CMD_SZ]; // memset( msg, 0x00, CMD_SZ ); // strcpy( msg, "Please insert desired operation channel:" ); // p2p_set_opch(p, msg, 1); // p->show_scan_result = 1; // } // else if( strncmp(scan, "t", 1) == 0 ) // Set SoftAP ssid // { // char msg[CMD_SZ]; // memset( msg, 0x00, CMD_SZ ); // strcpy( msg, "Please insert desired SoftAP ssid:" ); // p2p_softap_ssid(p, msg, 1); // p->show_scan_result = 1; // } // else if( strncmp(scan, "l", 1) == 0 ) // Set Listen channel // { // char msg[CMD_SZ]; // memset( msg, 0x00, CMD_SZ ); // strcpy( msg, "Please insert desired Listen channel, only ch.1.6.11 are available:" ); // p2p_listen_ch(p, msg); // p->show_scan_result = 1; // } // else if( strncmp(scan, "q", 1) == 0 ) // Quit // { // if( p->res == 0 ) // p->res = 1; // if( p->res_go == 0 ) // p->res_go = 1; // break; // } // else // Insert wrong commamd // { // p->p2p_get=1; // p->show_scan_result = 1; // memset( p->print_line, 0x00, CMD_SZ ); // sprintf( p->print_line, " BAD argument"); // } // } // else if( p->thread_trigger == THREAD_DEVICE ) //Passive mode for user interface // { // p->thread_trigger = THREAD_NONE ; // if( strncmp(scan, "b", 1) == 0 ) // { // p->wps_info=3; // p2p_wpsinfo(p); // p2p_status(p, 0); // if(p->status != P2P_STATE_GONEGO_OK) // { // p2p_set_nego(p); // } // else // { // p2p_role(p,0); // if( p->role == P2P_ROLE_CLIENT ) // { // p2p_client_mode(p); // } // else if( p->role == P2P_ROLE_GO ) // { // p2p_go_mode(p); // } // } // } // else if( strncmp(scan, "c", 1) == 0 ) // { // p->wps_info=2; // p2p_wpsinfo(p); // p2p_status(p, 0); // if(p->status != P2P_STATE_GONEGO_OK) // { // p2p_set_nego(p); // } // else // { // p2p_role(p,0); // p2p_ifaddr(p); // if( p->role == P2P_ROLE_CLIENT ) // { // p2p_client_mode(p); // } // else if( p->role == P2P_ROLE_GO ) // { // p2p_go_mode(p); // } // } // } // else if( ('0' <= *scan ) && ( *scan <= '9') ) // { // printf("In passive pin code\n"); // p->pin = atoi(scan); // p->wps_info=1; // p2p_wpsinfo(p); // p2p_set_nego(p); // } // } // else if( p->thread_trigger == THREAD_GO ) //Passive mode for user interface // { // p->thread_trigger = THREAD_NONE ; // if( strncmp(scan, "b", 1) == 0 ) // { // p->wps_info=3; // p2p_wpsinfo(p); // } // else if( strncmp(scan, "c", 1) == 0 ) // { // p->wps_info=2; // p2p_wpsinfo(p); // } // else if( ('0' <= *scan ) && ( *scan <= '9') ) // { // printf("In passive pin code\n"); // p->pin = atoi(scan); // p->wps_info=1; // p2p_wpsinfo(p); // } // p2p_go_mode(p); // } do { } while( 1 ); /* Disable P2P functionalities when exits*/ p->enable= -1 ; p2p_enable(p); system( "rm -f ./supp_status.txt" ); system( "rm -f ./temp.txt" ); system( "rm -f ./scan.txt" ); system( "rm -f ./peer.txt" ); system( "rm -f ./status.txt" ); system( "rm -f ./cm.txt" ); return 0; }