BridgeUnix.c 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701
  1. // SoftEther VPN Source Code - Developer Edition Master Branch
  2. // Cedar Communication Module
  3. // BridgeUnix.c
  4. // Ethernet Bridge Program (for UNIX)
  5. #ifdef OS_UNIX
  6. #include "BridgeUnix.h"
  7. #include "Server.h"
  8. #include "VLanUnix.h"
  9. #include "Mayaqua/Cfg.h"
  10. #include "Mayaqua/FileIO.h"
  11. #include "Mayaqua/Memory.h"
  12. #include "Mayaqua/Object.h"
  13. #include "Mayaqua/Str.h"
  14. #include "Mayaqua/TcpIp.h"
  15. #include "Mayaqua/Unix.h"
  16. #include <string.h>
  17. #include <errno.h>
  18. #include <fcntl.h>
  19. #include <net/ethernet.h>
  20. #include <net/if.h>
  21. #include <sys/ioctl.h>
  22. #include <sys/stat.h>
  23. #ifdef UNIX_SOLARIS
  24. #include <sys/sockio.h>
  25. #endif
  26. #ifdef BRIDGE_PCAP
  27. #include <pcap.h>
  28. #endif
  29. #ifdef BRIDGE_BPF
  30. #include <ifaddrs.h>
  31. #include <net/bpf.h>
  32. #include <net/if_types.h>
  33. #include <net/if_dl.h>
  34. #endif
  35. #ifdef UNIX_LINUX
  36. #include <linux/if_packet.h>
  37. struct my_tpacket_auxdata
  38. {
  39. UINT tp_status;
  40. UINT tp_len;
  41. UINT tp_snaplen;
  42. USHORT tp_mac;
  43. USHORT tp_net;
  44. USHORT tp_vlan_tci;
  45. USHORT tp_vlan_tpid;
  46. };
  47. #define MY_TP_STATUS_VLAN_VALID (1 << 4)
  48. #define MY_TP_STATUS_VLAN_TPID_VALID (1 << 6)
  49. #define MY_PACKET_AUXDATA 8
  50. #endif // UNIX_LINUX
  51. static LIST *eth_offload_list = NULL;
  52. // Initialize
  53. void InitEth()
  54. {
  55. eth_offload_list = NewList(NULL);
  56. }
  57. // Free
  58. void FreeEth()
  59. {
  60. if (eth_offload_list != NULL)
  61. {
  62. FreeStrList(eth_offload_list);
  63. eth_offload_list = NULL;
  64. }
  65. }
  66. // Check whether interface description string of Ethernet device can be retrieved in this system
  67. bool EthIsInterfaceDescriptionSupportedUnix()
  68. {
  69. bool ret = false;
  70. DIRLIST *d = EnumDir("/etc/sysconfig/networking/devices/");
  71. if (d == NULL)
  72. {
  73. return false;
  74. }
  75. if (d->NumFiles >= 1)
  76. {
  77. ret = true;
  78. }
  79. FreeDir(d);
  80. return ret;
  81. }
  82. // Get interface description string
  83. bool EthGetInterfaceDescriptionUnix(char *name, char *str, UINT size)
  84. {
  85. char tmp[MAX_SIZE];
  86. bool ret = false;
  87. BUF *b;
  88. // Validate arguments
  89. if (name == NULL || str == NULL)
  90. {
  91. return false;
  92. }
  93. StrCpy(str, size, name);
  94. Format(tmp, sizeof(tmp), "/etc/sysconfig/networking/devices/ifcfg-%s", name);
  95. b = ReadDump(tmp);
  96. if (b != NULL)
  97. {
  98. char *line = CfgReadNextLine(b);
  99. if (IsEmptyStr(line) == false)
  100. {
  101. if (StartWith(line, "#"))
  102. {
  103. char tmp[MAX_SIZE];
  104. StrCpy(tmp, sizeof(tmp), line + 1);
  105. Trim(tmp);
  106. tmp[60] = 0;
  107. StrCpy(str, size, tmp);
  108. ret = true;
  109. }
  110. }
  111. Free(line);
  112. FreeBuf(b);
  113. }
  114. return ret;
  115. }
  116. // Open raw socket
  117. int UnixEthOpenRawSocket()
  118. {
  119. #ifdef UNIX_LINUX
  120. int s;
  121. s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  122. if (s < 0)
  123. {
  124. return INVALID_SOCKET;
  125. }
  126. else
  127. {
  128. return s;
  129. }
  130. #else // UNIX_LINUX
  131. return -1;
  132. #endif // UNIX_LINUX
  133. }
  134. // Is Ethernet device control supported?
  135. bool IsEthSupported()
  136. {
  137. #if defined(UNIX_LINUX)
  138. return IsEthSupportedLinux();
  139. #elif defined(UNIX_BSD)
  140. return true;
  141. #elif defined(UNIX_SOLARIS)
  142. return IsEthSupportedSolaris();
  143. #else
  144. return false;
  145. #endif
  146. }
  147. #ifdef UNIX_LINUX
  148. bool IsEthSupportedLinux()
  149. {
  150. int s;
  151. // Try to open a raw socket
  152. s = UnixEthOpenRawSocket();
  153. if (s == INVALID_SOCKET)
  154. {
  155. // fail
  156. return false;
  157. }
  158. // success
  159. closesocket(s);
  160. return true;
  161. }
  162. #endif // UNIX_LINUX
  163. #ifdef UNIX_SOLARIS
  164. bool IsEthSupportedSolaris()
  165. {
  166. return true;
  167. }
  168. #endif // UNIX_SOLARIS
  169. #ifdef UNIX_SOLARIS
  170. // Get Ethernet device list on Solaris
  171. TOKEN_LIST *GetEthListSolaris()
  172. {
  173. TOKEN_LIST *t;
  174. int i, s;
  175. LIST *o;
  176. o = NewListFast(CompareStr);
  177. s = socket(AF_INET, SOCK_DGRAM, 0);
  178. if (s != INVALID_SOCKET)
  179. {
  180. struct lifnum lifn;
  181. lifn.lifn_family = AF_INET;
  182. lifn.lifn_flags = 0;
  183. if (ioctl(s, SIOCGLIFNUM, (char *)&lifn) >= 0)
  184. {
  185. struct lifconf lifc;
  186. struct lifreq *buf;
  187. UINT numifs;
  188. UINT bufsize;
  189. numifs = lifn.lifn_count;
  190. Debug("NumIFs:%d\n",numifs);
  191. bufsize = numifs * sizeof(struct lifreq);
  192. buf = Malloc(bufsize);
  193. lifc.lifc_family = AF_INET;
  194. lifc.lifc_flags = 0;
  195. lifc.lifc_len = bufsize;
  196. lifc.lifc_buf = (char *) buf;
  197. if (ioctl(s, SIOCGLIFCONF, (char *)&lifc) >= 0)
  198. {
  199. for (i = 0; i<numifs; i++)
  200. {
  201. if(StartWith(buf[i].lifr_name, "lo") == false) {
  202. Add(o, CopyStr(buf[i].lifr_name));
  203. }
  204. }
  205. }
  206. Free(buf);
  207. }
  208. closesocket(s);
  209. }
  210. Sort(o);
  211. t = ZeroMalloc(sizeof(TOKEN_LIST));
  212. t->NumTokens = LIST_NUM(o);
  213. t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
  214. for (i = 0; i < LIST_NUM(o); i++)
  215. {
  216. char *name = LIST_DATA(o, i);
  217. t->Token[i] = name;
  218. }
  219. ReleaseList(o);
  220. return t;
  221. }
  222. #endif // UNIX_SOLARIS
  223. #ifdef UNIX_LINUX
  224. // Get Ethernet device list on Linux
  225. TOKEN_LIST *GetEthListLinux(bool enum_normal, bool enum_rawip)
  226. {
  227. struct ifreq ifr;
  228. TOKEN_LIST *t;
  229. UINT i, n;
  230. int s;
  231. LIST *o;
  232. char name[MAX_SIZE];
  233. if (enum_normal == false && enum_rawip)
  234. {
  235. return ParseToken(BRIDGE_SPECIAL_IPRAW_NAME, NULL);
  236. }
  237. o = NewListFast(CompareStr);
  238. s = UnixEthOpenRawSocket();
  239. if (s != INVALID_SOCKET)
  240. {
  241. n = 0;
  242. for (i = 0;; i++)
  243. {
  244. Zero(&ifr, sizeof(ifr));
  245. ifr.ifr_ifindex = i;
  246. if (ioctl(s, SIOCGIFNAME, &ifr) >= 0)
  247. {
  248. n = 0;
  249. StrCpy(name, sizeof(name), ifr.ifr_name);
  250. Zero(&ifr, sizeof(ifr));
  251. StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), name);
  252. if (ioctl(s, SIOCGIFHWADDR, &ifr) >= 0)
  253. {
  254. UINT type = ifr.ifr_hwaddr.sa_family;
  255. if (type == 1 || type == 2 || type == 6 || type == 800 || type == 801)
  256. {
  257. if (IsInListStr(o, name) == false)
  258. {
  259. if (StartWith(name, "tap_") == false)
  260. {
  261. Add(o, CopyStr(name));
  262. }
  263. }
  264. }
  265. }
  266. }
  267. else
  268. {
  269. n++;
  270. if (n >= 64)
  271. {
  272. break;
  273. }
  274. }
  275. }
  276. closesocket(s);
  277. }
  278. Sort(o);
  279. t = ZeroMalloc(sizeof(TOKEN_LIST));
  280. t->NumTokens = LIST_NUM(o) + (enum_rawip ? 1 : 0);
  281. t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
  282. for (i = 0; i < LIST_NUM(o); i++)
  283. {
  284. char *name = LIST_DATA(o, i);
  285. t->Token[i] = name;
  286. }
  287. if (enum_rawip)
  288. {
  289. t->Token[t->NumTokens - 1] = CopyStr(BRIDGE_SPECIAL_IPRAW_NAME);
  290. }
  291. ReleaseList(o);
  292. return t;
  293. }
  294. #endif // UNIX_LINUX
  295. #ifdef BRIDGE_PCAP
  296. // Ethernet device list by Pcap API
  297. TOKEN_LIST *GetEthListPcap()
  298. {
  299. pcap_if_t *alldevs;
  300. char errbuf[PCAP_ERRBUF_SIZE];
  301. LIST *o;
  302. TOKEN_LIST *t;
  303. int i;
  304. o = NewListFast(CompareStr);
  305. if( pcap_findalldevs(&alldevs,errbuf) != -1)
  306. {
  307. pcap_if_t *dev = alldevs;
  308. while(dev != NULL)
  309. {
  310. pcap_t *p;
  311. // Device type will be unknown until open the device?
  312. p = pcap_open_live(dev->name, 0, false, 0, errbuf);
  313. if(p != NULL)
  314. {
  315. int datalink = pcap_datalink(p);
  316. // Debug("type:%s\n",pcap_datalink_val_to_name(datalink));
  317. pcap_close(p);
  318. if(datalink == DLT_EN10MB) {
  319. // Enumerate only Ethernet type device
  320. Add(o, CopyStr(dev->name));
  321. }
  322. }
  323. dev = dev->next;
  324. }
  325. pcap_freealldevs(alldevs);
  326. }
  327. Sort(o);
  328. t = ZeroMalloc(sizeof(TOKEN_LIST));
  329. t->NumTokens = LIST_NUM(o);
  330. t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
  331. for (i = 0; i < LIST_NUM(o); i++)
  332. {
  333. t->Token[i] = LIST_DATA(o, i);
  334. }
  335. ReleaseList(o);
  336. return t;
  337. }
  338. #endif // BRIDGE_PCAP
  339. #ifdef BRIDGE_BPF
  340. // Ethernet device list by BPF API
  341. TOKEN_LIST *GetEthListBpf()
  342. {
  343. struct ifaddrs *ifadrs;
  344. struct sockaddr_dl *sockadr;
  345. LIST *o;
  346. TOKEN_LIST *t;
  347. int i;
  348. o = NewListFast(CompareStr);
  349. // Enumerate network devices
  350. if(getifaddrs( &ifadrs ) == 0)
  351. {
  352. struct ifaddrs *ifadr = ifadrs;
  353. while(ifadr)
  354. {
  355. sockadr = (struct sockaddr_dl *)ifadr->ifa_addr;
  356. if(sockadr->sdl_family == AF_LINK && sockadr->sdl_type == IFT_ETHER)
  357. {
  358. // Is this Ethernet device?
  359. if(!IsInListStr(o,ifadr->ifa_name))
  360. {
  361. // Ignore the foregoing device (for device which have multiple MAC address)
  362. Add(o, CopyStr(ifadr->ifa_name));
  363. }
  364. }
  365. ifadr = ifadr -> ifa_next;
  366. }
  367. freeifaddrs(ifadrs);
  368. }
  369. Sort(o);
  370. t = ZeroMalloc(sizeof(TOKEN_LIST));
  371. t->NumTokens = LIST_NUM(o);
  372. t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
  373. for (i = 0; i < LIST_NUM(o); i++)
  374. {
  375. t->Token[i] = LIST_DATA(o, i);
  376. }
  377. ReleaseList(o);
  378. return t;
  379. }
  380. #endif // BRIDGE_BPF
  381. // Enumerate Ethernet devices
  382. TOKEN_LIST *GetEthList()
  383. {
  384. return GetEthListEx(NULL, true, false);
  385. }
  386. TOKEN_LIST *GetEthListEx(UINT *total_num_including_hidden, bool enum_normal, bool enum_rawip)
  387. {
  388. #if defined(UNIX_LINUX)
  389. return GetEthListLinux(enum_normal, enum_rawip);
  390. #elif defined(UNIX_SOLARIS)
  391. return GetEthListSolaris();
  392. #elif defined(BRIDGE_PCAP)
  393. return GetEthListPcap();
  394. #elif defined(BRIDGE_BPF)
  395. return GetEthListBpf();
  396. #else
  397. return NULL;
  398. #endif
  399. }
  400. #ifdef UNIX_LINUX
  401. // Open Ethernet device (Linux)
  402. ETH *OpenEthLinux(char *name, bool local, bool tapmode, char *tapaddr)
  403. {
  404. ETH *e;
  405. struct ifreq ifr;
  406. struct sockaddr_ll addr;
  407. int s;
  408. int index;
  409. bool aux_ok = false;
  410. CANCEL *c;
  411. // Validate arguments
  412. if (name == NULL)
  413. {
  414. return NULL;
  415. }
  416. if (StrCmpi(name, BRIDGE_SPECIAL_IPRAW_NAME) == 0)
  417. {
  418. return OpenEthLinuxIpRaw();
  419. }
  420. if (tapmode)
  421. {
  422. #ifndef NO_VLAN
  423. // In tap mode
  424. VLAN *v = NewTap(name, tapaddr, true);
  425. if (v == NULL)
  426. {
  427. return NULL;
  428. }
  429. e = ZeroMalloc(sizeof(ETH));
  430. e->Name = CopyStr(name);
  431. e->Title = CopyStr(name);
  432. e->Cancel = VLanGetCancel(v);
  433. e->IfIndex = 0;
  434. e->Socket = INVALID_SOCKET;
  435. e->Tap = v;
  436. return e;
  437. #else // NO_VLAN
  438. return NULL;
  439. #endif // NO_VLAN
  440. }
  441. s = UnixEthOpenRawSocket();
  442. if (s == INVALID_SOCKET)
  443. {
  444. return NULL;
  445. }
  446. Zero(&ifr, sizeof(ifr));
  447. StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), name);
  448. if (ioctl(s, SIOCGIFINDEX, &ifr) < 0)
  449. {
  450. closesocket(s);
  451. return NULL;
  452. }
  453. index = ifr.ifr_ifindex;
  454. Zero(&addr, sizeof(addr));
  455. addr.sll_family = PF_PACKET;
  456. addr.sll_protocol = htons(ETH_P_ALL);
  457. addr.sll_ifindex = index;
  458. if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
  459. {
  460. closesocket(s);
  461. return NULL;
  462. }
  463. if (local == false)
  464. {
  465. // Enable promiscuous mode
  466. Zero(&ifr, sizeof(ifr));
  467. StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), name);
  468. if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
  469. {
  470. // Failed
  471. closesocket(s);
  472. return NULL;
  473. }
  474. ifr.ifr_flags |= IFF_PROMISC;
  475. if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
  476. {
  477. // Failed
  478. closesocket(s);
  479. return NULL;
  480. }
  481. }
  482. if (true)
  483. {
  484. int val = 1;
  485. int ss_ret = setsockopt(s, SOL_PACKET, MY_PACKET_AUXDATA, &val, sizeof(val));
  486. if (ss_ret < 0)
  487. {
  488. Debug("eth(%s): setsockopt: PACKET_AUXDATA failed.\n", name);
  489. }
  490. else
  491. {
  492. Debug("eth(%s): setsockopt: PACKET_AUXDATA ok.\n", name);
  493. aux_ok = true;
  494. }
  495. }
  496. e = ZeroMalloc(sizeof(ETH));
  497. e->Name = CopyStr(name);
  498. e->Title = CopyStr(name);
  499. e->IfIndex = index;
  500. e->Socket = s;
  501. e->Linux_IsAuxDataSupported = aux_ok;
  502. c = NewCancel();
  503. UnixDeletePipe(c->pipe_read, c->pipe_write);
  504. c->pipe_read = c->pipe_write = -1;
  505. UnixSetSocketNonBlockingMode(s, true);
  506. c->SpecialFlag = true;
  507. c->pipe_read = s;
  508. e->Cancel = c;
  509. // Get MTU
  510. e->InitialMtu = EthGetMtu(e);
  511. if (tapmode == false)
  512. {
  513. if (GetGlobalServerFlag(GSF_LOCALBRIDGE_NO_DISABLE_OFFLOAD) == false)
  514. {
  515. bool b = false;
  516. LockList(eth_offload_list);
  517. {
  518. if (IsInListStr(eth_offload_list, name) == false)
  519. {
  520. b = true;
  521. Add(eth_offload_list, CopyStr(name));
  522. }
  523. }
  524. UnlockList(eth_offload_list);
  525. if (b)
  526. {
  527. // Disable hardware offloading
  528. UnixDisableInterfaceOffload(name);
  529. }
  530. }
  531. }
  532. return e;
  533. }
  534. #endif // UNIX_LINUX
  535. // Get the MTU value
  536. UINT EthGetMtu(ETH *e)
  537. {
  538. #if defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  539. UINT ret = 0;
  540. #ifdef UNIX_SOLARIS
  541. struct lifreq ifr;
  542. #else // UNIX_SOLARIS
  543. struct ifreq ifr;
  544. #endif // UNIX_SOLARIS
  545. int s;
  546. // Validate arguments
  547. if (e == NULL || e->Tap != NULL)
  548. {
  549. return 0;
  550. }
  551. if (e->IsRawIpMode)
  552. {
  553. return 0;
  554. }
  555. if (e->CurrentMtu != 0)
  556. {
  557. return e->CurrentMtu;
  558. }
  559. #if defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  560. s = e->SocketBsdIf;
  561. #else // defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  562. s = e->Socket;
  563. #endif // defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  564. Zero(&ifr, sizeof(ifr));
  565. #ifdef UNIX_SOLARIS
  566. StrCpy(ifr.lifr_name, sizeof(ifr.lifr_name), e->Name);
  567. #else // UNIX_SOLARIS
  568. StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), e->Name);
  569. #endif // UNIX_SOLARIS
  570. #ifdef UNIX_SOLARIS
  571. if (ioctl(s, SIOCGLIFMTU, &ifr) < 0)
  572. {
  573. // failed
  574. return 0;
  575. }
  576. #else // UNIX_SOLARIS
  577. if (ioctl(s, SIOCGIFMTU, &ifr) < 0)
  578. {
  579. // failed
  580. return 0;
  581. }
  582. #endif // UNIX_SOLARIS
  583. #ifdef UNIX_SOLARIS
  584. ret = ifr.lifr_mtu + 14;
  585. #else // UNIX_SOLARIS
  586. ret = ifr.ifr_mtu + 14;
  587. #endif // UNIX_SOLARIS
  588. e->CurrentMtu = ret;
  589. Debug("%s: GetMtu: %u\n", e->Name, ret);
  590. return ret;
  591. #else // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  592. return 0;
  593. #endif // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  594. }
  595. // Set the MTU value
  596. bool EthSetMtu(ETH *e, UINT mtu)
  597. {
  598. #if defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  599. UINT ret = 0;
  600. #ifdef UNIX_SOLARIS
  601. struct lifreq ifr;
  602. #else // UNIX_SOLARIS
  603. struct ifreq ifr;
  604. #endif // UNIX_SOLARIS
  605. int s;
  606. // Validate arguments
  607. if (e == NULL || e->Tap != NULL || (mtu > 1 && mtu < 1514))
  608. {
  609. return false;
  610. }
  611. if (mtu == 0 && e->InitialMtu == 0)
  612. {
  613. return false;
  614. }
  615. if (e->IsRawIpMode)
  616. {
  617. return false;
  618. }
  619. if (mtu == 0)
  620. {
  621. // Restore initial MTU value when parameter mtu == 0
  622. mtu = e->InitialMtu;
  623. }
  624. #if defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  625. s = e->SocketBsdIf;
  626. #else // defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  627. s = e->Socket;
  628. #endif // defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  629. if (e->CurrentMtu == mtu)
  630. {
  631. // No need to change
  632. return true;
  633. }
  634. Zero(&ifr, sizeof(ifr));
  635. #ifdef UNIX_SOLARIS
  636. StrCpy(ifr.lifr_name, sizeof(ifr.lifr_name), e->Name);
  637. ifr.lifr_mtu = mtu - 14;
  638. #else // UNIX_SOLARIS
  639. StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), e->Name);
  640. ifr.ifr_mtu = mtu - 14;
  641. #endif // UNIX_SOLARIS
  642. #ifdef UNIX_SOLARIS
  643. if (ioctl(s, SIOCSLIFMTU, &ifr) < 0)
  644. {
  645. // Failed
  646. return false;
  647. }
  648. #else // UNIX_SOLARIS
  649. if (ioctl(s, SIOCSIFMTU, &ifr) < 0)
  650. {
  651. // Failed
  652. return false;
  653. }
  654. #endif // UNIX_SOLARIS
  655. e->CurrentMtu = mtu;
  656. Debug("%s: SetMtu: %u\n", e->Name, mtu);
  657. return true;
  658. #else // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  659. return false;
  660. #endif // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  661. }
  662. // Is changing MTU supported?
  663. bool EthIsChangeMtuSupported(ETH *e)
  664. {
  665. #if defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  666. // Validate arguments
  667. if (e == NULL || e->Tap != NULL)
  668. {
  669. return false;
  670. }
  671. if (e->IsRawIpMode)
  672. {
  673. return false;
  674. }
  675. return true;
  676. #else // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  677. return false;
  678. #endif // defined(UNIX_LINUX) || defined(UNIX_BSD) || defined(UNIX_SOLARIS)
  679. }
  680. #ifdef UNIX_SOLARIS
  681. // Open Ethernet adapter (Solaris)
  682. ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr)
  683. {
  684. char devname[MAX_SIZE];
  685. int fd;
  686. ETH *e;
  687. CANCEL *c;
  688. struct strioctl sioc;
  689. // Validate arguments
  690. if (name == NULL || tapmode != false)
  691. {
  692. return NULL;
  693. }
  694. // Parse device name
  695. if (ParseUnixEthDeviceName(devname, sizeof(devname), name) == false)
  696. {
  697. return NULL;
  698. }
  699. // Open the device - use style 1 attachment
  700. fd = open(devname, O_RDWR);
  701. if (fd == -1)
  702. {
  703. // Failed
  704. return NULL;
  705. }
  706. // Bind to SAP
  707. if (DlipBindRequest(fd) == false)
  708. {
  709. // Failed
  710. close(fd);
  711. return NULL;
  712. }
  713. // Verify ACK message
  714. if (DlipReceiveAck(fd) == false)
  715. {
  716. // Failed
  717. close(fd);
  718. return NULL;
  719. }
  720. // Set to ignore SAP and promiscuous mode
  721. if (DlipPromiscuous(fd, DL_PROMISC_SAP) == false)
  722. {
  723. // Failed
  724. close(fd);
  725. return NULL;
  726. }
  727. // Verify ACK message
  728. if (DlipReceiveAck(fd) == false)
  729. {
  730. // Failed
  731. close(fd);
  732. return NULL;
  733. }
  734. // Set to the mode to receive self sending packet
  735. if (DlipPromiscuous(fd, DL_PROMISC_PHYS) == false)
  736. {
  737. // Failed
  738. close(fd);
  739. return NULL;
  740. }
  741. // Verify ACK message
  742. if (DlipReceiveAck(fd) == false)
  743. {
  744. // Failed
  745. close(fd);
  746. return NULL;
  747. }
  748. // Set to raw mode
  749. sioc.ic_cmd = DLIOCRAW;
  750. sioc.ic_timout = -1;
  751. sioc.ic_len = 0;
  752. sioc.ic_dp = NULL;
  753. if (ioctl(fd, I_STR, &sioc) < 0)
  754. {
  755. // Failed
  756. close(fd);
  757. return NULL;
  758. }
  759. if (ioctl(fd, I_FLUSH, FLUSHR) < 0)
  760. {
  761. // Failed
  762. close(fd);
  763. return NULL;
  764. }
  765. e = ZeroMalloc(sizeof(ETH));
  766. e->Name = CopyStr(name);
  767. e->Title = CopyStr(name);
  768. c = NewCancel();
  769. UnixDeletePipe(c->pipe_read, c->pipe_write);
  770. c->pipe_read = c->pipe_write = -1;
  771. c->SpecialFlag = true;
  772. c->pipe_read = fd;
  773. e->Cancel = c;
  774. e->IfIndex = -1;
  775. e->Socket = fd;
  776. UnixSetSocketNonBlockingMode(fd, true);
  777. // Get control interface
  778. e->SocketBsdIf = socket(AF_INET, SOCK_DGRAM, 0);
  779. // Get MTU value
  780. e->InitialMtu = EthGetMtu(e);
  781. return e;
  782. }
  783. // Set to promiscuous mode
  784. bool DlipPromiscuous(int fd, UINT level)
  785. {
  786. dl_promiscon_req_t req;
  787. struct strbuf ctl;
  788. int flags;
  789. // Validate arguments
  790. if (fd == -1)
  791. {
  792. return false;
  793. }
  794. Zero(&req, sizeof(req));
  795. req.dl_primitive = DL_PROMISCON_REQ;
  796. req.dl_level = level;
  797. Zero(&ctl, sizeof(ctl));
  798. ctl.maxlen = 0;
  799. ctl.len = sizeof(req);
  800. ctl.buf = (char *)&req;
  801. flags = 0;
  802. if (putmsg(fd, &ctl, NULL, flags) < 0)
  803. {
  804. return false;
  805. }
  806. return true;
  807. }
  808. // Bind to a SAP
  809. bool DlipBindRequest(int fd)
  810. {
  811. dl_bind_req_t req;
  812. struct strbuf ctl;
  813. if (fd == -1)
  814. {
  815. return false;
  816. }
  817. Zero(&req, sizeof(req));
  818. req.dl_primitive = DL_BIND_REQ;
  819. req.dl_service_mode = DL_CLDLS;
  820. req.dl_sap = 0;
  821. Zero(&ctl, sizeof(ctl));
  822. ctl.maxlen = 0;
  823. ctl.len = sizeof(req);
  824. ctl.buf = (char *)&req;
  825. if (putmsg(fd, &ctl, NULL, 0) < 0)
  826. {
  827. return false;
  828. }
  829. return true;
  830. }
  831. // Verify the ACK message
  832. bool DlipReceiveAck(int fd)
  833. {
  834. union DL_primitives *dlp;
  835. struct strbuf ctl;
  836. int flags = 0;
  837. char *buf;
  838. // Validate arguments
  839. if (fd == -1)
  840. {
  841. return false;
  842. }
  843. buf = MallocFast(SOLARIS_MAXDLBUF);
  844. Zero(&ctl, sizeof(ctl));
  845. ctl.maxlen = SOLARIS_MAXDLBUF;
  846. ctl.len = 0;
  847. ctl.buf = buf;
  848. if (getmsg(fd, &ctl, NULL, &flags) < 0)
  849. {
  850. return false;
  851. }
  852. dlp = (union DL_primitives *)ctl.buf;
  853. if (dlp->dl_primitive != (UINT)DL_OK_ACK && dlp->dl_primitive != (UINT)DL_BIND_ACK)
  854. {
  855. Free(buf);
  856. return false;
  857. }
  858. Free(buf);
  859. return true;
  860. }
  861. #endif // UNIX_SOLARIS
  862. // Validate device name and return proper device path according to system type
  863. bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, char *src_name)
  864. {
  865. UINT len, i;
  866. struct stat s;
  867. int err;
  868. char *device_path;
  869. int device_pathlen;
  870. // Validate arguments
  871. if (dst_devname == NULL || src_name == NULL)
  872. {
  873. return false;
  874. }
  875. // Check string length
  876. if (IsEmptyStr(src_name))
  877. {
  878. return false;
  879. }
  880. // Solaris 10 and higher make real and virtual devices available in /dev/net
  881. err = stat("/dev/net", &s);
  882. if (err != -1 && S_ISDIR(s.st_mode))
  883. {
  884. device_path = "/dev/net/";
  885. }
  886. else
  887. {
  888. device_path = "/dev/";
  889. }
  890. device_pathlen = StrLen(device_path);
  891. // Last character must be a number
  892. if (src_name[i] < '0' || '9' < src_name[i])
  893. {
  894. if (src_name[i + 1] == 0)
  895. {
  896. return false;
  897. }
  898. }
  899. StrCpy(dst_devname, dst_devname_size, device_path);
  900. StrCpy(dst_devname + device_pathlen, dst_devname_size - device_pathlen, src_name);
  901. dst_devname[device_pathlen + len] = 0;
  902. return true;
  903. }
  904. #if defined(BRIDGE_BPF) || defined(BRIDGE_PCAP)
  905. // Initialize captured packet data structure
  906. struct CAPTUREBLOCK *NewCaptureBlock(UCHAR *data, UINT size) {
  907. struct CAPTUREBLOCK *block = Malloc(sizeof(struct CAPTUREBLOCK));
  908. block->Buf = data;
  909. block->Size = size;
  910. return block;
  911. }
  912. // Free captured packet data structure
  913. void FreeCaptureBlock(struct CAPTUREBLOCK *block) {
  914. Free(block);
  915. }
  916. #endif // BRIDGE_BPF || BRIDGE_PCAP
  917. #ifdef BRIDGE_PCAP
  918. // Callback function to receive arriving packet (Pcap)
  919. void PcapHandler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes)
  920. {
  921. ETH *e = (ETH *) user;
  922. struct CAPTUREBLOCK *block;
  923. UCHAR *data;
  924. data = Malloc(h->caplen);
  925. Copy(data, bytes, h->caplen);
  926. block = NewCaptureBlock(data, h->caplen);
  927. LockQueue(e->Queue);
  928. // Discard arriving packet when queue filled
  929. if(e->QueueSize < BRIDGE_MAX_QUEUE_SIZE) {
  930. InsertQueue(e->Queue, block);
  931. e->QueueSize += h->caplen;
  932. }
  933. UnlockQueue(e->Queue);
  934. Cancel(e->Cancel);
  935. return;
  936. }
  937. // Relay thread for captured packet (Pcap)
  938. void PcapThread(THREAD *thread, void *param)
  939. {
  940. ETH *e = (ETH *)param;
  941. pcap_t *p = e->Pcap;
  942. int ret;
  943. // Notify initialize completed
  944. NoticeThreadInit(thread);
  945. // Return -1:Error -2:Terminated externally
  946. ret = pcap_loop(p, -1, PcapHandler, (u_char *) e);
  947. if(ret == -1) {
  948. e->Socket = INVALID_SOCKET;
  949. pcap_perror(p, "capture");
  950. }
  951. return;
  952. }
  953. // Open Ethernet adapter (Pcap)
  954. ETH *OpenEthPcap(char *name, bool local, bool tapmode, char *tapaddr)
  955. {
  956. char errbuf[PCAP_ERRBUF_SIZE];
  957. ETH *e;
  958. pcap_t *p;
  959. // Validate arguments
  960. if (name == NULL || tapmode != false)
  961. {
  962. return NULL;
  963. }
  964. // Initialize error message buffer
  965. errbuf[0] = 0;
  966. // Open capturing device
  967. p = pcap_open_live(name, 65535, (local == false), 1, errbuf);
  968. if(p==NULL)
  969. {
  970. return NULL;
  971. }
  972. // Set to non-block mode
  973. // (In old BSD OSs, 'select(2)' don't block normally for BPF device. To prevent busy loop)
  974. /*
  975. if(pcap_setnonblock(p, true, errbuf) == -1)
  976. {
  977. Debug("pcap_setnonblock:%s\n",errbuf);
  978. pcap_close(p);
  979. return NULL;
  980. }
  981. */
  982. e = ZeroMalloc(sizeof(ETH));
  983. e->Name = CopyStr(name);
  984. e->Title = CopyStr(name);
  985. e->Queue = NewQueue();
  986. e->QueueSize = 0;
  987. e->Cancel = NewCancel();
  988. e->IfIndex = -1;
  989. e->Socket = pcap_get_selectable_fd(p);
  990. e->Pcap = p;
  991. e->CaptureThread = NewThread(PcapThread, e);
  992. WaitThreadInit(e->CaptureThread);
  993. return e;
  994. }
  995. #endif // BRIDGE_PCAP
  996. #ifdef BRIDGE_BPF
  997. #ifdef BRIDGE_BPF_THREAD
  998. // Relay thread for captured packet (BPF)
  999. void BpfThread(THREAD *thread, void *param)
  1000. {
  1001. ETH *e = (ETH *)param;
  1002. int fd = e->Socket;
  1003. int len;
  1004. int rest; // Rest size in buffer
  1005. UCHAR *next; // Head of next packet in buffer
  1006. struct CAPTUREBLOCK *block; // Data to enqueue
  1007. UCHAR *data;
  1008. struct bpf_hdr *hdr;
  1009. // Allocate the buffer
  1010. UCHAR *buf = Malloc(e->BufSize);
  1011. // Notify initialize completed
  1012. NoticeThreadInit(thread);
  1013. while(1) {
  1014. // Determining to exit loop
  1015. if(e->Socket == INVALID_SOCKET) {
  1016. break;
  1017. }
  1018. rest = read(fd, buf, e->BufSize);
  1019. if(rest < 0 && errno != EAGAIN) {
  1020. // Error
  1021. close(fd);
  1022. e->Socket = INVALID_SOCKET;
  1023. Free(buf);
  1024. Cancel(e->Cancel);
  1025. return;
  1026. }
  1027. next = buf;
  1028. LockQueue(e->Queue);
  1029. while(rest>0) {
  1030. // Cut out a packet
  1031. hdr = (struct bpf_hdr *)next;
  1032. // Discard arriving packet when queue filled
  1033. if(e->QueueSize < BRIDGE_MAX_QUEUE_SIZE) {
  1034. data = Malloc(hdr->bh_caplen);
  1035. Copy(data, next+(hdr->bh_hdrlen), hdr->bh_caplen);
  1036. block = NewCaptureBlock(data, hdr->bh_caplen);
  1037. InsertQueue(e->Queue, block);
  1038. e->QueueSize += hdr->bh_caplen;
  1039. }
  1040. // Find the head of next packet
  1041. rest -= BPF_WORDALIGN(hdr->bh_hdrlen + hdr->bh_caplen);
  1042. next += BPF_WORDALIGN(hdr->bh_hdrlen + hdr->bh_caplen);
  1043. }
  1044. UnlockQueue(e->Queue);
  1045. Cancel(e->Cancel);
  1046. }
  1047. Free(buf);
  1048. Cancel(e->Cancel);
  1049. return;
  1050. }
  1051. #endif // BRIDGE_BPF_THREAD
  1052. // Open Ethernet adapter (BPF)
  1053. ETH *OpenEthBpf(char *name, bool local, bool tapmode, char *tapaddr)
  1054. {
  1055. ETH *e;
  1056. CANCEL *c;
  1057. char devname[MAX_SIZE];
  1058. int n = 0;
  1059. int fd;
  1060. int ret;
  1061. UINT bufsize;
  1062. struct ifreq ifr;
  1063. struct timeval to;
  1064. // Find unused bpf device and open it
  1065. do {
  1066. Format(devname, sizeof(devname), "/dev/bpf%d", n++);
  1067. fd = open (devname, O_RDWR);
  1068. if(fd<0) {
  1069. perror("open");
  1070. }
  1071. } while(fd < 0 && errno == EBUSY);
  1072. // No free bpf device was found
  1073. if(fd < 0) {
  1074. Debug("BPF: No minor number are free.\n");
  1075. return NULL;
  1076. }
  1077. // Enlarge buffer size
  1078. n = 524288; // Somehow(In libpcap, this size is 32768)
  1079. while(true) {
  1080. // Specify buffer size
  1081. ioctl(fd, BIOCSBLEN, &n);
  1082. // Bind to the network device
  1083. StrCpy(ifr.ifr_name, IFNAMSIZ, name);
  1084. ret = ioctl(fd, BIOCSETIF, &ifr);
  1085. if(ret < 0) {
  1086. if(ret == ENOBUFS && n>1500) {
  1087. // Inappropriate buffer size
  1088. // Retry with half buffer size
  1089. // If buffer size is under 1500 bytes, something goes wrong
  1090. n /= 2;
  1091. continue;
  1092. }
  1093. Debug("bpf: binding network failed.\n");
  1094. close(fd);
  1095. return NULL;
  1096. } else {
  1097. break;
  1098. }
  1099. }
  1100. bufsize = n;
  1101. // Set to promiscuous mode
  1102. if(local == false) {
  1103. if (ioctl(fd, BIOCPROMISC, NULL) < 0) {
  1104. printf("bpf: promisc mode failed.\n");
  1105. close(fd);
  1106. return NULL;
  1107. }
  1108. }
  1109. // Set to immediate mode (Return immediately when packet arrives)
  1110. n = 1;
  1111. if (ioctl(fd, BIOCIMMEDIATE, &n) < 0) {
  1112. Debug("BPF: non-block mode failed.\n");
  1113. close(fd);
  1114. return NULL;
  1115. }
  1116. // Set receiving self sending packet
  1117. n = 1;
  1118. if (ioctl(fd, BIOCGSEESENT, &n) < 0) {
  1119. Debug("BPF: see sent mode failed.\n");
  1120. close(fd);
  1121. return NULL;
  1122. }
  1123. // Header complete mode (Generate whole header of sending packet)
  1124. n = 1;
  1125. if (ioctl(fd, BIOCSHDRCMPLT, &n) < 0) {
  1126. Debug("BPF: Header complete mode failed.\n");
  1127. close(fd);
  1128. return NULL;
  1129. }
  1130. // Set timeout delay to 1 second
  1131. to.tv_sec = 1;
  1132. to.tv_usec = 0;
  1133. if (ioctl(fd, BIOCSRTIMEOUT, &to) < 0) {
  1134. Debug("BPF: Read timeout setting failed.\n");
  1135. close(fd);
  1136. return NULL;
  1137. }
  1138. e = ZeroMalloc(sizeof(ETH));
  1139. e->Name = CopyStr(name);
  1140. e->Title = CopyStr(name);
  1141. e->IfIndex = -1;
  1142. e->Socket = fd;
  1143. e->BufSize = bufsize;
  1144. #ifdef BRIDGE_BPF_THREAD
  1145. e->Queue = NewQueue();
  1146. e->QueueSize = 0;
  1147. e->Cancel = NewCancel();
  1148. // Start capture thread
  1149. e->CaptureThread = NewThread(BpfThread, e);
  1150. WaitThreadInit(e->CaptureThread);
  1151. #else // BRIDGE_BPF_THREAD
  1152. c = NewCancel();
  1153. UnixDeletePipe(c->pipe_read, c->pipe_write);
  1154. c->pipe_read = c->pipe_write = -1;
  1155. c->SpecialFlag = true;
  1156. c->pipe_read = fd;
  1157. e->Cancel = c;
  1158. e->Buffer = Malloc(bufsize);
  1159. e->Next = e->Buffer;
  1160. e->Rest = 0;
  1161. // Set to non-blocking mode
  1162. UnixSetSocketNonBlockingMode(fd, true);
  1163. #endif // BRIDGE_BPF_THREAD
  1164. // Open interface control socket for FreeBSD
  1165. e->SocketBsdIf = socket(AF_LOCAL, SOCK_DGRAM, 0);
  1166. // Get MTU value
  1167. e->InitialMtu = EthGetMtu(e);
  1168. return e;
  1169. }
  1170. #endif // BRIDGE_BPF
  1171. #ifdef UNIX_BSD
  1172. ETH *OpenEthBSD(char *name, bool local, bool tapmode, char *tapaddr)
  1173. {
  1174. if (tapmode)
  1175. {
  1176. #ifndef NO_VLAN
  1177. // In tap mode
  1178. VLAN *v = NewTap(name, tapaddr, true);
  1179. if (v == NULL)
  1180. {
  1181. return NULL;
  1182. }
  1183. ETH *e;
  1184. e = ZeroMalloc(sizeof(ETH));
  1185. e->Name = CopyStr(name);
  1186. e->Title = CopyStr(name);
  1187. e->Cancel = VLanGetCancel(v);
  1188. e->IfIndex = 0;
  1189. e->Socket = INVALID_SOCKET;
  1190. e->Tap = v;
  1191. return e;
  1192. #else // NO_VLAN
  1193. return NULL:
  1194. #endif // NO_VLAN
  1195. }
  1196. #if defined(BRIDGE_BPF)
  1197. return OpenEthBpf(name, local, tapmode, tapaddr);
  1198. #elif defined(BRIDGE_PCAP)
  1199. return OpenEthPcap(name, local, tapmode, tapaddr);
  1200. #else
  1201. return NULL;
  1202. #endif
  1203. }
  1204. #endif // UNIX_BSD
  1205. // Open Ethernet adapter
  1206. ETH *OpenEth(char *name, bool local, bool tapmode, char *tapaddr)
  1207. {
  1208. #if defined(UNIX_LINUX)
  1209. return OpenEthLinux(name, local, tapmode, tapaddr);
  1210. #elif defined(UNIX_BSD)
  1211. return OpenEthBSD(name, local, tapmode, tapaddr);
  1212. #elif defined(UNIX_SOLARIS)
  1213. return OpenEthSolaris(name, local, tapmode, tapaddr);
  1214. #elif defined(BRIDGE_PCAP)
  1215. return OpenEthPcap(name, local, tapmode, tapaddr);
  1216. #elif defined(BRIDGE_BPF)
  1217. return OpenEthBpf(name, local, tapmode, tapaddr);
  1218. #else
  1219. return NULL;
  1220. #endif
  1221. }
  1222. typedef struct UNIXTHREAD
  1223. {
  1224. pthread_t thread;
  1225. bool finished;
  1226. } UNIXTHREAD;
  1227. // Close Ethernet adapter
  1228. void CloseEth(ETH *e)
  1229. {
  1230. // Validate arguments
  1231. if (e == NULL)
  1232. {
  1233. return;
  1234. }
  1235. if (e->IsRawIpMode)
  1236. {
  1237. CloseEthLinuxIpRaw(e);
  1238. return;
  1239. }
  1240. if (e->Tap != NULL)
  1241. {
  1242. #ifndef NO_VLAN
  1243. FreeTap(e->Tap);
  1244. #endif // NO_VLAN
  1245. }
  1246. #ifdef BRIDGE_PCAP
  1247. {
  1248. struct CAPTUREBLOCK *block;
  1249. pcap_breakloop(e->Pcap);
  1250. WaitThread(e->CaptureThread, INFINITE);
  1251. ReleaseThread(e->CaptureThread);
  1252. pcap_close(e->Pcap);
  1253. while (block = GetNext(e->Queue)) {
  1254. Free(block->Buf);
  1255. FreeCaptureBlock(block);
  1256. }
  1257. ReleaseQueue(e->Queue);
  1258. }
  1259. #endif // BRIDGE_PCAP
  1260. #ifdef BRIDGE_BPF
  1261. #ifdef BRIDGE_BPF_THREAD
  1262. {
  1263. struct CAPTUREBLOCK *block;
  1264. int fd = e->Socket;
  1265. e->Socket = INVALID_SOCKET;
  1266. WaitThread(e->CaptureThread, INFINITE);
  1267. ReleaseThread(e->CaptureThread);
  1268. e->Socket = fd; // restore to close after
  1269. while (block = GetNext(e->Queue)) {
  1270. Free(block->Buf);
  1271. FreeCaptureBlock(block);
  1272. }
  1273. ReleaseQueue(e->Queue);
  1274. }
  1275. #else // BRIDGE_BPF_THREAD
  1276. Free(e->Buffer);
  1277. #endif // BRIDGE_BPF_THREAD
  1278. #endif // BRIDGE_BPF
  1279. ReleaseCancel(e->Cancel);
  1280. Free(e->Name);
  1281. Free(e->Title);
  1282. // Restore MTU value
  1283. EthSetMtu(e, 0);
  1284. if (e->Socket != INVALID_SOCKET)
  1285. {
  1286. #if defined(BRIDGE_BPF) || defined(BRIDGE_PCAP) || defined(UNIX_SOLARIS)
  1287. close(e->Socket);
  1288. #else // BRIDGE_PCAP
  1289. closesocket(e->Socket);
  1290. #endif // BRIDGE_PCAP
  1291. #if defined(BRIDGE_BPF) || defined(UNIX_SOLARIS)
  1292. if (e->SocketBsdIf != INVALID_SOCKET)
  1293. {
  1294. close(e->SocketBsdIf);
  1295. }
  1296. #endif // BRIDGE_BPF || UNIX_SOLARIS
  1297. }
  1298. Free(e);
  1299. }
  1300. // Get cancel object
  1301. CANCEL *EthGetCancel(ETH *e)
  1302. {
  1303. CANCEL *c;
  1304. // Validate arguments
  1305. if (e == NULL)
  1306. {
  1307. return NULL;
  1308. }
  1309. c = e->Cancel;
  1310. AddRef(c->ref);
  1311. return c;
  1312. }
  1313. // Read a packet
  1314. UINT EthGetPacket(ETH *e, void **data)
  1315. {
  1316. // Validate arguments
  1317. if (e == NULL || data == NULL)
  1318. {
  1319. return INFINITE;
  1320. }
  1321. #ifdef UNIX_LINUX
  1322. if (e->IsRawIpMode)
  1323. {
  1324. return EthGetPacketLinuxIpRaw(e, data);
  1325. }
  1326. #endif
  1327. if (e->Tap != NULL)
  1328. {
  1329. #ifndef NO_VLAN
  1330. // TAP mode
  1331. void *buf;
  1332. UINT size;
  1333. if (VLanGetNextPacket(e->Tap, &buf, &size) == false)
  1334. {
  1335. return INFINITE;
  1336. }
  1337. *data = buf;
  1338. return size;
  1339. #else
  1340. return INFINITE;
  1341. #endif
  1342. }
  1343. #if defined(UNIX_LINUX)
  1344. return EthGetPacketLinux(e, data);
  1345. #elif defined(UNIX_SOLARIS)
  1346. return EthGetPacketSolaris(e, data);
  1347. #elif defined(BRIDGE_PCAP)
  1348. return EthGetPacketPcap(e, data);
  1349. #elif defined(BRIDGE_BPF)
  1350. return EthGetPacketBpf(e, data);
  1351. #endif
  1352. }
  1353. #ifdef UNIX_LINUX
  1354. UINT EthGetPacketLinux(ETH *e, void **data)
  1355. {
  1356. int s, ret;
  1357. UCHAR tmp[UNIX_ETH_TMP_BUFFER_SIZE];
  1358. struct iovec msg_iov;
  1359. struct msghdr msg_header;
  1360. struct cmsghdr *cmsg;
  1361. union
  1362. {
  1363. struct cmsghdr cmsg;
  1364. char buf[CMSG_SPACE(sizeof(struct my_tpacket_auxdata))];
  1365. } cmsg_buf;
  1366. s = e->Socket;
  1367. if (s == INVALID_SOCKET)
  1368. {
  1369. return INFINITE;
  1370. }
  1371. // Read
  1372. msg_iov.iov_base = tmp;
  1373. msg_iov.iov_len = sizeof(tmp);
  1374. msg_header.msg_name = NULL;
  1375. msg_header.msg_namelen = 0;
  1376. msg_header.msg_iov = &msg_iov;
  1377. msg_header.msg_iovlen = 1;
  1378. if (e->Linux_IsAuxDataSupported)
  1379. {
  1380. memset(&cmsg_buf, 0, sizeof(cmsg_buf));
  1381. msg_header.msg_control = &cmsg_buf;
  1382. msg_header.msg_controllen = sizeof(cmsg_buf);
  1383. }
  1384. else
  1385. {
  1386. msg_header.msg_control = NULL;
  1387. msg_header.msg_controllen = 0;
  1388. }
  1389. msg_header.msg_flags = 0;
  1390. ret = recvmsg(s, &msg_header, 0);
  1391. if (ret == 0 || (ret == -1 && errno == EAGAIN))
  1392. {
  1393. // No packet
  1394. *data = NULL;
  1395. return 0;
  1396. }
  1397. else if (ret == -1 || ret > sizeof(tmp))
  1398. {
  1399. // Error
  1400. *data = NULL;
  1401. e->Socket = INVALID_SOCKET;
  1402. return INFINITE;
  1403. }
  1404. else
  1405. {
  1406. bool flag = false;
  1407. USHORT api_vlan_id = 0;
  1408. USHORT api_vlan_tpid = 0;
  1409. if (e->Linux_IsAuxDataSupported)
  1410. {
  1411. for (cmsg = CMSG_FIRSTHDR(&msg_header); cmsg; cmsg = CMSG_NXTHDR(&msg_header, cmsg))
  1412. {
  1413. struct my_tpacket_auxdata *aux;
  1414. UINT len;
  1415. USHORT vlan_tpid = 0x8100;
  1416. USHORT vlan_id = 0;
  1417. if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct my_tpacket_auxdata)) ||
  1418. cmsg->cmsg_level != SOL_PACKET ||
  1419. cmsg->cmsg_type != MY_PACKET_AUXDATA)
  1420. {
  1421. continue;
  1422. }
  1423. aux = (struct my_tpacket_auxdata *)CMSG_DATA(cmsg);
  1424. if (aux != NULL)
  1425. {
  1426. if (aux->tp_vlan_tci != 0)
  1427. {
  1428. vlan_id = aux->tp_vlan_tci;
  1429. }
  1430. }
  1431. if (vlan_id != 0)
  1432. {
  1433. api_vlan_id = vlan_id;
  1434. api_vlan_tpid = vlan_tpid;
  1435. break;
  1436. }
  1437. }
  1438. if (api_vlan_id != 0 && api_vlan_tpid != 0)
  1439. {
  1440. // VLAN ID has been received with PACKET_AUXDATA.
  1441. // Insert the tag.
  1442. USHORT vlan_id_ne = Endian16(api_vlan_id);
  1443. USHORT vlan_tpid_ne = Endian16(api_vlan_tpid);
  1444. if (ret >= 14)
  1445. {
  1446. if (*((USHORT *)(tmp + 12)) != vlan_tpid_ne)
  1447. {
  1448. *data = MallocFast(ret + 4);
  1449. Copy(*data, tmp, 12);
  1450. Copy(((UCHAR *)*data) + 12, &vlan_tpid_ne, 2);
  1451. Copy(((UCHAR *)*data) + 14, &vlan_id_ne, 2);
  1452. Copy(((UCHAR *)*data) + 16, tmp + 12, ret - 12);
  1453. flag = true;
  1454. ret += 4;
  1455. }
  1456. }
  1457. }
  1458. }
  1459. // Success to read a packet (No VLAN)
  1460. if (flag == false)
  1461. {
  1462. *data = MallocFast(ret);
  1463. Copy(*data, tmp, ret);
  1464. }
  1465. return ret;
  1466. }
  1467. return 0;
  1468. }
  1469. #endif // UNIX_LINUX
  1470. #ifdef UNIX_SOLARIS
  1471. UINT EthGetPacketSolaris(ETH *e, void **data)
  1472. {
  1473. UCHAR tmp[UNIX_ETH_TMP_BUFFER_SIZE];
  1474. struct strbuf buf;
  1475. int s;
  1476. int flags = 0;
  1477. int ret;
  1478. s = e->Socket;
  1479. if (s == INVALID_SOCKET)
  1480. {
  1481. return INFINITE;
  1482. }
  1483. Zero(&buf, sizeof(buf));
  1484. buf.buf = tmp;
  1485. buf.maxlen = sizeof(tmp);
  1486. ret = getmsg(s, NULL, &buf, &flags);
  1487. if (ret < 0 || ret > sizeof(tmp))
  1488. {
  1489. if (errno == EAGAIN)
  1490. {
  1491. // No packet
  1492. *data = NULL;
  1493. return 0;
  1494. }
  1495. // Error
  1496. *data = NULL;
  1497. return INFINITE;
  1498. }
  1499. ret = buf.len;
  1500. *data = MallocFast(ret);
  1501. Copy(*data, tmp, ret);
  1502. return ret;
  1503. }
  1504. #endif // UNIX_SOLARIS
  1505. #ifdef BRIDGE_PCAP
  1506. UINT EthGetPacketPcap(ETH *e, void **data)
  1507. {
  1508. struct CAPTUREBLOCK *block;
  1509. UINT size;
  1510. LockQueue(e->Queue);
  1511. block = GetNext(e->Queue);
  1512. if(block != NULL) {
  1513. e->QueueSize -= block->Size;
  1514. }
  1515. UnlockQueue(e->Queue);
  1516. if(block == NULL) {
  1517. *data = NULL;
  1518. if(e->Socket == INVALID_SOCKET) {
  1519. return INFINITE;
  1520. }
  1521. return 0;
  1522. }
  1523. *data = block->Buf;
  1524. size = block->Size;
  1525. FreeCaptureBlock(block);
  1526. return size;
  1527. }
  1528. #endif // BRIDGE_PCAP
  1529. #ifdef BRIDGE_BPF
  1530. #ifdef BRIDGE_BPF_THREAD
  1531. UINT EthGetPacketBpf(ETH *e, void **data)
  1532. {
  1533. struct CAPTUREBLOCK *block;
  1534. UINT size;
  1535. LockQueue(e->Queue);
  1536. block = GetNext(e->Queue);
  1537. if(block != NULL) {
  1538. e->QueueSize -= block->Size;
  1539. }
  1540. UnlockQueue(e->Queue);
  1541. if(block == NULL) {
  1542. *data = NULL;
  1543. if(e->Socket == INVALID_SOCKET) {
  1544. return INFINITE;
  1545. }
  1546. return 0;
  1547. }
  1548. *data = block->Buf;
  1549. size = block->Size;
  1550. FreeCaptureBlock(block);
  1551. return size;
  1552. }
  1553. #else // BRIDGE_BPF_THREAD
  1554. UINT EthGetPacketBpf(ETH *e, void **data)
  1555. {
  1556. struct bpf_hdr *hdr;
  1557. if(e->Rest<=0) {
  1558. e->Rest = read(e->Socket, e->Buffer, e->BufSize);
  1559. if(e->Rest < 0) {
  1560. *data = NULL;
  1561. if(errno != EAGAIN) {
  1562. // Error
  1563. return INFINITE;
  1564. }
  1565. // No packet
  1566. return 0;
  1567. }
  1568. e->Next = e->Buffer;
  1569. }
  1570. // Cut out a packet
  1571. hdr = (struct bpf_hdr *)e->Next;
  1572. *data = Malloc(hdr->bh_caplen);
  1573. Copy(*data, e->Next+(hdr->bh_hdrlen), hdr->bh_caplen);
  1574. // Find the head of next packet
  1575. e->Rest -= BPF_WORDALIGN(hdr->bh_hdrlen + hdr->bh_caplen);
  1576. e->Next += BPF_WORDALIGN(hdr->bh_hdrlen + hdr->bh_caplen);
  1577. return hdr->bh_caplen;
  1578. }
  1579. #endif // BRIDGE_BPF_THREAD
  1580. #endif // BRIDGE_BPF
  1581. // Send multiple packets
  1582. void EthPutPackets(ETH *e, UINT num, void **datas, UINT *sizes)
  1583. {
  1584. UINT i;
  1585. // Validate arguments
  1586. if (e == NULL || num == 0 || datas == NULL || sizes == NULL)
  1587. {
  1588. return;
  1589. }
  1590. for (i = 0; i < num; i++)
  1591. {
  1592. EthPutPacket(e, datas[i], sizes[i]);
  1593. }
  1594. }
  1595. // Send a packet
  1596. void EthPutPacket(ETH *e, void *data, UINT size)
  1597. {
  1598. int s, ret;
  1599. // Validate arguments
  1600. if (e == NULL || data == NULL)
  1601. {
  1602. return;
  1603. }
  1604. if (e->IsRawIpMode)
  1605. {
  1606. EthPutPacketLinuxIpRaw(e, data, size);
  1607. return;
  1608. }
  1609. if (size < 14 || size > MAX_PACKET_SIZE)
  1610. {
  1611. Free(data);
  1612. return;
  1613. }
  1614. if (e->Tap != NULL)
  1615. {
  1616. #ifndef NO_VLAN
  1617. // tap mode
  1618. VLanPutPacket(e->Tap, data, size);
  1619. #endif // NO_VLAN
  1620. return;
  1621. }
  1622. s = e->Socket;
  1623. if (s == INVALID_SOCKET)
  1624. {
  1625. Free(data);
  1626. return;
  1627. }
  1628. // Send to device
  1629. #ifdef BRIDGE_PCAP
  1630. ret = pcap_inject(e->Pcap, data, size);
  1631. if( ret == -1 ) {
  1632. #ifdef _DEBUG
  1633. pcap_perror(e->Pcap, "inject");
  1634. #endif // _DEBUG
  1635. Debug("EthPutPacket: ret:%d size:%d\n", ret, size);
  1636. }
  1637. #else // BRIDGE_PCAP
  1638. #ifndef UNIX_LINUX
  1639. ret = write(s, data, size);
  1640. if (ret<0)
  1641. {
  1642. Debug("EthPutPacket: ret:%d errno:%d size:%d\n", ret, errno, size);
  1643. }
  1644. #else // UNIX_LINUX
  1645. {
  1646. struct iovec msg_iov;
  1647. struct msghdr msg_header;
  1648. msg_iov.iov_base = data;
  1649. msg_iov.iov_len = size;
  1650. msg_header.msg_name = NULL;
  1651. msg_header.msg_namelen = 0;
  1652. msg_header.msg_iov = &msg_iov;
  1653. msg_header.msg_iovlen = 1;
  1654. msg_header.msg_control = NULL;
  1655. msg_header.msg_controllen = 0;
  1656. msg_header.msg_flags = 0;
  1657. ret = sendmsg(s, &msg_header, 0);
  1658. if (ret<0)
  1659. {
  1660. Debug("EthPutPacket: ret:%d errno:%d size:%d\n", ret, errno, size);
  1661. }
  1662. }
  1663. #endif // UNIX_LINUX
  1664. #endif //BRIDGE_PCAP
  1665. Free(data);
  1666. }
  1667. // Open ETH by using IP raw packets
  1668. ETH *OpenEthLinuxIpRaw()
  1669. {
  1670. ETH *e;
  1671. if (IsRawIpBridgeSupported() == false)
  1672. {
  1673. return NULL;
  1674. }
  1675. e = ZeroMalloc(sizeof(ETH));
  1676. e->IsRawIpMode = true;
  1677. e->RawTcp = NewUDP4(MAKE_SPECIAL_PORT(IPPROTO_TCP), NULL);
  1678. e->RawUdp = NewUDP4(MAKE_SPECIAL_PORT(IPPROTO_UDP), NULL);
  1679. e->RawIcmp = NewUDP4(MAKE_SPECIAL_PORT(IPPROTO_ICMP), NULL);
  1680. if (e->RawTcp == NULL || e->RawUdp == NULL || e->RawIcmp == NULL)
  1681. {
  1682. ReleaseSock(e->RawTcp);
  1683. ReleaseSock(e->RawUdp);
  1684. ReleaseSock(e->RawIcmp);
  1685. Free(e);
  1686. return NULL;
  1687. }
  1688. ClearSockDfBit(e->RawTcp);
  1689. ClearSockDfBit(e->RawUdp);
  1690. ClearSockDfBit(e->RawIcmp);
  1691. SetRawSockHeaderIncludeOption(e->RawTcp, true);
  1692. SetRawSockHeaderIncludeOption(e->RawUdp, true);
  1693. SetRawSockHeaderIncludeOption(e->RawIcmp, true);
  1694. e->Name = CopyStr(BRIDGE_SPECIAL_IPRAW_NAME);
  1695. e->Title = CopyStr(BRIDGE_SPECIAL_IPRAW_NAME);
  1696. e->Cancel = NewCancel();
  1697. UnixDeletePipe(e->Cancel->pipe_read, e->Cancel->pipe_write);
  1698. e->Cancel->pipe_read = e->Cancel->pipe_write = -1;
  1699. UnixSetSocketNonBlockingMode(e->RawTcp->socket, true);
  1700. UnixSetSocketNonBlockingMode(e->RawUdp->socket, true);
  1701. UnixSetSocketNonBlockingMode(e->RawIcmp->socket, true);
  1702. e->Cancel->SpecialFlag = true;
  1703. e->Cancel->pipe_read = e->RawTcp->socket;
  1704. e->Cancel->pipe_special_read2 = e->RawUdp->socket;
  1705. e->Cancel->pipe_special_read3 = e->RawIcmp->socket;
  1706. e->RawIpMyMacAddr[2] = 0x01;
  1707. e->RawIpMyMacAddr[5] = 0x01;
  1708. SetIP(&e->MyIP, 10, 171, 7, 253);
  1709. SetIP(&e->YourIP, 10, 171, 7, 254);
  1710. e->RawIpSendQueue = NewQueueFast();
  1711. e->RawIP_TmpBufferSize = 67000;
  1712. e->RawIP_TmpBuffer = Malloc(e->RawIP_TmpBufferSize);
  1713. return e;
  1714. }
  1715. // Close ETH by using IP raw packets
  1716. void CloseEthLinuxIpRaw(ETH *e)
  1717. {
  1718. if (e == NULL)
  1719. {
  1720. return;
  1721. }
  1722. while (true)
  1723. {
  1724. BUF *buf = GetNext(e->RawIpSendQueue);
  1725. if (buf == NULL)
  1726. {
  1727. break;
  1728. }
  1729. FreeBuf(buf);
  1730. }
  1731. ReleaseQueue(e->RawIpSendQueue);
  1732. Free(e->Name);
  1733. Free(e->Title);
  1734. ReleaseSock(e->RawTcp);
  1735. ReleaseSock(e->RawUdp);
  1736. ReleaseSock(e->RawIcmp);
  1737. ReleaseCancel(e->Cancel);
  1738. Free(e->RawIP_TmpBuffer);
  1739. Free(e);
  1740. }
  1741. // Receive an IP raw packet
  1742. UINT EthGetPacketLinuxIpRaw(ETH *e, void **data)
  1743. {
  1744. UINT r;
  1745. BUF *b;
  1746. // Validate arguments
  1747. if (e == NULL || data == NULL)
  1748. {
  1749. return INFINITE;
  1750. }
  1751. if (e->RawIp_HasError)
  1752. {
  1753. return INFINITE;
  1754. }
  1755. b = GetNext(e->RawIpSendQueue);
  1756. if (b != NULL)
  1757. {
  1758. UINT size;
  1759. *data = b->Buf;
  1760. size = b->Size;
  1761. Free(b);
  1762. return size;
  1763. }
  1764. r = EthGetPacketLinuxIpRawForSock(e, data, e->RawTcp, IP_PROTO_TCP);
  1765. if (r == 0)
  1766. {
  1767. r = EthGetPacketLinuxIpRawForSock(e, data, e->RawUdp, IP_PROTO_UDP);
  1768. if (r == 0)
  1769. {
  1770. r = EthGetPacketLinuxIpRawForSock(e, data, e->RawIcmp, IP_PROTO_ICMPV4);
  1771. }
  1772. }
  1773. if (r == INFINITE)
  1774. {
  1775. e->RawIp_HasError = true;
  1776. }
  1777. return r;
  1778. }
  1779. // Receive an IP raw packet for the specified socket
  1780. UINT EthGetPacketLinuxIpRawForSock(ETH *e, void **data, SOCK *s, UINT proto)
  1781. {
  1782. UCHAR *tmp;
  1783. UINT r;
  1784. IP src_addr;
  1785. UINT src_port;
  1786. UINT ret = INFINITE;
  1787. UCHAR *retbuf;
  1788. PKT *p;
  1789. bool ok = false;
  1790. // Validate arguments
  1791. if (e == NULL || data == NULL)
  1792. {
  1793. return INFINITE;
  1794. }
  1795. tmp = e->RawIP_TmpBuffer;
  1796. LABEL_RETRY:
  1797. *data = NULL;
  1798. r = RecvFrom(s, &src_addr, &src_port, tmp, e->RawIP_TmpBufferSize);
  1799. if (r == SOCK_LATER)
  1800. {
  1801. return 0;
  1802. }
  1803. if (r == 0)
  1804. {
  1805. if (s->IgnoreRecvErr)
  1806. {
  1807. return 0;
  1808. }
  1809. else
  1810. {
  1811. return INFINITE;
  1812. }
  1813. }
  1814. ret = 14 + r;
  1815. retbuf = Malloc(ret);
  1816. *data = retbuf;
  1817. Copy(retbuf, e->RawIpYourMacAddr, 6);
  1818. Copy(retbuf + 6, e->RawIpMyMacAddr, 6);
  1819. retbuf[12] = 0x08;
  1820. retbuf[13] = 0x00;
  1821. Copy(retbuf + 14, tmp, r);
  1822. // Mangle packet
  1823. p = ParsePacket(retbuf, ret);
  1824. if (p != NULL)
  1825. {
  1826. if (p->TypeL3 == L3_IPV4)
  1827. {
  1828. IPV4_HEADER *ip;
  1829. IP original_dest_ip;
  1830. ip = p->L3.IPv4Header;
  1831. UINTToIP(&original_dest_ip, ip->DstIP);
  1832. if (IsZeroIP(&e->MyPhysicalIPForce) == false && CmpIpAddr(&e->MyPhysicalIPForce, &original_dest_ip) == 0 ||
  1833. (IsIPMyHost(&original_dest_ip) && IsLocalHostIP(&original_dest_ip) == false && IsHostIPAddress4(&original_dest_ip)))
  1834. {
  1835. if (IsZeroIP(&e->MyPhysicalIPForce) && CmpIpAddr(&e->MyPhysicalIP, &original_dest_ip) != 0)
  1836. {
  1837. // Update MyPhysicalIP
  1838. Copy(&e->MyPhysicalIP, &original_dest_ip, sizeof(IP));
  1839. // Debug("e->MyPhysicalIP = %r\n", &e->MyPhysicalIP);
  1840. }
  1841. if (IsZeroIP(&e->MyPhysicalIPForce) == false)
  1842. {
  1843. Copy(&e->MyPhysicalIP, &e->MyPhysicalIPForce, sizeof(IP));
  1844. }
  1845. ip->DstIP = IPToUINT(&e->YourIP);
  1846. ip->Checksum = 0;
  1847. ip->Checksum = IpChecksum(ip, IPV4_GET_HEADER_LEN(ip) * 5);
  1848. if (p->TypeL4 == L4_TCP)
  1849. {
  1850. TCP_HEADER *tcp = p->L4.TCPHeader;
  1851. /*
  1852. if (Endian16(tcp->SrcPort) == 80)
  1853. {
  1854. IP a, b;
  1855. UINTToIP(&a, ip->SrcIP);
  1856. UINTToIP(&b, ip->DstIP);
  1857. Debug("%r %r %u %u\n", &a, &b, Endian16(tcp->SrcPort), Endian16(tcp->DstPort));
  1858. }*/
  1859. ok = true;
  1860. }
  1861. else if (p->TypeL4 == L4_UDP)
  1862. {
  1863. UDP_HEADER *udp = p->L4.UDPHeader;
  1864. udp->Checksum = 0;
  1865. ok = true;
  1866. }
  1867. else if (p->TypeL4 == L4_ICMPV4)
  1868. {
  1869. ICMP_HEADER *icmp = p->L4.ICMPHeader;
  1870. if (icmp->Type == ICMP_TYPE_DESTINATION_UNREACHABLE || icmp->Type == ICMP_TYPE_TIME_EXCEEDED)
  1871. {
  1872. // Rewrite the Src IP of the IPv4 header of the ICMP response packet
  1873. UINT size = p->PacketSize - ((UCHAR *)icmp - (UCHAR *)p->PacketData);
  1874. UCHAR *data = (UCHAR *)icmp;
  1875. IPV4_HEADER *orig_ipv4 = (IPV4_HEADER *)(((UCHAR *)data) + sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO));
  1876. UINT orig_ipv4_size = size - (sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO));
  1877. UINT orig_ipv4_header_size = GetIpHeaderSize((UCHAR *)orig_ipv4, orig_ipv4_size);
  1878. if (orig_ipv4_header_size >= sizeof(IPV4_HEADER) && orig_ipv4_size >= orig_ipv4_header_size)
  1879. {
  1880. if (orig_ipv4->Protocol == IP_PROTO_ICMPV4)
  1881. {
  1882. // Search the inner ICMP header
  1883. UINT inner_icmp_size = orig_ipv4_size - orig_ipv4_header_size;
  1884. if (inner_icmp_size >= (sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO)))
  1885. {
  1886. ICMP_HEADER *inner_icmp = (ICMP_HEADER *)(((UCHAR *)data) +
  1887. sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO) + orig_ipv4_header_size);
  1888. if (inner_icmp->Type == ICMP_TYPE_ECHO_REQUEST)
  1889. {
  1890. ICMP_ECHO *inner_echo = (ICMP_ECHO *)(((UCHAR *)inner_icmp) + sizeof(ICMP_HEADER));
  1891. inner_icmp->Checksum = 0;
  1892. orig_ipv4->SrcIP = IPToUINT(&e->YourIP);
  1893. orig_ipv4->Checksum = 0;
  1894. orig_ipv4->Checksum = IpChecksum(orig_ipv4, orig_ipv4_header_size);
  1895. // Rewrite the outer ICMP header
  1896. if (true)
  1897. {
  1898. UCHAR *payload;
  1899. UINT payload_size;
  1900. ICMP_ECHO *echo;
  1901. // Echo Response
  1902. echo = (ICMP_ECHO *)(((UCHAR *)data) + sizeof(ICMP_HEADER));
  1903. if (size >= (sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO)))
  1904. {
  1905. payload = ((UCHAR *)data) + sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO);
  1906. payload_size = size - (sizeof(ICMP_HEADER) + sizeof(ICMP_ECHO));
  1907. // Rewrite the header
  1908. icmp->Checksum = 0;
  1909. icmp->Checksum = IpChecksum(icmp, size);
  1910. }
  1911. }
  1912. }
  1913. }
  1914. }
  1915. }
  1916. }
  1917. icmp->Checksum = 0;
  1918. icmp->Checksum = IpChecksum(icmp, p->PayloadSize);
  1919. ok = true;
  1920. }
  1921. else if (p->TypeL4 == L4_FRAGMENT)
  1922. {
  1923. ok = true;
  1924. }
  1925. }
  1926. }
  1927. FreePacket(p);
  1928. }
  1929. if (ok == false)
  1930. {
  1931. Free(*data);
  1932. *data = NULL;
  1933. goto LABEL_RETRY;
  1934. }
  1935. return ret;
  1936. }
  1937. // Send internal IP packet (insert into the send queue)
  1938. void EthSendIpPacketInnerIpRaw(ETH *e, void *data, UINT size, USHORT protocol)
  1939. {
  1940. BUF *b;
  1941. if (e == NULL || data == NULL || size == 0)
  1942. {
  1943. return;
  1944. }
  1945. if (e->RawIpSendQueue->num_item >= 1024)
  1946. {
  1947. return;
  1948. }
  1949. b = NewBuf();
  1950. WriteBuf(b, e->RawIpYourMacAddr, 6);
  1951. WriteBuf(b, e->RawIpMyMacAddr, 6);
  1952. WriteBufShort(b, protocol);
  1953. WriteBuf(b, data, size);
  1954. SeekBufToBegin(b);
  1955. InsertQueue(e->RawIpSendQueue, b);
  1956. }
  1957. // Process the packet internal if necessary
  1958. bool EthProcessIpPacketInnerIpRaw(ETH *e, PKT *p)
  1959. {
  1960. bool ret = false;
  1961. if (e == NULL || p == NULL)
  1962. {
  1963. return false;
  1964. }
  1965. if (p->TypeL3 == L3_ARPV4)
  1966. {
  1967. // ARP processing
  1968. ARPV4_HEADER *arp = p->L3.ARPv4Header;
  1969. if (Endian16(arp->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET &&
  1970. Endian16(arp->ProtocolType) == MAC_PROTO_IPV4 &&
  1971. arp->HardwareSize == 6 && arp->ProtocolType == 4)
  1972. {
  1973. if (IPToUINT(&e->MyIP) == arp->TargetIP)
  1974. {
  1975. if (Endian16(arp->Operation) == ARP_OPERATION_REQUEST)
  1976. {
  1977. ARPV4_HEADER r;
  1978. Zero(&r, sizeof(r));
  1979. r.HardwareType = Endian16(ARP_HARDWARE_TYPE_ETHERNET);
  1980. r.ProtocolType = Endian16(MAC_PROTO_IPV4);
  1981. r.HardwareSize = 6;
  1982. r.ProtocolSize = 4;
  1983. r.Operation = Endian16(ARP_OPERATION_RESPONSE);
  1984. Copy(r.SrcAddress, e->RawIpMyMacAddr, 6);
  1985. Copy(r.TargetAddress, arp->SrcAddress, 6);
  1986. r.SrcIP = IPToUINT(&e->MyIP);
  1987. r.TargetIP = arp->SrcIP;
  1988. EthSendIpPacketInnerIpRaw(e, &r, sizeof(ARPV4_HEADER), MAC_PROTO_ARPV4);
  1989. }
  1990. }
  1991. }
  1992. }
  1993. else if (p->TypeL3 == L3_IPV4 && p->TypeL4 == L4_UDP && p->TypeL7 == L7_DHCPV4)
  1994. {
  1995. // DHCP processing
  1996. DHCPV4_HEADER *dhcp;
  1997. UCHAR *data;
  1998. UINT size;
  1999. UINT dhcp_header_size;
  2000. UINT dhcp_data_offset;
  2001. UINT tran_id;
  2002. UINT magic_cookie = Endian32(DHCP_MAGIC_COOKIE);
  2003. bool ok;
  2004. DHCP_OPTION_LIST *opt;
  2005. dhcp = p->L7.DHCPv4Header;
  2006. tran_id = Endian32(dhcp->TransactionId);
  2007. // Get the DHCP data and size
  2008. dhcp_header_size = sizeof(DHCPV4_HEADER);
  2009. dhcp_data_offset = (UINT)(((UCHAR *)p->L7.DHCPv4Header) - ((UCHAR *)p->MacHeader) + dhcp_header_size);
  2010. data = ((UCHAR *)dhcp) + dhcp_header_size;
  2011. size = p->PacketSize - dhcp_data_offset;
  2012. if (dhcp_header_size < 5)
  2013. {
  2014. // Data size is invalid
  2015. return false;
  2016. }
  2017. // Search for Magic Cookie
  2018. ok = false;
  2019. while (size >= 5)
  2020. {
  2021. if (Cmp(data, &magic_cookie, sizeof(magic_cookie)) == 0)
  2022. {
  2023. // Found
  2024. data += 4;
  2025. size -= 4;
  2026. ok = true;
  2027. break;
  2028. }
  2029. data++;
  2030. size--;
  2031. }
  2032. if (ok == false)
  2033. {
  2034. // The packet is invalid
  2035. return false;
  2036. }
  2037. // Parse DHCP options list
  2038. opt = ParseDhcpOptionList(data, size);
  2039. if (opt == NULL)
  2040. {
  2041. // The packet is invalid
  2042. return false;
  2043. }
  2044. if (dhcp->OpCode == 1 && (opt->Opcode == DHCP_DISCOVER || opt->Opcode == DHCP_REQUEST || opt->Opcode == DHCP_INFORM))
  2045. {
  2046. // Operate as the server
  2047. UINT ip = IPToUINT(&e->YourIP);
  2048. if (ip != 0 || opt->Opcode == DHCP_INFORM)
  2049. {
  2050. // Respond if there is providable IP address
  2051. DHCP_OPTION_LIST ret;
  2052. LIST *o;
  2053. UINT hw_type = 0U;
  2054. UINT hw_addr_size = 0U;
  2055. UINT new_ip = ip;
  2056. IP default_dns;
  2057. Zero(&default_dns, sizeof(default_dns));
  2058. Zero(&ret, sizeof(ret));
  2059. ret.Opcode = (opt->Opcode == DHCP_DISCOVER ? DHCP_OFFER : DHCP_ACK);
  2060. ret.ServerAddress = IPToUINT(&e->MyIP);
  2061. ret.LeaseTime = 3600;
  2062. if (opt->Opcode == DHCP_INFORM)
  2063. {
  2064. ret.LeaseTime = 0;
  2065. }
  2066. ret.SubnetMask = SetIP32(255, 255, 255, 252);
  2067. if (UnixGetDefaultDns(&default_dns) && IsZeroIp(&default_dns) == false)
  2068. {
  2069. ret.DnsServer = IPToUINT(&default_dns);
  2070. ret.DnsServer2 = SetIP32(8, 8, 8, 8);
  2071. }
  2072. else
  2073. {
  2074. ret.DnsServer = SetIP32(8, 8, 8, 8);
  2075. ret.DnsServer2 = SetIP32(8, 8, 4, 4);
  2076. }
  2077. ret.Gateway = IPToUINT(&e->MyIP);
  2078. if (opt->Opcode != DHCP_INFORM)
  2079. {
  2080. char client_mac[MAX_SIZE];
  2081. char client_ip[64];
  2082. IP ips;
  2083. BinToStr(client_mac, sizeof(client_mac), p->MacAddressSrc, 6);
  2084. UINTToIP(&ips, ip);
  2085. IPToStr(client_ip, sizeof(client_ip), &ips);
  2086. Debug("IP_RAW: DHCP %s : %s given %s\n",
  2087. ret.Opcode == DHCP_OFFER ? "DHCP_OFFER" : "DHCP_ACK",
  2088. client_mac, client_ip);
  2089. }
  2090. // Build a DHCP option
  2091. o = BuildDhcpOption(&ret);
  2092. if (o != NULL)
  2093. {
  2094. BUF *b = BuildDhcpOptionsBuf(o);
  2095. if (b != NULL)
  2096. {
  2097. UINT dest_ip = p->L3.IPv4Header->SrcIP;
  2098. UINT blank_size = 128 + 64;
  2099. UINT dhcp_packet_size;
  2100. UINT magic = Endian32(DHCP_MAGIC_COOKIE);
  2101. DHCPV4_HEADER *dhcp;
  2102. void *magic_cookie_addr;
  2103. void *buffer_addr;
  2104. if (dest_ip == 0)
  2105. {
  2106. dest_ip = 0xffffffff;
  2107. }
  2108. // Calculate the DHCP packet size
  2109. dhcp_packet_size = blank_size + sizeof(DHCPV4_HEADER) + sizeof(magic) + b->Size;
  2110. if (dhcp_packet_size < DHCP_MIN_SIZE)
  2111. {
  2112. // Padding
  2113. dhcp_packet_size = DHCP_MIN_SIZE;
  2114. }
  2115. // Create a header
  2116. dhcp = ZeroMalloc(dhcp_packet_size);
  2117. dhcp->OpCode = 2;
  2118. dhcp->HardwareType = hw_type;
  2119. dhcp->HardwareAddressSize = hw_addr_size;
  2120. dhcp->Hops = 0;
  2121. dhcp->TransactionId = Endian32(tran_id);
  2122. dhcp->Seconds = 0;
  2123. dhcp->Flags = 0;
  2124. dhcp->YourIP = new_ip;
  2125. dhcp->ServerIP = IPToUINT(&e->MyIP);
  2126. Copy(dhcp->ClientMacAddress, p->MacAddressSrc, 6);
  2127. // Calculate the address
  2128. magic_cookie_addr = (((UCHAR *)dhcp) + sizeof(DHCPV4_HEADER) + blank_size);
  2129. buffer_addr = ((UCHAR *)magic_cookie_addr) + sizeof(magic);
  2130. // Magic Cookie
  2131. Copy(magic_cookie_addr, &magic, sizeof(magic));
  2132. // Buffer
  2133. Copy(buffer_addr, b->Buf, b->Size);
  2134. if (true)
  2135. {
  2136. UCHAR *data = ZeroMalloc(sizeof(IPV4_HEADER) + sizeof(UDP_HEADER) + dhcp_packet_size);
  2137. IPV4_HEADER *ipv4 = (IPV4_HEADER *)(data);
  2138. UDP_HEADER *udp = (UDP_HEADER *)(data + sizeof(IPV4_HEADER));
  2139. Copy(data + sizeof(IPV4_HEADER) + sizeof(UDP_HEADER), dhcp, dhcp_packet_size);
  2140. IPV4_SET_VERSION(ipv4, 4);
  2141. IPV4_SET_HEADER_LEN(ipv4, 5);
  2142. ipv4->TotalLength = Endian16(sizeof(IPV4_HEADER) + sizeof(UDP_HEADER) + dhcp_packet_size);
  2143. ipv4->TimeToLive = 63;
  2144. ipv4->Protocol = IP_PROTO_UDP;
  2145. ipv4->SrcIP = IPToUINT(&e->MyIP);
  2146. ipv4->DstIP = dest_ip;
  2147. ipv4->Checksum = IpChecksum(ipv4, sizeof(IPV4_HEADER));
  2148. udp->SrcPort = Endian16(NAT_DHCP_SERVER_PORT);
  2149. udp->DstPort = Endian16(NAT_DHCP_CLIENT_PORT);
  2150. udp->PacketLength = Endian16(sizeof(UDP_HEADER) + dhcp_packet_size);
  2151. udp->Checksum = CalcChecksumForIPv4(ipv4->SrcIP, ipv4->DstIP, IP_PROTO_UDP,
  2152. dhcp, dhcp_packet_size, 0);
  2153. if (udp->Checksum == 0)
  2154. {
  2155. udp->Checksum = 0xffff;
  2156. }
  2157. EthSendIpPacketInnerIpRaw(e, data, sizeof(IPV4_HEADER) + sizeof(UDP_HEADER) + dhcp_packet_size, MAC_PROTO_IPV4);
  2158. Free(data);
  2159. }
  2160. // Release the memory
  2161. Free(dhcp);
  2162. FreeBuf(b);
  2163. }
  2164. FreeDhcpOptions(o);
  2165. }
  2166. }
  2167. }
  2168. Free(opt);
  2169. }
  2170. return ret;
  2171. }
  2172. // Send an IP raw packet
  2173. void EthPutPacketLinuxIpRaw(ETH *e, void *data, UINT size)
  2174. {
  2175. PKT *p;
  2176. SOCK *s = NULL;
  2177. // Validate arguments
  2178. if (e == NULL || data == NULL)
  2179. {
  2180. return;
  2181. }
  2182. if (size < 14 || size > MAX_PACKET_SIZE || e->RawIp_HasError)
  2183. {
  2184. Free(data);
  2185. return;
  2186. }
  2187. p = ParsePacket(data, size);
  2188. if (p == NULL)
  2189. {
  2190. Free(data);
  2191. return;
  2192. }
  2193. if (p->BroadcastPacket || Cmp(p->MacAddressDest, e->RawIpMyMacAddr, 6) == 0)
  2194. {
  2195. if (IsMacUnicast(p->MacAddressSrc))
  2196. {
  2197. Copy(e->RawIpYourMacAddr, p->MacAddressSrc, 6);
  2198. }
  2199. }
  2200. if (IsZero(e->RawIpYourMacAddr, 6) || IsMacUnicast(p->MacAddressSrc) == false ||
  2201. (p->BroadcastPacket == false && Cmp(p->MacAddressDest, e->RawIpMyMacAddr, 6) != 0))
  2202. {
  2203. Free(data);
  2204. FreePacket(p);
  2205. return;
  2206. }
  2207. if (p->TypeL3 == L3_IPV4)
  2208. {
  2209. if (p->TypeL4 == L4_TCP)
  2210. {
  2211. if (IsZeroIP(&e->MyPhysicalIP) == false)
  2212. {
  2213. s = e->RawTcp;
  2214. }
  2215. }
  2216. else if (p->TypeL4 == L4_UDP)
  2217. {
  2218. if (EthProcessIpPacketInnerIpRaw(e, p) == false)
  2219. {
  2220. s = e->RawUdp;
  2221. }
  2222. }
  2223. else if (p->TypeL4 == L4_ICMPV4)
  2224. {
  2225. if (IsZeroIP(&e->MyPhysicalIP) == false)
  2226. {
  2227. s = e->RawIcmp;
  2228. }
  2229. }
  2230. else if (p->TypeL4 == L4_FRAGMENT)
  2231. {
  2232. if (IsZeroIP(&e->MyPhysicalIP) == false)
  2233. {
  2234. s = e->RawIcmp;
  2235. }
  2236. }
  2237. }
  2238. else if (p->TypeL3 == L3_ARPV4)
  2239. {
  2240. EthProcessIpPacketInnerIpRaw(e, p);
  2241. }
  2242. if (s != NULL && p->L3.IPv4Header->DstIP != 0xffffffff && p->BroadcastPacket == false &&
  2243. p->L3.IPv4Header->SrcIP == IPToUINT(&e->YourIP))
  2244. {
  2245. UCHAR *send_data = p->IPv4PayloadData;
  2246. UCHAR *head = p->PacketData;
  2247. UINT remove_header_size = (UINT)(send_data - head);
  2248. if (p->PacketSize > remove_header_size)
  2249. {
  2250. IP dest;
  2251. UINT send_data_size = p->PacketSize - remove_header_size;
  2252. // checksum
  2253. if (p->TypeL4 == L4_UDP)
  2254. {
  2255. p->L4.UDPHeader->Checksum = 0;
  2256. }
  2257. else if (p->TypeL4 == L4_TCP)
  2258. {
  2259. p->L4.TCPHeader->Checksum = 0;
  2260. p->L4.TCPHeader->Checksum = CalcChecksumForIPv4(IPToUINT(&e->MyPhysicalIP),
  2261. p->L3.IPv4Header->DstIP, IP_PROTO_TCP,
  2262. p->L4.TCPHeader, p->IPv4PayloadSize, 0);
  2263. }
  2264. UINTToIP(&dest, p->L3.IPv4Header->DstIP);
  2265. if (s->RawIP_HeaderIncludeFlag == false)
  2266. {
  2267. SendTo(s, &dest, 0, send_data, send_data_size);
  2268. }
  2269. else
  2270. {
  2271. IPV4_HEADER *ip = p->L3.IPv4Header;
  2272. ip->SrcIP = IPToUINT(&e->MyPhysicalIP);
  2273. ip->Checksum = 0;
  2274. ip->Checksum = IpChecksum(ip, IPV4_GET_HEADER_LEN(ip) * 4);
  2275. SendTo(s, &dest, 0, ip, ((UCHAR *)p->PacketData - (UCHAR *)ip) + p->PacketSize);
  2276. }
  2277. }
  2278. }
  2279. FreePacket(p);
  2280. Free(data);
  2281. }
  2282. #endif