00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <include.h>
00032 #include <src/hermes.h>
00033 #include <src/crt_io.h>
00034
00035 static char *ID = "$Id: hermes.c,v 1.3 2005/02/23 11:36:53 poggij Exp $";
00036
00037
00038 extern UINT8 SingleChannel;
00039 extern UINT8 TypeOfCard;
00040 extern p80211_caphdr_t wlan_header;
00041
00042 static CaptureArg ca;
00043 static char errbuf[PCAP_ERRBUF_SIZE];
00044 static UINT8 wlan_payload[MAX_BUFFER_SIZE];
00045
00046
00047 int selectChannelHERMES(char *devname, int channel)
00048 {
00049 char str[80];
00050 int result = 0;
00051
00052 sprintf(str, "iwpriv %s monitor 1 %d 2>/dev/null 1>/dev/null", devname,
00053 channel);
00054
00055 result += system(str);
00056
00057
00058
00059
00060 return 0;
00061 }
00062
00063 int shutCardHERMES(char *devname)
00064 {
00065 char str[80];
00066 int result = 0;
00067
00068
00069 sprintf(str, "iwconfig %s mode managed", devname);
00070 debug(3, "%s\n", str);
00071 result += system(str);
00072 sprintf(str, "ifconfig %s -promisc down", devname);
00073 debug(3, "%s\n", str);
00074 result += system(str);
00075 sprintf(str, "iwpriv %s monitor 0 1", devname);
00076 debug(3, "%s\n", str);
00077 result += system(str);
00078
00079 return result;
00080 }
00081
00082 int openCardHERMES(char *devname)
00083 {
00084 char str[80];
00085 int result = 0;
00086
00087
00088 sprintf(str, "ifconfig %s promisc up 0", devname);
00089 debug(3, "%s\n", str);
00090 result += system(str);
00091 sprintf(str, "iwconfig %s essid \"\"", devname);
00092 debug(3, "%s\n", str);
00093 result += system(str);
00094 sprintf(str, "iwpriv %s monitor 1 1", devname);
00095 debug(3, "%s\n", str);
00096 result += system(str);
00097
00098 return result;
00099 }
00100
00101
00102
00103 int getPacketHERMES(unsigned char *buf, int maxlen)
00104 {
00105 struct pcap_pkthdr pktHdr;
00106 u_char *ret;
00107 fd_set rs;
00108 p80211msg_lnxind_wlansniffrm_t *Sniff_Frame;
00109
00110 FD_ZERO(&rs);
00111 FD_SET(0, &rs);
00112
00113 ret = (u_char *) pcap_next(ca.pcap, &pktHdr);
00114
00115 if ((ret)
00116 && (pktHdr.len >= sizeof(p80211msg_lnxind_wlansniffrm_t))) {
00117 if (memcpy_buff(buf, ret, pktHdr.len) == NULL)
00118 return 0;
00119 Sniff_Frame = (p80211msg_lnxind_wlansniffrm_t *) buf;
00120
00121 wlan_header.version = 0;
00122 wlan_header.length = 0;
00123 wlan_header.mactime = Sniff_Frame->mactime.data;
00124 wlan_header.hosttime = Sniff_Frame->hosttime.data;
00125 wlan_header.phytype = phytype_dsss_dot11_b;
00126 wlan_header.channel = Sniff_Frame->channel.data;
00127 wlan_header.datarate = Sniff_Frame->rate.data * 5;
00128 wlan_header.antenna = 0;
00129 wlan_header.priority = 0;
00130 wlan_header.ssi_type = 0;
00131 wlan_header.ssi_signal = Sniff_Frame->signal.data;
00132 wlan_header.ssi_noise = Sniff_Frame->noise.data;
00133 wlan_header.preamble = 0;
00134 wlan_header.encoding = 0;
00135
00136 if (memcpy_buff(wlan_payload,
00137 &buf[sizeof(p80211msg_lnxind_wlansniffrm_t)],
00138 pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00139 NULL)
00140 return 0;
00141 if (memcpy_buff(buf, wlan_payload,
00142 maxlen - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00143 NULL)
00144 return 0;
00145
00146 if (pktHdr.len <= sizeof(p80211msg_lnxind_wlansniffrm_t))
00147
00148 return 0;
00149 else
00150 return (pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t));
00151 } else {
00152 return (0);
00153 }
00154 }
00155
00156 int openPacketHERMES(char *devname)
00157 {
00158 int DataLink;
00159
00160 ca.pcap = pcap_open_live(devname, 3000, 1, 0, errbuf);
00161 if (ca.pcap) {
00162 pcap_setnonblock(ca.pcap, 1, errbuf);
00163 DataLink = pcap_datalink(ca.pcap);
00164 switch (DataLink) {
00165 case DLT_PRISM_HEADER:
00166 debug(3,
00167 "pcap_datalink(ca.pcap) = %d = DLT_PRISM_HEADER\n", DataLink);
00168 ca.offset = 144;
00169 break;
00170 case DLT_IEEE802_11:
00171 debug(3, "pcap_datalink(ca.pcap) = %d = DLT_IEEE802_11\n", DataLink);
00172 ca.offset = 0;
00173 break;
00174 case DLT_AIRONET_HEADER:
00175 debug(3,
00176 "pcap_datalink(ca.pcap) = %d = DLT_AIRONET_HEADER:\n",
00177 DataLink);
00178 ca.offset = 0;
00179 break;
00180 default:
00181 debug(3, "pcap_datalink(ca.pcap) = %d = COOKED:\n", DataLink);
00182 ca.offset = 160;
00183 }
00184 return 1;
00185 }
00186 return -1;
00187 }
00188
00189 void closePacketHERMES(void)
00190 {
00191 pcap_close(ca.pcap);
00192 }