2016-10-12 15 views
3

wifi/ioctl을 사용하여 wifi 카드를 처리하는 코드를 작성하기 시작했습니다.이 코드는 부적절하며 대부분의 응용 프로그램에서 nl80211을 사용합니다. 소스 코드를 읽기 시작했지만 아무 문서도없고 코드가 약간 복잡합니다. 스캔, 끄기/끄기, nl80211 또는 libnl을 사용하여 카드 모드를 설정하는 것과 같은 간단한 작업을 수행하려면 어떻게해야합니까? 이것은 내가 IW 시작 무엇 :libnl/nl80211 equivalent of iw_set_ext

void set_card_mode(MODE mode, std::string ifname) 
{ 
    int skfd = iw_sockets_open(); 
    struct iwreq wrq; 
    wrq.u.mode = static_cast<unsigned int>(mode); 
    power_interface(ifname, false); 
    if(iw_set_ext(skfd, ifname.c_str(), SIOCSIWMODE, &wrq) < 0) 
     throw std::runtime_error("Can set card mode"); 
} 


MODE get_card_mode(std::string ifname) 
{ 
    int skfd = iw_sockets_open(); 
    struct iwreq wrq; 
    if (iw_get_ext (skfd, ifname.c_str(), SIOCGIWMODE, &wrq) >= 0) 
    { 
     return static_cast<MODE>(wrq.u.mode); 
    } 
} 

는 설정/무선 랜 인터페이스 또는 "set_mode"또는 "POWER_OFF"같은 간단한 기능을 가진 어떤 API를 얻을 수 iw_get_ext의 동등한이 있습니까?

답변

1

I는 다음 단계

  1. 넷 링크를 이용하여 스캔을 준비하고 NL80211_CMD_TRIGGER_SCAN
  2. 실행 준비하고 콜백 등록 NL80211_CMD_GET_SCAN 함께

    NL80211_CMD_GET_SCAN

    을 실행한다. 콜백에서 원시 데이터는 BSS로 구문 분석됩니다. IE는 구문 분석됩니다. nl80211.h에서 NL80211_BSS_MAX, NL80211_ATTR_MAX로 enum을 참조하십시오.

다음 단계를 처리하기 전에 모든 netlink 호출의 반환 값을 확인하십시오.

코드 조각 :와

nl_sock* socket = nl_socket_alloc(); 
genl_connect(socket); 
struct nl_msg* msg = nlmsg_alloc(); 
int driverId = genl_ctrl_resolve(socket, "nl80211"); 
genlmsg_put(msg, 0, 0, driverId, 0, 0, NL80211_CMD_TRIGGER_SCAN, 0); 

및 가져 오기 : 스캔 결과의 대부분은 내가 NL80211_BSS_INFORMATION_ELEMENTS에서 발견 한

struct genlmsghdr* msgHeader = (genlmsghdr*)nlmsg_data(nlmsg_hdr(msg)); 
struct nlattr* attributes[NL80211_ATTR_MAX + 1]; 
struct nlattr* bss[NL80211_BSS_MAX + 1]; 
if(nla_parse(attributes, NL80211_ATTR_MAX, genlmsg_attrdata(msgHeader, 0), genlmsg_attrlen(msgHeader, 0), NULL) == 0) 
{ 
    // Read the attributes 
    // and check for NL80211_ATTR_BSS != 0 
} 

:

genlmsg_put(msg, 0, 0, driverId, 0, NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0); 
nl_socket_modify_cb(socket, NL_CB_VALID, NL_CB_CUSTOM, onScanResult, null); 

내 콜백을 시작합니다.

if (nla_parse_nested(bss, NL80211_BSS_MAX, attributes[NL80211_ATTR_BSS], bss_policy) == 0) 
{ /* read the bss attributes */ } 

nl80211.h

에서 NL80211_BSS_INFORMATION_ELEMENTS를 참조하지만 WEP의 개인 정보를 확인하지 못했습니다. ID 48 (IEEE Std 802.11 2012, 장 8.4.2, 무료 다운로드 양식 ieee 쪽)이있는 추가 IE 요소가 있기 때문에 WPA 또는 WPA2를 확인하는 것이 쉽습니다

+0

무엇을 설명 할 수 있습니까? ? – Mateusz