nettest.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* nettest - used for functional tests of networking APIs
  3. *
  4. * Copyright (c) 2013-2019 David Ahern <[email protected]>. All rights reserved.
  5. */
  6. #define _GNU_SOURCE
  7. #include <features.h>
  8. #include <sys/types.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/socket.h>
  11. #include <sys/wait.h>
  12. #include <linux/tcp.h>
  13. #include <linux/udp.h>
  14. #include <arpa/inet.h>
  15. #include <net/if.h>
  16. #include <netinet/in.h>
  17. #include <netinet/ip.h>
  18. #include <netdb.h>
  19. #include <fcntl.h>
  20. #include <libgen.h>
  21. #include <limits.h>
  22. #include <sched.h>
  23. #include <stdarg.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <unistd.h>
  28. #include <time.h>
  29. #include <errno.h>
  30. #include <getopt.h>
  31. #include <linux/xfrm.h>
  32. #include <linux/ipsec.h>
  33. #include <linux/pfkeyv2.h>
  34. #ifndef IPV6_UNICAST_IF
  35. #define IPV6_UNICAST_IF 76
  36. #endif
  37. #ifndef IPV6_MULTICAST_IF
  38. #define IPV6_MULTICAST_IF 17
  39. #endif
  40. #define DEFAULT_PORT 12345
  41. #define NS_PREFIX "/run/netns/"
  42. #ifndef MAX
  43. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  44. #endif
  45. #ifndef MIN
  46. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  47. #endif
  48. struct sock_args {
  49. /* local address */
  50. const char *local_addr_str;
  51. const char *client_local_addr_str;
  52. union {
  53. struct in_addr in;
  54. struct in6_addr in6;
  55. } local_addr;
  56. /* remote address */
  57. const char *remote_addr_str;
  58. union {
  59. struct in_addr in;
  60. struct in6_addr in6;
  61. } remote_addr;
  62. int scope_id; /* remote scope; v6 send only */
  63. struct in_addr grp; /* multicast group */
  64. unsigned int has_local_ip:1,
  65. has_remote_ip:1,
  66. has_grp:1,
  67. has_expected_laddr:1,
  68. has_expected_raddr:1,
  69. bind_test_only:1;
  70. unsigned short port;
  71. int type; /* DGRAM, STREAM, RAW */
  72. int protocol;
  73. int version; /* AF_INET/AF_INET6 */
  74. int use_setsockopt;
  75. int use_freebind;
  76. int use_cmsg;
  77. const char *dev;
  78. const char *server_dev;
  79. int ifindex;
  80. const char *clientns;
  81. const char *serverns;
  82. const char *password;
  83. const char *client_pw;
  84. /* prefix for MD5 password */
  85. const char *md5_prefix_str;
  86. union {
  87. struct sockaddr_in v4;
  88. struct sockaddr_in6 v6;
  89. } md5_prefix;
  90. unsigned int prefix_len;
  91. /* 0: default, -1: force off, +1: force on */
  92. int bind_key_ifindex;
  93. /* expected addresses and device index for connection */
  94. const char *expected_dev;
  95. const char *expected_server_dev;
  96. int expected_ifindex;
  97. /* local address */
  98. const char *expected_laddr_str;
  99. union {
  100. struct in_addr in;
  101. struct in6_addr in6;
  102. } expected_laddr;
  103. /* remote address */
  104. const char *expected_raddr_str;
  105. union {
  106. struct in_addr in;
  107. struct in6_addr in6;
  108. } expected_raddr;
  109. /* ESP in UDP encap test */
  110. int use_xfrm;
  111. /* use send() and connect() instead of sendto */
  112. int datagram_connect;
  113. };
  114. static int server_mode;
  115. static unsigned int prog_timeout = 5;
  116. static unsigned int interactive;
  117. static int iter = 1;
  118. static char *msg = "Hello world!";
  119. static int msglen;
  120. static int quiet;
  121. static int try_broadcast = 1;
  122. static char *timestamp(char *timebuf, int buflen)
  123. {
  124. time_t now;
  125. now = time(NULL);
  126. if (strftime(timebuf, buflen, "%T", localtime(&now)) == 0) {
  127. memset(timebuf, 0, buflen);
  128. strncpy(timebuf, "00:00:00", buflen-1);
  129. }
  130. return timebuf;
  131. }
  132. static void log_msg(const char *format, ...)
  133. {
  134. char timebuf[64];
  135. va_list args;
  136. if (quiet)
  137. return;
  138. fprintf(stdout, "%s %s:",
  139. timestamp(timebuf, sizeof(timebuf)),
  140. server_mode ? "server" : "client");
  141. va_start(args, format);
  142. vfprintf(stdout, format, args);
  143. va_end(args);
  144. fflush(stdout);
  145. }
  146. static void log_error(const char *format, ...)
  147. {
  148. char timebuf[64];
  149. va_list args;
  150. if (quiet)
  151. return;
  152. fprintf(stderr, "%s %s:",
  153. timestamp(timebuf, sizeof(timebuf)),
  154. server_mode ? "server" : "client");
  155. va_start(args, format);
  156. vfprintf(stderr, format, args);
  157. va_end(args);
  158. fflush(stderr);
  159. }
  160. static void log_err_errno(const char *fmt, ...)
  161. {
  162. char timebuf[64];
  163. va_list args;
  164. if (quiet)
  165. return;
  166. fprintf(stderr, "%s %s: ",
  167. timestamp(timebuf, sizeof(timebuf)),
  168. server_mode ? "server" : "client");
  169. va_start(args, fmt);
  170. vfprintf(stderr, fmt, args);
  171. va_end(args);
  172. fprintf(stderr, ": %d: %s\n", errno, strerror(errno));
  173. fflush(stderr);
  174. }
  175. static void log_address(const char *desc, struct sockaddr *sa)
  176. {
  177. char addrstr[64];
  178. if (quiet)
  179. return;
  180. if (sa->sa_family == AF_INET) {
  181. struct sockaddr_in *s = (struct sockaddr_in *) sa;
  182. log_msg("%s %s:%d\n",
  183. desc,
  184. inet_ntop(AF_INET, &s->sin_addr, addrstr,
  185. sizeof(addrstr)),
  186. ntohs(s->sin_port));
  187. } else if (sa->sa_family == AF_INET6) {
  188. struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
  189. log_msg("%s [%s]:%d\n",
  190. desc,
  191. inet_ntop(AF_INET6, &s6->sin6_addr, addrstr,
  192. sizeof(addrstr)),
  193. ntohs(s6->sin6_port));
  194. }
  195. fflush(stdout);
  196. }
  197. static int switch_ns(const char *ns)
  198. {
  199. char path[PATH_MAX];
  200. int fd, ret;
  201. if (geteuid())
  202. log_error("warning: likely need root to set netns %s!\n", ns);
  203. snprintf(path, sizeof(path), "%s%s", NS_PREFIX, ns);
  204. fd = open(path, 0);
  205. if (fd < 0) {
  206. log_err_errno("Failed to open netns path; can not switch netns");
  207. return 1;
  208. }
  209. ret = setns(fd, CLONE_NEWNET);
  210. close(fd);
  211. return ret;
  212. }
  213. static int tcp_md5sig(int sd, void *addr, socklen_t alen, struct sock_args *args)
  214. {
  215. int keylen = strlen(args->password);
  216. struct tcp_md5sig md5sig = {};
  217. int opt = TCP_MD5SIG;
  218. int rc;
  219. md5sig.tcpm_keylen = keylen;
  220. memcpy(md5sig.tcpm_key, args->password, keylen);
  221. if (args->prefix_len) {
  222. opt = TCP_MD5SIG_EXT;
  223. md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_PREFIX;
  224. md5sig.tcpm_prefixlen = args->prefix_len;
  225. addr = &args->md5_prefix;
  226. }
  227. memcpy(&md5sig.tcpm_addr, addr, alen);
  228. if ((args->ifindex && args->bind_key_ifindex >= 0) || args->bind_key_ifindex >= 1) {
  229. opt = TCP_MD5SIG_EXT;
  230. md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX;
  231. md5sig.tcpm_ifindex = args->ifindex;
  232. log_msg("TCP_MD5SIG_FLAG_IFINDEX set tcpm_ifindex=%d\n", md5sig.tcpm_ifindex);
  233. } else {
  234. log_msg("TCP_MD5SIG_FLAG_IFINDEX off\n", md5sig.tcpm_ifindex);
  235. }
  236. rc = setsockopt(sd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig));
  237. if (rc < 0) {
  238. /* ENOENT is harmless. Returned when a password is cleared */
  239. if (errno == ENOENT)
  240. rc = 0;
  241. else
  242. log_err_errno("setsockopt(TCP_MD5SIG)");
  243. }
  244. return rc;
  245. }
  246. static int tcp_md5_remote(int sd, struct sock_args *args)
  247. {
  248. struct sockaddr_in sin = {
  249. .sin_family = AF_INET,
  250. };
  251. struct sockaddr_in6 sin6 = {
  252. .sin6_family = AF_INET6,
  253. };
  254. void *addr;
  255. int alen;
  256. switch (args->version) {
  257. case AF_INET:
  258. sin.sin_port = htons(args->port);
  259. sin.sin_addr = args->md5_prefix.v4.sin_addr;
  260. addr = &sin;
  261. alen = sizeof(sin);
  262. break;
  263. case AF_INET6:
  264. sin6.sin6_port = htons(args->port);
  265. sin6.sin6_addr = args->md5_prefix.v6.sin6_addr;
  266. addr = &sin6;
  267. alen = sizeof(sin6);
  268. break;
  269. default:
  270. log_error("unknown address family\n");
  271. exit(1);
  272. }
  273. if (tcp_md5sig(sd, addr, alen, args))
  274. return -1;
  275. return 0;
  276. }
  277. static int get_ifidx(const char *ifname)
  278. {
  279. struct ifreq ifdata;
  280. int sd, rc;
  281. if (!ifname || *ifname == '\0')
  282. return -1;
  283. memset(&ifdata, 0, sizeof(ifdata));
  284. strcpy(ifdata.ifr_name, ifname);
  285. sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
  286. if (sd < 0) {
  287. log_err_errno("socket failed");
  288. return -1;
  289. }
  290. rc = ioctl(sd, SIOCGIFINDEX, (char *)&ifdata);
  291. close(sd);
  292. if (rc != 0) {
  293. log_err_errno("ioctl(SIOCGIFINDEX) failed");
  294. return -1;
  295. }
  296. return ifdata.ifr_ifindex;
  297. }
  298. static int bind_to_device(int sd, const char *name)
  299. {
  300. int rc;
  301. rc = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name)+1);
  302. if (rc < 0)
  303. log_err_errno("setsockopt(SO_BINDTODEVICE)");
  304. return rc;
  305. }
  306. static int get_bind_to_device(int sd, char *name, size_t len)
  307. {
  308. int rc;
  309. socklen_t optlen = len;
  310. name[0] = '\0';
  311. rc = getsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, name, &optlen);
  312. if (rc < 0)
  313. log_err_errno("setsockopt(SO_BINDTODEVICE)");
  314. return rc;
  315. }
  316. static int check_device(int sd, struct sock_args *args)
  317. {
  318. int ifindex = 0;
  319. char name[32];
  320. if (get_bind_to_device(sd, name, sizeof(name)))
  321. *name = '\0';
  322. else
  323. ifindex = get_ifidx(name);
  324. log_msg(" bound to device %s/%d\n",
  325. *name ? name : "<none>", ifindex);
  326. if (!args->expected_ifindex)
  327. return 0;
  328. if (args->expected_ifindex != ifindex) {
  329. log_error("Device index mismatch: expected %d have %d\n",
  330. args->expected_ifindex, ifindex);
  331. return 1;
  332. }
  333. log_msg("Device index matches: expected %d have %d\n",
  334. args->expected_ifindex, ifindex);
  335. return 0;
  336. }
  337. static int set_pktinfo_v4(int sd)
  338. {
  339. int one = 1;
  340. int rc;
  341. rc = setsockopt(sd, SOL_IP, IP_PKTINFO, &one, sizeof(one));
  342. if (rc < 0 && rc != -ENOTSUP)
  343. log_err_errno("setsockopt(IP_PKTINFO)");
  344. return rc;
  345. }
  346. static int set_recvpktinfo_v6(int sd)
  347. {
  348. int one = 1;
  349. int rc;
  350. rc = setsockopt(sd, SOL_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
  351. if (rc < 0 && rc != -ENOTSUP)
  352. log_err_errno("setsockopt(IPV6_RECVPKTINFO)");
  353. return rc;
  354. }
  355. static int set_recverr_v4(int sd)
  356. {
  357. int one = 1;
  358. int rc;
  359. rc = setsockopt(sd, SOL_IP, IP_RECVERR, &one, sizeof(one));
  360. if (rc < 0 && rc != -ENOTSUP)
  361. log_err_errno("setsockopt(IP_RECVERR)");
  362. return rc;
  363. }
  364. static int set_recverr_v6(int sd)
  365. {
  366. int one = 1;
  367. int rc;
  368. rc = setsockopt(sd, SOL_IPV6, IPV6_RECVERR, &one, sizeof(one));
  369. if (rc < 0 && rc != -ENOTSUP)
  370. log_err_errno("setsockopt(IPV6_RECVERR)");
  371. return rc;
  372. }
  373. static int set_unicast_if(int sd, int ifindex, int version)
  374. {
  375. int opt = IP_UNICAST_IF;
  376. int level = SOL_IP;
  377. int rc;
  378. ifindex = htonl(ifindex);
  379. if (version == AF_INET6) {
  380. opt = IPV6_UNICAST_IF;
  381. level = SOL_IPV6;
  382. }
  383. rc = setsockopt(sd, level, opt, &ifindex, sizeof(ifindex));
  384. if (rc < 0)
  385. log_err_errno("setsockopt(IP_UNICAST_IF)");
  386. return rc;
  387. }
  388. static int set_multicast_if(int sd, int ifindex)
  389. {
  390. struct ip_mreqn mreq = { .imr_ifindex = ifindex };
  391. int rc;
  392. rc = setsockopt(sd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq));
  393. if (rc < 0)
  394. log_err_errno("setsockopt(IP_MULTICAST_IF)");
  395. return rc;
  396. }
  397. static int set_membership(int sd, uint32_t grp, uint32_t addr, int ifindex)
  398. {
  399. uint32_t if_addr = addr;
  400. struct ip_mreqn mreq;
  401. int rc;
  402. if (addr == htonl(INADDR_ANY) && !ifindex) {
  403. log_error("Either local address or device needs to be given for multicast membership\n");
  404. return -1;
  405. }
  406. mreq.imr_multiaddr.s_addr = grp;
  407. mreq.imr_address.s_addr = if_addr;
  408. mreq.imr_ifindex = ifindex;
  409. rc = setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
  410. if (rc < 0) {
  411. log_err_errno("setsockopt(IP_ADD_MEMBERSHIP)");
  412. return -1;
  413. }
  414. return 0;
  415. }
  416. static int set_freebind(int sd, int version)
  417. {
  418. unsigned int one = 1;
  419. int rc = 0;
  420. switch (version) {
  421. case AF_INET:
  422. if (setsockopt(sd, SOL_IP, IP_FREEBIND, &one, sizeof(one))) {
  423. log_err_errno("setsockopt(IP_FREEBIND)");
  424. rc = -1;
  425. }
  426. break;
  427. case AF_INET6:
  428. if (setsockopt(sd, SOL_IPV6, IPV6_FREEBIND, &one, sizeof(one))) {
  429. log_err_errno("setsockopt(IPV6_FREEBIND");
  430. rc = -1;
  431. }
  432. break;
  433. }
  434. return rc;
  435. }
  436. static int set_broadcast(int sd)
  437. {
  438. unsigned int one = 1;
  439. int rc = 0;
  440. if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) != 0) {
  441. log_err_errno("setsockopt(SO_BROADCAST)");
  442. rc = -1;
  443. }
  444. return rc;
  445. }
  446. static int set_reuseport(int sd)
  447. {
  448. unsigned int one = 1;
  449. int rc = 0;
  450. if (setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) != 0) {
  451. log_err_errno("setsockopt(SO_REUSEPORT)");
  452. rc = -1;
  453. }
  454. return rc;
  455. }
  456. static int set_reuseaddr(int sd)
  457. {
  458. unsigned int one = 1;
  459. int rc = 0;
  460. if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) != 0) {
  461. log_err_errno("setsockopt(SO_REUSEADDR)");
  462. rc = -1;
  463. }
  464. return rc;
  465. }
  466. static int str_to_uint(const char *str, int min, int max, unsigned int *value)
  467. {
  468. int number;
  469. char *end;
  470. errno = 0;
  471. number = (unsigned int) strtoul(str, &end, 0);
  472. /* entire string should be consumed by conversion
  473. * and value should be between min and max
  474. */
  475. if (((*end == '\0') || (*end == '\n')) && (end != str) &&
  476. (errno != ERANGE) && (min <= number) && (number <= max)) {
  477. *value = number;
  478. return 0;
  479. }
  480. return -1;
  481. }
  482. static int resolve_devices(struct sock_args *args)
  483. {
  484. if (args->dev) {
  485. args->ifindex = get_ifidx(args->dev);
  486. if (args->ifindex < 0) {
  487. log_error("Invalid device name\n");
  488. return 1;
  489. }
  490. }
  491. if (args->expected_dev) {
  492. unsigned int tmp;
  493. if (str_to_uint(args->expected_dev, 0, INT_MAX, &tmp) == 0) {
  494. args->expected_ifindex = (int)tmp;
  495. } else {
  496. args->expected_ifindex = get_ifidx(args->expected_dev);
  497. if (args->expected_ifindex < 0) {
  498. fprintf(stderr, "Invalid expected device\n");
  499. return 1;
  500. }
  501. }
  502. }
  503. return 0;
  504. }
  505. static int expected_addr_match(struct sockaddr *sa, void *expected,
  506. const char *desc)
  507. {
  508. char addrstr[64];
  509. int rc = 0;
  510. if (sa->sa_family == AF_INET) {
  511. struct sockaddr_in *s = (struct sockaddr_in *) sa;
  512. struct in_addr *exp_in = (struct in_addr *) expected;
  513. if (s->sin_addr.s_addr != exp_in->s_addr) {
  514. log_error("%s address does not match expected %s\n",
  515. desc,
  516. inet_ntop(AF_INET, exp_in,
  517. addrstr, sizeof(addrstr)));
  518. rc = 1;
  519. }
  520. } else if (sa->sa_family == AF_INET6) {
  521. struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
  522. struct in6_addr *exp_in = (struct in6_addr *) expected;
  523. if (memcmp(&s6->sin6_addr, exp_in, sizeof(*exp_in))) {
  524. log_error("%s address does not match expected %s\n",
  525. desc,
  526. inet_ntop(AF_INET6, exp_in,
  527. addrstr, sizeof(addrstr)));
  528. rc = 1;
  529. }
  530. } else {
  531. log_error("%s address does not match expected - unknown family\n",
  532. desc);
  533. rc = 1;
  534. }
  535. if (!rc)
  536. log_msg("%s address matches expected\n", desc);
  537. return rc;
  538. }
  539. static int show_sockstat(int sd, struct sock_args *args)
  540. {
  541. struct sockaddr_in6 local_addr, remote_addr;
  542. socklen_t alen = sizeof(local_addr);
  543. struct sockaddr *sa;
  544. const char *desc;
  545. int rc = 0;
  546. desc = server_mode ? "server local:" : "client local:";
  547. sa = (struct sockaddr *) &local_addr;
  548. if (getsockname(sd, sa, &alen) == 0) {
  549. log_address(desc, sa);
  550. if (args->has_expected_laddr) {
  551. rc = expected_addr_match(sa, &args->expected_laddr,
  552. "local");
  553. }
  554. } else {
  555. log_err_errno("getsockname failed");
  556. }
  557. sa = (struct sockaddr *) &remote_addr;
  558. desc = server_mode ? "server peer:" : "client peer:";
  559. if (getpeername(sd, sa, &alen) == 0) {
  560. log_address(desc, sa);
  561. if (args->has_expected_raddr) {
  562. rc |= expected_addr_match(sa, &args->expected_raddr,
  563. "remote");
  564. }
  565. } else {
  566. log_err_errno("getpeername failed");
  567. }
  568. return rc;
  569. }
  570. enum addr_type {
  571. ADDR_TYPE_LOCAL,
  572. ADDR_TYPE_REMOTE,
  573. ADDR_TYPE_MCAST,
  574. ADDR_TYPE_EXPECTED_LOCAL,
  575. ADDR_TYPE_EXPECTED_REMOTE,
  576. ADDR_TYPE_MD5_PREFIX,
  577. };
  578. static int convert_addr(struct sock_args *args, const char *_str,
  579. enum addr_type atype)
  580. {
  581. int pfx_len_max = args->version == AF_INET6 ? 128 : 32;
  582. int family = args->version;
  583. char *str, *dev, *sep;
  584. struct in6_addr *in6;
  585. struct in_addr *in;
  586. const char *desc;
  587. void *addr;
  588. int rc = 0;
  589. str = strdup(_str);
  590. if (!str)
  591. return -ENOMEM;
  592. switch (atype) {
  593. case ADDR_TYPE_LOCAL:
  594. desc = "local";
  595. addr = &args->local_addr;
  596. break;
  597. case ADDR_TYPE_REMOTE:
  598. desc = "remote";
  599. addr = &args->remote_addr;
  600. break;
  601. case ADDR_TYPE_MCAST:
  602. desc = "mcast grp";
  603. addr = &args->grp;
  604. break;
  605. case ADDR_TYPE_EXPECTED_LOCAL:
  606. desc = "expected local";
  607. addr = &args->expected_laddr;
  608. break;
  609. case ADDR_TYPE_EXPECTED_REMOTE:
  610. desc = "expected remote";
  611. addr = &args->expected_raddr;
  612. break;
  613. case ADDR_TYPE_MD5_PREFIX:
  614. desc = "md5 prefix";
  615. if (family == AF_INET) {
  616. args->md5_prefix.v4.sin_family = AF_INET;
  617. addr = &args->md5_prefix.v4.sin_addr;
  618. } else if (family == AF_INET6) {
  619. args->md5_prefix.v6.sin6_family = AF_INET6;
  620. addr = &args->md5_prefix.v6.sin6_addr;
  621. } else
  622. return 1;
  623. sep = strchr(str, '/');
  624. if (sep) {
  625. *sep = '\0';
  626. sep++;
  627. if (str_to_uint(sep, 1, pfx_len_max,
  628. &args->prefix_len) != 0) {
  629. fprintf(stderr, "Invalid port\n");
  630. return 1;
  631. }
  632. } else {
  633. args->prefix_len = 0;
  634. }
  635. break;
  636. default:
  637. log_error("unknown address type\n");
  638. exit(1);
  639. }
  640. switch (family) {
  641. case AF_INET:
  642. in = (struct in_addr *) addr;
  643. if (str) {
  644. if (inet_pton(AF_INET, str, in) == 0) {
  645. log_error("Invalid %s IP address\n", desc);
  646. rc = -1;
  647. goto out;
  648. }
  649. } else {
  650. in->s_addr = htonl(INADDR_ANY);
  651. }
  652. break;
  653. case AF_INET6:
  654. dev = strchr(str, '%');
  655. if (dev) {
  656. *dev = '\0';
  657. dev++;
  658. }
  659. in6 = (struct in6_addr *) addr;
  660. if (str) {
  661. if (inet_pton(AF_INET6, str, in6) == 0) {
  662. log_error("Invalid %s IPv6 address\n", desc);
  663. rc = -1;
  664. goto out;
  665. }
  666. } else {
  667. *in6 = in6addr_any;
  668. }
  669. if (dev) {
  670. args->scope_id = get_ifidx(dev);
  671. if (args->scope_id < 0) {
  672. log_error("Invalid scope on %s IPv6 address\n",
  673. desc);
  674. rc = -1;
  675. goto out;
  676. }
  677. }
  678. break;
  679. default:
  680. log_error("Invalid address family\n");
  681. }
  682. out:
  683. free(str);
  684. return rc;
  685. }
  686. static int validate_addresses(struct sock_args *args)
  687. {
  688. if (args->local_addr_str &&
  689. convert_addr(args, args->local_addr_str, ADDR_TYPE_LOCAL) < 0)
  690. return 1;
  691. if (args->remote_addr_str &&
  692. convert_addr(args, args->remote_addr_str, ADDR_TYPE_REMOTE) < 0)
  693. return 1;
  694. if (args->md5_prefix_str &&
  695. convert_addr(args, args->md5_prefix_str,
  696. ADDR_TYPE_MD5_PREFIX) < 0)
  697. return 1;
  698. if (args->expected_laddr_str &&
  699. convert_addr(args, args->expected_laddr_str,
  700. ADDR_TYPE_EXPECTED_LOCAL))
  701. return 1;
  702. if (args->expected_raddr_str &&
  703. convert_addr(args, args->expected_raddr_str,
  704. ADDR_TYPE_EXPECTED_REMOTE))
  705. return 1;
  706. return 0;
  707. }
  708. static int get_index_from_cmsg(struct msghdr *m)
  709. {
  710. struct cmsghdr *cm;
  711. int ifindex = 0;
  712. char buf[64];
  713. for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(m);
  714. m->msg_controllen != 0 && cm;
  715. cm = (struct cmsghdr *)CMSG_NXTHDR(m, cm)) {
  716. if (cm->cmsg_level == SOL_IP &&
  717. cm->cmsg_type == IP_PKTINFO) {
  718. struct in_pktinfo *pi;
  719. pi = (struct in_pktinfo *)(CMSG_DATA(cm));
  720. inet_ntop(AF_INET, &pi->ipi_addr, buf, sizeof(buf));
  721. ifindex = pi->ipi_ifindex;
  722. } else if (cm->cmsg_level == SOL_IPV6 &&
  723. cm->cmsg_type == IPV6_PKTINFO) {
  724. struct in6_pktinfo *pi6;
  725. pi6 = (struct in6_pktinfo *)(CMSG_DATA(cm));
  726. inet_ntop(AF_INET6, &pi6->ipi6_addr, buf, sizeof(buf));
  727. ifindex = pi6->ipi6_ifindex;
  728. }
  729. }
  730. if (ifindex) {
  731. log_msg(" pktinfo: ifindex %d dest addr %s\n",
  732. ifindex, buf);
  733. }
  734. return ifindex;
  735. }
  736. static int send_msg_no_cmsg(int sd, void *addr, socklen_t alen)
  737. {
  738. int err;
  739. again:
  740. err = sendto(sd, msg, msglen, 0, addr, alen);
  741. if (err < 0) {
  742. if (errno == EACCES && try_broadcast) {
  743. try_broadcast = 0;
  744. if (!set_broadcast(sd))
  745. goto again;
  746. errno = EACCES;
  747. }
  748. log_err_errno("sendto failed");
  749. return 1;
  750. }
  751. return 0;
  752. }
  753. static int send_msg_cmsg(int sd, void *addr, socklen_t alen,
  754. int ifindex, int version)
  755. {
  756. unsigned char cmsgbuf[64];
  757. struct iovec iov[2];
  758. struct cmsghdr *cm;
  759. struct msghdr m;
  760. int err;
  761. iov[0].iov_base = msg;
  762. iov[0].iov_len = msglen;
  763. m.msg_iov = iov;
  764. m.msg_iovlen = 1;
  765. m.msg_name = (caddr_t)addr;
  766. m.msg_namelen = alen;
  767. memset(cmsgbuf, 0, sizeof(cmsgbuf));
  768. cm = (struct cmsghdr *)cmsgbuf;
  769. m.msg_control = (caddr_t)cm;
  770. if (version == AF_INET) {
  771. struct in_pktinfo *pi;
  772. cm->cmsg_level = SOL_IP;
  773. cm->cmsg_type = IP_PKTINFO;
  774. cm->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
  775. pi = (struct in_pktinfo *)(CMSG_DATA(cm));
  776. pi->ipi_ifindex = ifindex;
  777. m.msg_controllen = cm->cmsg_len;
  778. } else if (version == AF_INET6) {
  779. struct in6_pktinfo *pi6;
  780. cm->cmsg_level = SOL_IPV6;
  781. cm->cmsg_type = IPV6_PKTINFO;
  782. cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
  783. pi6 = (struct in6_pktinfo *)(CMSG_DATA(cm));
  784. pi6->ipi6_ifindex = ifindex;
  785. m.msg_controllen = cm->cmsg_len;
  786. }
  787. again:
  788. err = sendmsg(sd, &m, 0);
  789. if (err < 0) {
  790. if (errno == EACCES && try_broadcast) {
  791. try_broadcast = 0;
  792. if (!set_broadcast(sd))
  793. goto again;
  794. errno = EACCES;
  795. }
  796. log_err_errno("sendmsg failed");
  797. return 1;
  798. }
  799. return 0;
  800. }
  801. static int send_msg(int sd, void *addr, socklen_t alen, struct sock_args *args)
  802. {
  803. if (args->type == SOCK_STREAM) {
  804. if (write(sd, msg, msglen) < 0) {
  805. log_err_errno("write failed sending msg to peer");
  806. return 1;
  807. }
  808. } else if (args->datagram_connect) {
  809. if (send(sd, msg, msglen, 0) < 0) {
  810. log_err_errno("send failed sending msg to peer");
  811. return 1;
  812. }
  813. } else if (args->ifindex && args->use_cmsg) {
  814. if (send_msg_cmsg(sd, addr, alen, args->ifindex, args->version))
  815. return 1;
  816. } else {
  817. if (send_msg_no_cmsg(sd, addr, alen))
  818. return 1;
  819. }
  820. log_msg("Sent message:\n");
  821. log_msg(" %.24s%s\n", msg, msglen > 24 ? " ..." : "");
  822. return 0;
  823. }
  824. static int socket_read_dgram(int sd, struct sock_args *args)
  825. {
  826. unsigned char addr[sizeof(struct sockaddr_in6)];
  827. struct sockaddr *sa = (struct sockaddr *) addr;
  828. socklen_t alen = sizeof(addr);
  829. struct iovec iov[2];
  830. struct msghdr m = {
  831. .msg_name = (caddr_t)addr,
  832. .msg_namelen = alen,
  833. .msg_iov = iov,
  834. .msg_iovlen = 1,
  835. };
  836. unsigned char cmsgbuf[256];
  837. struct cmsghdr *cm = (struct cmsghdr *)cmsgbuf;
  838. char buf[16*1024];
  839. int ifindex;
  840. int len;
  841. iov[0].iov_base = (caddr_t)buf;
  842. iov[0].iov_len = sizeof(buf);
  843. memset(cmsgbuf, 0, sizeof(cmsgbuf));
  844. m.msg_control = (caddr_t)cm;
  845. m.msg_controllen = sizeof(cmsgbuf);
  846. len = recvmsg(sd, &m, 0);
  847. if (len == 0) {
  848. log_msg("peer closed connection.\n");
  849. return 0;
  850. } else if (len < 0) {
  851. log_msg("failed to read message: %d: %s\n",
  852. errno, strerror(errno));
  853. return -1;
  854. }
  855. buf[len] = '\0';
  856. log_address("Message from:", sa);
  857. log_msg(" %.24s%s\n", buf, len > 24 ? " ..." : "");
  858. ifindex = get_index_from_cmsg(&m);
  859. if (args->expected_ifindex) {
  860. if (args->expected_ifindex != ifindex) {
  861. log_error("Device index mismatch: expected %d have %d\n",
  862. args->expected_ifindex, ifindex);
  863. return -1;
  864. }
  865. log_msg("Device index matches: expected %d have %d\n",
  866. args->expected_ifindex, ifindex);
  867. }
  868. if (!interactive && server_mode) {
  869. if (sa->sa_family == AF_INET6) {
  870. struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
  871. struct in6_addr *in6 = &s6->sin6_addr;
  872. if (IN6_IS_ADDR_V4MAPPED(in6)) {
  873. const uint32_t *pa = (uint32_t *) &in6->s6_addr;
  874. struct in_addr in4;
  875. struct sockaddr_in *sin;
  876. sin = (struct sockaddr_in *) addr;
  877. pa += 3;
  878. in4.s_addr = *pa;
  879. sin->sin_addr = in4;
  880. sin->sin_family = AF_INET;
  881. if (send_msg_cmsg(sd, addr, alen,
  882. ifindex, AF_INET) < 0)
  883. goto out_err;
  884. }
  885. }
  886. again:
  887. iov[0].iov_len = len;
  888. if (args->version == AF_INET6) {
  889. struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
  890. if (args->dev) {
  891. /* avoid PKTINFO conflicts with bindtodev */
  892. if (sendto(sd, buf, len, 0,
  893. (void *) addr, alen) < 0)
  894. goto out_err;
  895. } else {
  896. /* kernel is allowing scope_id to be set to VRF
  897. * index for LLA. for sends to global address
  898. * reset scope id
  899. */
  900. s6->sin6_scope_id = ifindex;
  901. if (sendmsg(sd, &m, 0) < 0)
  902. goto out_err;
  903. }
  904. } else {
  905. int err;
  906. err = sendmsg(sd, &m, 0);
  907. if (err < 0) {
  908. if (errno == EACCES && try_broadcast) {
  909. try_broadcast = 0;
  910. if (!set_broadcast(sd))
  911. goto again;
  912. errno = EACCES;
  913. }
  914. goto out_err;
  915. }
  916. }
  917. log_msg("Sent message:\n");
  918. log_msg(" %.24s%s\n", buf, len > 24 ? " ..." : "");
  919. }
  920. return 1;
  921. out_err:
  922. log_err_errno("failed to send msg to peer");
  923. return -1;
  924. }
  925. static int socket_read_stream(int sd)
  926. {
  927. char buf[1024];
  928. int len;
  929. len = read(sd, buf, sizeof(buf)-1);
  930. if (len == 0) {
  931. log_msg("client closed connection.\n");
  932. return 0;
  933. } else if (len < 0) {
  934. log_msg("failed to read message\n");
  935. return -1;
  936. }
  937. buf[len] = '\0';
  938. log_msg("Incoming message:\n");
  939. log_msg(" %.24s%s\n", buf, len > 24 ? " ..." : "");
  940. if (!interactive && server_mode) {
  941. if (write(sd, buf, len) < 0) {
  942. log_err_errno("failed to send buf");
  943. return -1;
  944. }
  945. log_msg("Sent message:\n");
  946. log_msg(" %.24s%s\n", buf, len > 24 ? " ..." : "");
  947. }
  948. return 1;
  949. }
  950. static int socket_read(int sd, struct sock_args *args)
  951. {
  952. if (args->type == SOCK_STREAM)
  953. return socket_read_stream(sd);
  954. return socket_read_dgram(sd, args);
  955. }
  956. static int stdin_to_socket(int sd, int type, void *addr, socklen_t alen)
  957. {
  958. char buf[1024];
  959. int len;
  960. if (fgets(buf, sizeof(buf), stdin) == NULL)
  961. return 0;
  962. len = strlen(buf);
  963. if (type == SOCK_STREAM) {
  964. if (write(sd, buf, len) < 0) {
  965. log_err_errno("failed to send buf");
  966. return -1;
  967. }
  968. } else {
  969. int err;
  970. again:
  971. err = sendto(sd, buf, len, 0, addr, alen);
  972. if (err < 0) {
  973. if (errno == EACCES && try_broadcast) {
  974. try_broadcast = 0;
  975. if (!set_broadcast(sd))
  976. goto again;
  977. errno = EACCES;
  978. }
  979. log_err_errno("failed to send msg to peer");
  980. return -1;
  981. }
  982. }
  983. log_msg("Sent message:\n");
  984. log_msg(" %.24s%s\n", buf, len > 24 ? " ..." : "");
  985. return 1;
  986. }
  987. static void set_recv_attr(int sd, int version)
  988. {
  989. if (version == AF_INET6) {
  990. set_recvpktinfo_v6(sd);
  991. set_recverr_v6(sd);
  992. } else {
  993. set_pktinfo_v4(sd);
  994. set_recverr_v4(sd);
  995. }
  996. }
  997. static int msg_loop(int client, int sd, void *addr, socklen_t alen,
  998. struct sock_args *args)
  999. {
  1000. struct timeval timeout = { .tv_sec = prog_timeout }, *ptval = NULL;
  1001. fd_set rfds;
  1002. int nfds;
  1003. int rc;
  1004. if (args->type != SOCK_STREAM)
  1005. set_recv_attr(sd, args->version);
  1006. if (msg) {
  1007. msglen = strlen(msg);
  1008. /* client sends first message */
  1009. if (client) {
  1010. if (send_msg(sd, addr, alen, args))
  1011. return 1;
  1012. }
  1013. if (!interactive) {
  1014. ptval = &timeout;
  1015. if (!prog_timeout)
  1016. timeout.tv_sec = 5;
  1017. }
  1018. }
  1019. nfds = interactive ? MAX(fileno(stdin), sd) + 1 : sd + 1;
  1020. while (1) {
  1021. FD_ZERO(&rfds);
  1022. FD_SET(sd, &rfds);
  1023. if (interactive)
  1024. FD_SET(fileno(stdin), &rfds);
  1025. rc = select(nfds, &rfds, NULL, NULL, ptval);
  1026. if (rc < 0) {
  1027. if (errno == EINTR)
  1028. continue;
  1029. rc = 1;
  1030. log_err_errno("select failed");
  1031. break;
  1032. } else if (rc == 0) {
  1033. log_error("Timed out waiting for response\n");
  1034. rc = 2;
  1035. break;
  1036. }
  1037. if (FD_ISSET(sd, &rfds)) {
  1038. rc = socket_read(sd, args);
  1039. if (rc < 0) {
  1040. rc = 1;
  1041. break;
  1042. }
  1043. if (rc == 0)
  1044. break;
  1045. }
  1046. rc = 0;
  1047. if (FD_ISSET(fileno(stdin), &rfds)) {
  1048. if (stdin_to_socket(sd, args->type, addr, alen) <= 0)
  1049. break;
  1050. }
  1051. if (interactive)
  1052. continue;
  1053. if (iter != -1) {
  1054. --iter;
  1055. if (iter == 0)
  1056. break;
  1057. }
  1058. log_msg("Going into quiet mode\n");
  1059. quiet = 1;
  1060. if (client) {
  1061. if (send_msg(sd, addr, alen, args)) {
  1062. rc = 1;
  1063. break;
  1064. }
  1065. }
  1066. }
  1067. return rc;
  1068. }
  1069. static int msock_init(struct sock_args *args, int server)
  1070. {
  1071. uint32_t if_addr = htonl(INADDR_ANY);
  1072. struct sockaddr_in laddr = {
  1073. .sin_family = AF_INET,
  1074. .sin_port = htons(args->port),
  1075. };
  1076. int one = 1;
  1077. int sd;
  1078. if (!server && args->has_local_ip)
  1079. if_addr = args->local_addr.in.s_addr;
  1080. sd = socket(PF_INET, SOCK_DGRAM, 0);
  1081. if (sd < 0) {
  1082. log_err_errno("socket");
  1083. return -1;
  1084. }
  1085. if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
  1086. (char *)&one, sizeof(one)) < 0) {
  1087. log_err_errno("Setting SO_REUSEADDR error");
  1088. goto out_err;
  1089. }
  1090. if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST,
  1091. (char *)&one, sizeof(one)) < 0)
  1092. log_err_errno("Setting SO_BROADCAST error");
  1093. if (args->dev && bind_to_device(sd, args->dev) != 0)
  1094. goto out_err;
  1095. else if (args->use_setsockopt &&
  1096. set_multicast_if(sd, args->ifindex))
  1097. goto out_err;
  1098. laddr.sin_addr.s_addr = if_addr;
  1099. if (bind(sd, (struct sockaddr *) &laddr, sizeof(laddr)) < 0) {
  1100. log_err_errno("bind failed");
  1101. goto out_err;
  1102. }
  1103. if (server &&
  1104. set_membership(sd, args->grp.s_addr,
  1105. args->local_addr.in.s_addr, args->ifindex))
  1106. goto out_err;
  1107. return sd;
  1108. out_err:
  1109. close(sd);
  1110. return -1;
  1111. }
  1112. static int msock_server(struct sock_args *args)
  1113. {
  1114. return msock_init(args, 1);
  1115. }
  1116. static int msock_client(struct sock_args *args)
  1117. {
  1118. return msock_init(args, 0);
  1119. }
  1120. static int bind_socket(int sd, struct sock_args *args)
  1121. {
  1122. struct sockaddr_in serv_addr = {
  1123. .sin_family = AF_INET,
  1124. };
  1125. struct sockaddr_in6 serv6_addr = {
  1126. .sin6_family = AF_INET6,
  1127. };
  1128. void *addr;
  1129. socklen_t alen;
  1130. if (!args->has_local_ip && args->type == SOCK_RAW)
  1131. return 0;
  1132. switch (args->version) {
  1133. case AF_INET:
  1134. serv_addr.sin_port = htons(args->port);
  1135. serv_addr.sin_addr = args->local_addr.in;
  1136. addr = &serv_addr;
  1137. alen = sizeof(serv_addr);
  1138. break;
  1139. case AF_INET6:
  1140. serv6_addr.sin6_port = htons(args->port);
  1141. serv6_addr.sin6_addr = args->local_addr.in6;
  1142. addr = &serv6_addr;
  1143. alen = sizeof(serv6_addr);
  1144. break;
  1145. default:
  1146. log_error("Invalid address family\n");
  1147. return -1;
  1148. }
  1149. if (bind(sd, addr, alen) < 0) {
  1150. log_err_errno("error binding socket");
  1151. return -1;
  1152. }
  1153. return 0;
  1154. }
  1155. static int config_xfrm_policy(int sd, struct sock_args *args)
  1156. {
  1157. struct xfrm_userpolicy_info policy = {};
  1158. int type = UDP_ENCAP_ESPINUDP;
  1159. int xfrm_af = IP_XFRM_POLICY;
  1160. int level = SOL_IP;
  1161. if (args->type != SOCK_DGRAM) {
  1162. log_error("Invalid socket type. Only DGRAM could be used for XFRM\n");
  1163. return 1;
  1164. }
  1165. policy.action = XFRM_POLICY_ALLOW;
  1166. policy.sel.family = args->version;
  1167. if (args->version == AF_INET6) {
  1168. xfrm_af = IPV6_XFRM_POLICY;
  1169. level = SOL_IPV6;
  1170. }
  1171. policy.dir = XFRM_POLICY_OUT;
  1172. if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
  1173. return 1;
  1174. policy.dir = XFRM_POLICY_IN;
  1175. if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
  1176. return 1;
  1177. if (setsockopt(sd, IPPROTO_UDP, UDP_ENCAP, &type, sizeof(type)) < 0) {
  1178. log_err_errno("Failed to set xfrm encap");
  1179. return 1;
  1180. }
  1181. return 0;
  1182. }
  1183. static int lsock_init(struct sock_args *args)
  1184. {
  1185. long flags;
  1186. int sd;
  1187. sd = socket(args->version, args->type, args->protocol);
  1188. if (sd < 0) {
  1189. log_err_errno("Error opening socket");
  1190. return -1;
  1191. }
  1192. if (set_reuseaddr(sd) != 0)
  1193. goto err;
  1194. if (set_reuseport(sd) != 0)
  1195. goto err;
  1196. if (args->dev && bind_to_device(sd, args->dev) != 0)
  1197. goto err;
  1198. else if (args->use_setsockopt &&
  1199. set_unicast_if(sd, args->ifindex, args->version))
  1200. goto err;
  1201. if (args->use_freebind && set_freebind(sd, args->version))
  1202. goto err;
  1203. if (bind_socket(sd, args))
  1204. goto err;
  1205. if (args->bind_test_only)
  1206. goto out;
  1207. if (args->type == SOCK_STREAM && listen(sd, 1) < 0) {
  1208. log_err_errno("listen failed");
  1209. goto err;
  1210. }
  1211. flags = fcntl(sd, F_GETFL);
  1212. if ((flags < 0) || (fcntl(sd, F_SETFL, flags|O_NONBLOCK) < 0)) {
  1213. log_err_errno("Failed to set non-blocking option");
  1214. goto err;
  1215. }
  1216. if (fcntl(sd, F_SETFD, FD_CLOEXEC) < 0)
  1217. log_err_errno("Failed to set close-on-exec flag");
  1218. if (args->use_xfrm && config_xfrm_policy(sd, args)) {
  1219. log_err_errno("Failed to set xfrm policy");
  1220. goto err;
  1221. }
  1222. out:
  1223. return sd;
  1224. err:
  1225. close(sd);
  1226. return -1;
  1227. }
  1228. static void ipc_write(int fd, int message)
  1229. {
  1230. /* Not in both_mode, so there's no process to signal */
  1231. if (fd < 0)
  1232. return;
  1233. if (write(fd, &message, sizeof(message)) < 0)
  1234. log_err_errno("Failed to send client status");
  1235. }
  1236. static int do_server(struct sock_args *args, int ipc_fd)
  1237. {
  1238. /* ipc_fd = -1 if no parent process to signal */
  1239. struct timeval timeout = { .tv_sec = prog_timeout }, *ptval = NULL;
  1240. unsigned char addr[sizeof(struct sockaddr_in6)] = {};
  1241. socklen_t alen = sizeof(addr);
  1242. int lsd, csd = -1;
  1243. fd_set rfds;
  1244. int rc;
  1245. if (args->serverns) {
  1246. if (switch_ns(args->serverns)) {
  1247. log_error("Could not set server netns to %s\n",
  1248. args->serverns);
  1249. goto err_exit;
  1250. }
  1251. log_msg("Switched server netns\n");
  1252. }
  1253. args->dev = args->server_dev;
  1254. args->expected_dev = args->expected_server_dev;
  1255. if (resolve_devices(args) || validate_addresses(args))
  1256. goto err_exit;
  1257. if (prog_timeout)
  1258. ptval = &timeout;
  1259. if (args->has_grp)
  1260. lsd = msock_server(args);
  1261. else
  1262. lsd = lsock_init(args);
  1263. if (lsd < 0)
  1264. goto err_exit;
  1265. if (args->bind_test_only) {
  1266. close(lsd);
  1267. ipc_write(ipc_fd, 1);
  1268. return 0;
  1269. }
  1270. if (args->type != SOCK_STREAM) {
  1271. ipc_write(ipc_fd, 1);
  1272. rc = msg_loop(0, lsd, (void *) addr, alen, args);
  1273. close(lsd);
  1274. return rc;
  1275. }
  1276. if (args->password && tcp_md5_remote(lsd, args)) {
  1277. close(lsd);
  1278. goto err_exit;
  1279. }
  1280. ipc_write(ipc_fd, 1);
  1281. while (1) {
  1282. log_msg("waiting for client connection.\n");
  1283. FD_ZERO(&rfds);
  1284. FD_SET(lsd, &rfds);
  1285. rc = select(lsd+1, &rfds, NULL, NULL, ptval);
  1286. if (rc == 0) {
  1287. rc = 2;
  1288. break;
  1289. }
  1290. if (rc < 0) {
  1291. if (errno == EINTR)
  1292. continue;
  1293. log_err_errno("select failed");
  1294. break;
  1295. }
  1296. if (FD_ISSET(lsd, &rfds)) {
  1297. csd = accept(lsd, (void *) addr, &alen);
  1298. if (csd < 0) {
  1299. log_err_errno("accept failed");
  1300. break;
  1301. }
  1302. rc = show_sockstat(csd, args);
  1303. if (rc)
  1304. break;
  1305. rc = check_device(csd, args);
  1306. if (rc)
  1307. break;
  1308. }
  1309. rc = msg_loop(0, csd, (void *) addr, alen, args);
  1310. close(csd);
  1311. if (!interactive)
  1312. break;
  1313. }
  1314. close(lsd);
  1315. return rc;
  1316. err_exit:
  1317. ipc_write(ipc_fd, 0);
  1318. return 1;
  1319. }
  1320. static int wait_for_connect(int sd)
  1321. {
  1322. struct timeval _tv = { .tv_sec = prog_timeout }, *tv = NULL;
  1323. fd_set wfd;
  1324. int val = 0, sz = sizeof(val);
  1325. int rc;
  1326. FD_ZERO(&wfd);
  1327. FD_SET(sd, &wfd);
  1328. if (prog_timeout)
  1329. tv = &_tv;
  1330. rc = select(FD_SETSIZE, NULL, &wfd, NULL, tv);
  1331. if (rc == 0) {
  1332. log_error("connect timed out\n");
  1333. return -2;
  1334. } else if (rc < 0) {
  1335. log_err_errno("select failed");
  1336. return -3;
  1337. }
  1338. if (getsockopt(sd, SOL_SOCKET, SO_ERROR, &val, (socklen_t *)&sz) < 0) {
  1339. log_err_errno("getsockopt(SO_ERROR) failed");
  1340. return -4;
  1341. }
  1342. if (val != 0) {
  1343. log_error("connect failed: %d: %s\n", val, strerror(val));
  1344. return -1;
  1345. }
  1346. return 0;
  1347. }
  1348. static int connectsock(void *addr, socklen_t alen, struct sock_args *args)
  1349. {
  1350. int sd, rc = -1;
  1351. long flags;
  1352. sd = socket(args->version, args->type, args->protocol);
  1353. if (sd < 0) {
  1354. log_err_errno("Failed to create socket");
  1355. return -1;
  1356. }
  1357. flags = fcntl(sd, F_GETFL);
  1358. if ((flags < 0) || (fcntl(sd, F_SETFL, flags|O_NONBLOCK) < 0)) {
  1359. log_err_errno("Failed to set non-blocking option");
  1360. goto err;
  1361. }
  1362. if (set_reuseport(sd) != 0)
  1363. goto err;
  1364. if (args->dev && bind_to_device(sd, args->dev) != 0)
  1365. goto err;
  1366. else if (args->use_setsockopt &&
  1367. set_unicast_if(sd, args->ifindex, args->version))
  1368. goto err;
  1369. if (args->has_local_ip && bind_socket(sd, args))
  1370. goto err;
  1371. if (args->type != SOCK_STREAM && !args->datagram_connect)
  1372. goto out;
  1373. if (args->password && tcp_md5sig(sd, addr, alen, args))
  1374. goto err;
  1375. if (args->bind_test_only)
  1376. goto out;
  1377. if (connect(sd, addr, alen) < 0) {
  1378. if (errno != EINPROGRESS) {
  1379. log_err_errno("Failed to connect to remote host");
  1380. rc = -1;
  1381. goto err;
  1382. }
  1383. rc = wait_for_connect(sd);
  1384. if (rc < 0)
  1385. goto err;
  1386. }
  1387. out:
  1388. return sd;
  1389. err:
  1390. close(sd);
  1391. return rc;
  1392. }
  1393. static int do_client(struct sock_args *args)
  1394. {
  1395. struct sockaddr_in sin = {
  1396. .sin_family = AF_INET,
  1397. };
  1398. struct sockaddr_in6 sin6 = {
  1399. .sin6_family = AF_INET6,
  1400. };
  1401. void *addr;
  1402. int alen;
  1403. int rc = 0;
  1404. int sd;
  1405. if (!args->has_remote_ip && !args->has_grp) {
  1406. fprintf(stderr, "remote IP or multicast group not given\n");
  1407. return 1;
  1408. }
  1409. if (args->clientns) {
  1410. if (switch_ns(args->clientns)) {
  1411. log_error("Could not set client netns to %s\n",
  1412. args->clientns);
  1413. return 1;
  1414. }
  1415. log_msg("Switched client netns\n");
  1416. }
  1417. args->local_addr_str = args->client_local_addr_str;
  1418. if (resolve_devices(args) || validate_addresses(args))
  1419. return 1;
  1420. if ((args->use_setsockopt || args->use_cmsg) && !args->ifindex) {
  1421. fprintf(stderr, "Device binding not specified\n");
  1422. return 1;
  1423. }
  1424. if (args->use_setsockopt || args->use_cmsg)
  1425. args->dev = NULL;
  1426. switch (args->version) {
  1427. case AF_INET:
  1428. sin.sin_port = htons(args->port);
  1429. if (args->has_grp)
  1430. sin.sin_addr = args->grp;
  1431. else
  1432. sin.sin_addr = args->remote_addr.in;
  1433. addr = &sin;
  1434. alen = sizeof(sin);
  1435. break;
  1436. case AF_INET6:
  1437. sin6.sin6_port = htons(args->port);
  1438. sin6.sin6_addr = args->remote_addr.in6;
  1439. sin6.sin6_scope_id = args->scope_id;
  1440. addr = &sin6;
  1441. alen = sizeof(sin6);
  1442. break;
  1443. }
  1444. args->password = args->client_pw;
  1445. if (args->has_grp)
  1446. sd = msock_client(args);
  1447. else
  1448. sd = connectsock(addr, alen, args);
  1449. if (sd < 0)
  1450. return -sd;
  1451. if (args->bind_test_only)
  1452. goto out;
  1453. if (args->type == SOCK_STREAM) {
  1454. rc = show_sockstat(sd, args);
  1455. if (rc != 0)
  1456. goto out;
  1457. }
  1458. rc = msg_loop(1, sd, addr, alen, args);
  1459. out:
  1460. close(sd);
  1461. return rc;
  1462. }
  1463. static char *random_msg(int len)
  1464. {
  1465. int i, n = 0, olen = len + 1;
  1466. char *m;
  1467. if (len <= 0)
  1468. return NULL;
  1469. m = malloc(olen);
  1470. if (!m)
  1471. return NULL;
  1472. while (len > 26) {
  1473. i = snprintf(m + n, olen - n, "%.26s",
  1474. "abcdefghijklmnopqrstuvwxyz");
  1475. n += i;
  1476. len -= i;
  1477. }
  1478. i = snprintf(m + n, olen - n, "%.*s", len,
  1479. "abcdefghijklmnopqrstuvwxyz");
  1480. return m;
  1481. }
  1482. static int ipc_child(int fd, struct sock_args *args)
  1483. {
  1484. char *outbuf, *errbuf;
  1485. int rc = 1;
  1486. outbuf = malloc(4096);
  1487. errbuf = malloc(4096);
  1488. if (!outbuf || !errbuf) {
  1489. fprintf(stderr, "server: Failed to allocate buffers for stdout and stderr\n");
  1490. goto out;
  1491. }
  1492. setbuffer(stdout, outbuf, 4096);
  1493. setbuffer(stderr, errbuf, 4096);
  1494. server_mode = 1; /* to tell log_msg in case we are in both_mode */
  1495. /* when running in both mode, address validation applies
  1496. * solely to client side
  1497. */
  1498. args->has_expected_laddr = 0;
  1499. args->has_expected_raddr = 0;
  1500. rc = do_server(args, fd);
  1501. out:
  1502. free(outbuf);
  1503. free(errbuf);
  1504. return rc;
  1505. }
  1506. static int ipc_parent(int cpid, int fd, struct sock_args *args)
  1507. {
  1508. int client_status;
  1509. int status;
  1510. int buf;
  1511. /* do the client-side function here in the parent process,
  1512. * waiting to be told when to continue
  1513. */
  1514. if (read(fd, &buf, sizeof(buf)) <= 0) {
  1515. log_err_errno("Failed to read IPC status from status");
  1516. return 1;
  1517. }
  1518. if (!buf) {
  1519. log_error("Server failed; can not continue\n");
  1520. return 1;
  1521. }
  1522. log_msg("Server is ready\n");
  1523. client_status = do_client(args);
  1524. log_msg("parent is done!\n");
  1525. if (kill(cpid, 0) == 0)
  1526. kill(cpid, SIGKILL);
  1527. wait(&status);
  1528. return client_status;
  1529. }
  1530. #define GETOPT_STR "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SUCi6xL:0:1:2:3:Fbqf"
  1531. #define OPT_FORCE_BIND_KEY_IFINDEX 1001
  1532. #define OPT_NO_BIND_KEY_IFINDEX 1002
  1533. static struct option long_opts[] = {
  1534. {"force-bind-key-ifindex", 0, 0, OPT_FORCE_BIND_KEY_IFINDEX},
  1535. {"no-bind-key-ifindex", 0, 0, OPT_NO_BIND_KEY_IFINDEX},
  1536. {0, 0, 0, 0}
  1537. };
  1538. static void print_usage(char *prog)
  1539. {
  1540. printf(
  1541. "usage: %s OPTS\n"
  1542. "Required:\n"
  1543. " -r addr remote address to connect to (client mode only)\n"
  1544. " -p port port to connect to (client mode)/listen on (server mode)\n"
  1545. " (default: %d)\n"
  1546. " -s server mode (default: client mode)\n"
  1547. " -t timeout seconds (default: none)\n"
  1548. "\n"
  1549. "Optional:\n"
  1550. " -B do both client and server via fork and IPC\n"
  1551. " -N ns set client to network namespace ns (requires root)\n"
  1552. " -O ns set server to network namespace ns (requires root)\n"
  1553. " -F Restart server loop\n"
  1554. " -6 IPv6 (default is IPv4)\n"
  1555. " -P proto protocol for socket: icmp, ospf (default: none)\n"
  1556. " -D|R datagram (D) / raw (R) socket (default stream)\n"
  1557. " -l addr local address to bind to in server mode\n"
  1558. " -c addr local address to bind to in client mode\n"
  1559. " -x configure XFRM policy on socket\n"
  1560. "\n"
  1561. " -d dev bind socket to given device name\n"
  1562. " -I dev bind socket to given device name - server mode\n"
  1563. " -S use setsockopt (IP_UNICAST_IF or IP_MULTICAST_IF)\n"
  1564. " to set device binding\n"
  1565. " -U Use connect() and send() for datagram sockets\n"
  1566. " -f bind socket with the IP[V6]_FREEBIND option\n"
  1567. " -C use cmsg and IP_PKTINFO to specify device binding\n"
  1568. "\n"
  1569. " -L len send random message of given length\n"
  1570. " -n num number of times to send message\n"
  1571. "\n"
  1572. " -M password use MD5 sum protection\n"
  1573. " -X password MD5 password for client mode\n"
  1574. " -m prefix/len prefix and length to use for MD5 key\n"
  1575. " --no-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX off\n"
  1576. " --force-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX on\n"
  1577. " (default: only if -I is passed)\n"
  1578. "\n"
  1579. " -g grp multicast group (e.g., 239.1.1.1)\n"
  1580. " -i interactive mode (default is echo and terminate)\n"
  1581. "\n"
  1582. " -0 addr Expected local address\n"
  1583. " -1 addr Expected remote address\n"
  1584. " -2 dev Expected device name (or index) to receive packet\n"
  1585. " -3 dev Expected device name (or index) to receive packets - server mode\n"
  1586. "\n"
  1587. " -b Bind test only.\n"
  1588. " -q Be quiet. Run test without printing anything.\n"
  1589. , prog, DEFAULT_PORT);
  1590. }
  1591. int main(int argc, char *argv[])
  1592. {
  1593. struct sock_args args = {
  1594. .version = AF_INET,
  1595. .type = SOCK_STREAM,
  1596. .port = DEFAULT_PORT,
  1597. };
  1598. struct protoent *pe;
  1599. int both_mode = 0;
  1600. unsigned int tmp;
  1601. int forever = 0;
  1602. int fd[2];
  1603. int cpid;
  1604. /* process inputs */
  1605. extern char *optarg;
  1606. int rc = 0;
  1607. /*
  1608. * process input args
  1609. */
  1610. while ((rc = getopt_long(argc, argv, GETOPT_STR, long_opts, NULL)) != -1) {
  1611. switch (rc) {
  1612. case 'B':
  1613. both_mode = 1;
  1614. break;
  1615. case 's':
  1616. server_mode = 1;
  1617. break;
  1618. case 'F':
  1619. forever = 1;
  1620. break;
  1621. case 'l':
  1622. args.has_local_ip = 1;
  1623. args.local_addr_str = optarg;
  1624. break;
  1625. case 'r':
  1626. args.has_remote_ip = 1;
  1627. args.remote_addr_str = optarg;
  1628. break;
  1629. case 'c':
  1630. args.has_local_ip = 1;
  1631. args.client_local_addr_str = optarg;
  1632. break;
  1633. case 'p':
  1634. if (str_to_uint(optarg, 1, 65535, &tmp) != 0) {
  1635. fprintf(stderr, "Invalid port\n");
  1636. return 1;
  1637. }
  1638. args.port = (unsigned short) tmp;
  1639. break;
  1640. case 't':
  1641. if (str_to_uint(optarg, 0, INT_MAX,
  1642. &prog_timeout) != 0) {
  1643. fprintf(stderr, "Invalid timeout\n");
  1644. return 1;
  1645. }
  1646. break;
  1647. case 'D':
  1648. args.type = SOCK_DGRAM;
  1649. break;
  1650. case 'R':
  1651. args.type = SOCK_RAW;
  1652. args.port = 0;
  1653. if (!args.protocol)
  1654. args.protocol = IPPROTO_RAW;
  1655. break;
  1656. case 'P':
  1657. pe = getprotobyname(optarg);
  1658. if (pe) {
  1659. args.protocol = pe->p_proto;
  1660. } else {
  1661. if (str_to_uint(optarg, 0, 0xffff, &tmp) != 0) {
  1662. fprintf(stderr, "Invalid protocol\n");
  1663. return 1;
  1664. }
  1665. args.protocol = tmp;
  1666. }
  1667. break;
  1668. case 'n':
  1669. iter = atoi(optarg);
  1670. break;
  1671. case 'N':
  1672. args.clientns = optarg;
  1673. break;
  1674. case 'O':
  1675. args.serverns = optarg;
  1676. break;
  1677. case 'L':
  1678. msg = random_msg(atoi(optarg));
  1679. break;
  1680. case 'M':
  1681. args.password = optarg;
  1682. break;
  1683. case OPT_FORCE_BIND_KEY_IFINDEX:
  1684. args.bind_key_ifindex = 1;
  1685. break;
  1686. case OPT_NO_BIND_KEY_IFINDEX:
  1687. args.bind_key_ifindex = -1;
  1688. break;
  1689. case 'X':
  1690. args.client_pw = optarg;
  1691. break;
  1692. case 'm':
  1693. args.md5_prefix_str = optarg;
  1694. break;
  1695. case 'S':
  1696. args.use_setsockopt = 1;
  1697. break;
  1698. case 'f':
  1699. args.use_freebind = 1;
  1700. break;
  1701. case 'C':
  1702. args.use_cmsg = 1;
  1703. break;
  1704. case 'd':
  1705. args.dev = optarg;
  1706. break;
  1707. case 'I':
  1708. args.server_dev = optarg;
  1709. break;
  1710. case 'i':
  1711. interactive = 1;
  1712. break;
  1713. case 'g':
  1714. args.has_grp = 1;
  1715. if (convert_addr(&args, optarg, ADDR_TYPE_MCAST) < 0)
  1716. return 1;
  1717. args.type = SOCK_DGRAM;
  1718. break;
  1719. case '6':
  1720. args.version = AF_INET6;
  1721. break;
  1722. case 'b':
  1723. args.bind_test_only = 1;
  1724. break;
  1725. case '0':
  1726. args.has_expected_laddr = 1;
  1727. args.expected_laddr_str = optarg;
  1728. break;
  1729. case '1':
  1730. args.has_expected_raddr = 1;
  1731. args.expected_raddr_str = optarg;
  1732. break;
  1733. case '2':
  1734. args.expected_dev = optarg;
  1735. break;
  1736. case '3':
  1737. args.expected_server_dev = optarg;
  1738. break;
  1739. case 'q':
  1740. quiet = 1;
  1741. break;
  1742. case 'x':
  1743. args.use_xfrm = 1;
  1744. break;
  1745. case 'U':
  1746. args.datagram_connect = 1;
  1747. break;
  1748. default:
  1749. print_usage(argv[0]);
  1750. return 1;
  1751. }
  1752. }
  1753. if (args.password &&
  1754. ((!args.has_remote_ip && !args.md5_prefix_str) ||
  1755. args.type != SOCK_STREAM)) {
  1756. log_error("MD5 passwords apply to TCP only and require a remote ip for the password\n");
  1757. return 1;
  1758. }
  1759. if (args.md5_prefix_str && !args.password) {
  1760. log_error("Prefix range for MD5 protection specified without a password\n");
  1761. return 1;
  1762. }
  1763. if (iter == 0) {
  1764. fprintf(stderr, "Invalid number of messages to send\n");
  1765. return 1;
  1766. }
  1767. if (args.type == SOCK_STREAM && !args.protocol)
  1768. args.protocol = IPPROTO_TCP;
  1769. if (args.type == SOCK_DGRAM && !args.protocol)
  1770. args.protocol = IPPROTO_UDP;
  1771. if ((args.type == SOCK_STREAM || args.type == SOCK_DGRAM) &&
  1772. args.port == 0) {
  1773. fprintf(stderr, "Invalid port number\n");
  1774. return 1;
  1775. }
  1776. if ((both_mode || !server_mode) && !args.has_grp &&
  1777. !args.has_remote_ip && !args.has_local_ip) {
  1778. fprintf(stderr,
  1779. "Local (server mode) or remote IP (client IP) required\n");
  1780. return 1;
  1781. }
  1782. if (interactive) {
  1783. prog_timeout = 0;
  1784. msg = NULL;
  1785. }
  1786. if (both_mode) {
  1787. if (pipe(fd) < 0) {
  1788. perror("pipe");
  1789. exit(1);
  1790. }
  1791. cpid = fork();
  1792. if (cpid < 0) {
  1793. perror("fork");
  1794. exit(1);
  1795. }
  1796. if (cpid)
  1797. return ipc_parent(cpid, fd[0], &args);
  1798. return ipc_child(fd[1], &args);
  1799. }
  1800. if (server_mode) {
  1801. do {
  1802. rc = do_server(&args, -1);
  1803. } while (forever);
  1804. return rc;
  1805. }
  1806. return do_client(&args);
  1807. }