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
00032 #include <include.h>
00033 #include <src/prism54g.h>
00034 #include <src/wlan-ng.h>
00035 #include <src/crt_io.h>
00036
00037 static char *ID = "$Id: prism54g.c,v 1.2 2005/02/23 11:36:53 poggij Exp $";
00038
00039
00040
00041
00042
00043 extern ConfigStruct config;
00044 extern p80211_caphdr_t wlan_header;
00045
00046 static CaptureArg ca;
00047 static char errbuf[PCAP_ERRBUF_SIZE];
00048
00049
00050 int selectChannelPRISM54g(char *devname, int channel)
00051 {
00052 #define STR_MAX 80
00053 char str[STR_MAX];
00054 int result = 0;
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 snprintf(str, STR_MAX, "iwconfig %s channel %d 2>/dev/null",
00066 devname, channel);
00067 debug(3, "%s\n", str);
00068 result += system(str);
00069 return 0;
00070 return result;
00071 }
00072
00073 int shutCardPRISM54g(char *devname)
00074 {
00075 #define STR_MAX 80
00076 char str[STR_MAX];
00077 int result = 0;
00078
00079
00080 snprintf(str, STR_MAX, "iwconfig %s mode managed", devname);
00081 debug(3, "%s\n", str);
00082 result += system(str);
00083
00084 snprintf(str, STR_MAX, "ifconfig %s -promisc up", devname);
00085 debug(3, "%s\n", str);
00086 result += system(str);
00087
00088 return result;
00089 }
00090
00091 int openCardPRISM54g(char *devname)
00092 {
00093 char str[STR_MAX];
00094 int result = 0;
00095
00096
00097 snprintf(str, STR_MAX, "iwconfig %s mode monitor", devname);
00098 debug(3, "%s\n", str);
00099 result += system(str);
00100 snprintf(str, STR_MAX, "ifconfig %s promisc up", devname);
00101 debug(3, "%s\n", str);
00102 result += system(str);
00103
00104 return result;
00105 }
00106
00107
00108
00109 int getPacketPRISM54g(unsigned char *buf, int maxlen)
00110 {
00111 struct pcap_pkthdr pktHdr;
00112 u_char *ret;
00113 fd_set rs;
00114
00115 FD_ZERO(&rs);
00116 FD_SET(0, &rs);
00117
00118 ret = (u_char *) pcap_next(ca.pcap, &pktHdr);
00119
00120 if ((ret) && (pktHdr.len >= 1)) {
00121 if (memcpy_buff(buf, ret, pktHdr.len) == NULL)
00122 return 0;
00123
00124
00125 wlan_header.version = 0;
00126 wlan_header.length = 0;
00127 wlan_header.mactime = 0;
00128 wlan_header.hosttime = 0;
00129 wlan_header.phytype = 0;
00130 wlan_header.channel = 0;
00131 wlan_header.datarate = 0;
00132 wlan_header.antenna = 0;
00133 wlan_header.priority = 0;
00134 wlan_header.ssi_type = 0;
00135 wlan_header.ssi_signal = 0;
00136 wlan_header.ssi_noise = 0;
00137 wlan_header.preamble = 0;
00138 wlan_header.encoding = 0;
00139
00140 return pktHdr.len;
00141 } else {
00142 return (0);
00143 }
00144 }
00145
00146 int openPacketPRISM54g(char *devname)
00147 {
00148 int DataLink;
00149
00150 ca.pcap = pcap_open_live(devname, 3000, 1, 0, errbuf);
00151 if (ca.pcap) {
00152 pcap_setnonblock(ca.pcap, 1, errbuf);
00153 DataLink = pcap_datalink(ca.pcap);
00154 switch (DataLink) {
00155 case DLT_PRISM_HEADER:
00156 debug(2,
00157 "pcap_datalink(ca.pcap) = %d = DLT_PRISM_HEADER\n", DataLink);
00158 ca.offset = 0x90;
00159 break;
00160 case DLT_IEEE802_11:
00161 debug(2, "pcap_datalink(ca.pcap) = %d = DLT_IEEE802_11\n", DataLink);
00162 ca.offset = 0;
00163 break;
00164 case DLT_AIRONET_HEADER:
00165 debug(2,
00166 "pcap_datalink(ca.pcap) = %d = DLT_AIRONET_HEADER:\n",
00167 DataLink);
00168 ca.offset = 0;
00169 break;
00170 default:
00171 debug(2, "pcap_datalink(ca.pcap) = %d = COOKED:\n", DataLink);
00172 ca.offset = 160;
00173 }
00174 return 1;
00175 }
00176 return -1;
00177 }
00178
00179 void closePacketPRISM54g(void)
00180 {
00181 pcap_close(ca.pcap);
00182 }