ipsec.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ipsec.c - Check xfrm on veth inside a net-ns.
  4. * Copyright (c) 2018 Dmitry Safonov
  5. */
  6. #define _GNU_SOURCE
  7. #include <arpa/inet.h>
  8. #include <asm/types.h>
  9. #include <errno.h>
  10. #include <fcntl.h>
  11. #include <limits.h>
  12. #include <linux/limits.h>
  13. #include <linux/netlink.h>
  14. #include <linux/random.h>
  15. #include <linux/rtnetlink.h>
  16. #include <linux/veth.h>
  17. #include <linux/xfrm.h>
  18. #include <netinet/in.h>
  19. #include <net/if.h>
  20. #include <sched.h>
  21. #include <stdbool.h>
  22. #include <stdint.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <sys/mman.h>
  27. #include <sys/socket.h>
  28. #include <sys/stat.h>
  29. #include <sys/syscall.h>
  30. #include <sys/types.h>
  31. #include <sys/wait.h>
  32. #include <time.h>
  33. #include <unistd.h>
  34. #include "../kselftest.h"
  35. #define printk(fmt, ...) \
  36. ksft_print_msg("%d[%u] " fmt "\n", getpid(), __LINE__, ##__VA_ARGS__)
  37. #define pr_err(fmt, ...) printk(fmt ": %m", ##__VA_ARGS__)
  38. #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
  39. #define IPV4_STR_SZ 16 /* xxx.xxx.xxx.xxx is longest + \0 */
  40. #define MAX_PAYLOAD 2048
  41. #define XFRM_ALGO_KEY_BUF_SIZE 512
  42. #define MAX_PROCESSES (1 << 14) /* /16 mask divided by /30 subnets */
  43. #define INADDR_A ((in_addr_t) 0x0a000000) /* 10.0.0.0 */
  44. #define INADDR_B ((in_addr_t) 0xc0a80000) /* 192.168.0.0 */
  45. /* /30 mask for one veth connection */
  46. #define PREFIX_LEN 30
  47. #define child_ip(nr) (4*nr + 1)
  48. #define grchild_ip(nr) (4*nr + 2)
  49. #define VETH_FMT "ktst-%d"
  50. #define VETH_LEN 12
  51. #define XFRM_ALGO_NR_KEYS 29
  52. static int nsfd_parent = -1;
  53. static int nsfd_childa = -1;
  54. static int nsfd_childb = -1;
  55. static long page_size;
  56. /*
  57. * ksft_cnt is static in kselftest, so isn't shared with children.
  58. * We have to send a test result back to parent and count there.
  59. * results_fd is a pipe with test feedback from children.
  60. */
  61. static int results_fd[2];
  62. const unsigned int ping_delay_nsec = 50 * 1000 * 1000;
  63. const unsigned int ping_timeout = 300;
  64. const unsigned int ping_count = 100;
  65. const unsigned int ping_success = 80;
  66. struct xfrm_key_entry {
  67. char algo_name[35];
  68. int key_len;
  69. };
  70. struct xfrm_key_entry xfrm_key_entries[] = {
  71. {"digest_null", 0},
  72. {"ecb(cipher_null)", 0},
  73. {"cbc(des)", 64},
  74. {"hmac(md5)", 128},
  75. {"cmac(aes)", 128},
  76. {"xcbc(aes)", 128},
  77. {"cbc(cast5)", 128},
  78. {"cbc(serpent)", 128},
  79. {"hmac(sha1)", 160},
  80. {"hmac(rmd160)", 160},
  81. {"cbc(des3_ede)", 192},
  82. {"hmac(sha256)", 256},
  83. {"cbc(aes)", 256},
  84. {"cbc(camellia)", 256},
  85. {"cbc(twofish)", 256},
  86. {"rfc3686(ctr(aes))", 288},
  87. {"hmac(sha384)", 384},
  88. {"cbc(blowfish)", 448},
  89. {"hmac(sha512)", 512},
  90. {"rfc4106(gcm(aes))-128", 160},
  91. {"rfc4543(gcm(aes))-128", 160},
  92. {"rfc4309(ccm(aes))-128", 152},
  93. {"rfc4106(gcm(aes))-192", 224},
  94. {"rfc4543(gcm(aes))-192", 224},
  95. {"rfc4309(ccm(aes))-192", 216},
  96. {"rfc4106(gcm(aes))-256", 288},
  97. {"rfc4543(gcm(aes))-256", 288},
  98. {"rfc4309(ccm(aes))-256", 280},
  99. {"rfc7539(chacha20,poly1305)-128", 0}
  100. };
  101. static void randomize_buffer(void *buf, size_t buflen)
  102. {
  103. int *p = (int *)buf;
  104. size_t words = buflen / sizeof(int);
  105. size_t leftover = buflen % sizeof(int);
  106. if (!buflen)
  107. return;
  108. while (words--)
  109. *p++ = rand();
  110. if (leftover) {
  111. int tmp = rand();
  112. memcpy(buf + buflen - leftover, &tmp, leftover);
  113. }
  114. return;
  115. }
  116. static int unshare_open(void)
  117. {
  118. const char *netns_path = "/proc/self/ns/net";
  119. int fd;
  120. if (unshare(CLONE_NEWNET) != 0) {
  121. pr_err("unshare()");
  122. return -1;
  123. }
  124. fd = open(netns_path, O_RDONLY);
  125. if (fd <= 0) {
  126. pr_err("open(%s)", netns_path);
  127. return -1;
  128. }
  129. return fd;
  130. }
  131. static int switch_ns(int fd)
  132. {
  133. if (setns(fd, CLONE_NEWNET)) {
  134. pr_err("setns()");
  135. return -1;
  136. }
  137. return 0;
  138. }
  139. /*
  140. * Running the test inside a new parent net namespace to bother less
  141. * about cleanup on error-path.
  142. */
  143. static int init_namespaces(void)
  144. {
  145. nsfd_parent = unshare_open();
  146. if (nsfd_parent <= 0)
  147. return -1;
  148. nsfd_childa = unshare_open();
  149. if (nsfd_childa <= 0)
  150. return -1;
  151. if (switch_ns(nsfd_parent))
  152. return -1;
  153. nsfd_childb = unshare_open();
  154. if (nsfd_childb <= 0)
  155. return -1;
  156. if (switch_ns(nsfd_parent))
  157. return -1;
  158. return 0;
  159. }
  160. static int netlink_sock(int *sock, uint32_t *seq_nr, int proto)
  161. {
  162. if (*sock > 0) {
  163. seq_nr++;
  164. return 0;
  165. }
  166. *sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, proto);
  167. if (*sock <= 0) {
  168. pr_err("socket(AF_NETLINK)");
  169. return -1;
  170. }
  171. randomize_buffer(seq_nr, sizeof(*seq_nr));
  172. return 0;
  173. }
  174. static inline struct rtattr *rtattr_hdr(struct nlmsghdr *nh)
  175. {
  176. return (struct rtattr *)((char *)(nh) + RTA_ALIGN((nh)->nlmsg_len));
  177. }
  178. static int rtattr_pack(struct nlmsghdr *nh, size_t req_sz,
  179. unsigned short rta_type, const void *payload, size_t size)
  180. {
  181. /* NLMSG_ALIGNTO == RTA_ALIGNTO, nlmsg_len already aligned */
  182. struct rtattr *attr = rtattr_hdr(nh);
  183. size_t nl_size = RTA_ALIGN(nh->nlmsg_len) + RTA_LENGTH(size);
  184. if (req_sz < nl_size) {
  185. printk("req buf is too small: %zu < %zu", req_sz, nl_size);
  186. return -1;
  187. }
  188. nh->nlmsg_len = nl_size;
  189. attr->rta_len = RTA_LENGTH(size);
  190. attr->rta_type = rta_type;
  191. if (payload)
  192. memcpy(RTA_DATA(attr), payload, size);
  193. return 0;
  194. }
  195. static struct rtattr *_rtattr_begin(struct nlmsghdr *nh, size_t req_sz,
  196. unsigned short rta_type, const void *payload, size_t size)
  197. {
  198. struct rtattr *ret = rtattr_hdr(nh);
  199. if (rtattr_pack(nh, req_sz, rta_type, payload, size))
  200. return 0;
  201. return ret;
  202. }
  203. static inline struct rtattr *rtattr_begin(struct nlmsghdr *nh, size_t req_sz,
  204. unsigned short rta_type)
  205. {
  206. return _rtattr_begin(nh, req_sz, rta_type, 0, 0);
  207. }
  208. static inline void rtattr_end(struct nlmsghdr *nh, struct rtattr *attr)
  209. {
  210. char *nlmsg_end = (char *)nh + nh->nlmsg_len;
  211. attr->rta_len = nlmsg_end - (char *)attr;
  212. }
  213. static int veth_pack_peerb(struct nlmsghdr *nh, size_t req_sz,
  214. const char *peer, int ns)
  215. {
  216. struct ifinfomsg pi;
  217. struct rtattr *peer_attr;
  218. memset(&pi, 0, sizeof(pi));
  219. pi.ifi_family = AF_UNSPEC;
  220. pi.ifi_change = 0xFFFFFFFF;
  221. peer_attr = _rtattr_begin(nh, req_sz, VETH_INFO_PEER, &pi, sizeof(pi));
  222. if (!peer_attr)
  223. return -1;
  224. if (rtattr_pack(nh, req_sz, IFLA_IFNAME, peer, strlen(peer)))
  225. return -1;
  226. if (rtattr_pack(nh, req_sz, IFLA_NET_NS_FD, &ns, sizeof(ns)))
  227. return -1;
  228. rtattr_end(nh, peer_attr);
  229. return 0;
  230. }
  231. static int netlink_check_answer(int sock)
  232. {
  233. struct nlmsgerror {
  234. struct nlmsghdr hdr;
  235. int error;
  236. struct nlmsghdr orig_msg;
  237. } answer;
  238. if (recv(sock, &answer, sizeof(answer), 0) < 0) {
  239. pr_err("recv()");
  240. return -1;
  241. } else if (answer.hdr.nlmsg_type != NLMSG_ERROR) {
  242. printk("expected NLMSG_ERROR, got %d", (int)answer.hdr.nlmsg_type);
  243. return -1;
  244. } else if (answer.error) {
  245. printk("NLMSG_ERROR: %d: %s",
  246. answer.error, strerror(-answer.error));
  247. return answer.error;
  248. }
  249. return 0;
  250. }
  251. static int veth_add(int sock, uint32_t seq, const char *peera, int ns_a,
  252. const char *peerb, int ns_b)
  253. {
  254. uint16_t flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE;
  255. struct {
  256. struct nlmsghdr nh;
  257. struct ifinfomsg info;
  258. char attrbuf[MAX_PAYLOAD];
  259. } req;
  260. const char veth_type[] = "veth";
  261. struct rtattr *link_info, *info_data;
  262. memset(&req, 0, sizeof(req));
  263. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.info));
  264. req.nh.nlmsg_type = RTM_NEWLINK;
  265. req.nh.nlmsg_flags = flags;
  266. req.nh.nlmsg_seq = seq;
  267. req.info.ifi_family = AF_UNSPEC;
  268. req.info.ifi_change = 0xFFFFFFFF;
  269. if (rtattr_pack(&req.nh, sizeof(req), IFLA_IFNAME, peera, strlen(peera)))
  270. return -1;
  271. if (rtattr_pack(&req.nh, sizeof(req), IFLA_NET_NS_FD, &ns_a, sizeof(ns_a)))
  272. return -1;
  273. link_info = rtattr_begin(&req.nh, sizeof(req), IFLA_LINKINFO);
  274. if (!link_info)
  275. return -1;
  276. if (rtattr_pack(&req.nh, sizeof(req), IFLA_INFO_KIND, veth_type, sizeof(veth_type)))
  277. return -1;
  278. info_data = rtattr_begin(&req.nh, sizeof(req), IFLA_INFO_DATA);
  279. if (!info_data)
  280. return -1;
  281. if (veth_pack_peerb(&req.nh, sizeof(req), peerb, ns_b))
  282. return -1;
  283. rtattr_end(&req.nh, info_data);
  284. rtattr_end(&req.nh, link_info);
  285. if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
  286. pr_err("send()");
  287. return -1;
  288. }
  289. return netlink_check_answer(sock);
  290. }
  291. static int ip4_addr_set(int sock, uint32_t seq, const char *intf,
  292. struct in_addr addr, uint8_t prefix)
  293. {
  294. uint16_t flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE;
  295. struct {
  296. struct nlmsghdr nh;
  297. struct ifaddrmsg info;
  298. char attrbuf[MAX_PAYLOAD];
  299. } req;
  300. memset(&req, 0, sizeof(req));
  301. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.info));
  302. req.nh.nlmsg_type = RTM_NEWADDR;
  303. req.nh.nlmsg_flags = flags;
  304. req.nh.nlmsg_seq = seq;
  305. req.info.ifa_family = AF_INET;
  306. req.info.ifa_prefixlen = prefix;
  307. req.info.ifa_index = if_nametoindex(intf);
  308. #ifdef DEBUG
  309. {
  310. char addr_str[IPV4_STR_SZ] = {};
  311. strncpy(addr_str, inet_ntoa(addr), IPV4_STR_SZ - 1);
  312. printk("ip addr set %s", addr_str);
  313. }
  314. #endif
  315. if (rtattr_pack(&req.nh, sizeof(req), IFA_LOCAL, &addr, sizeof(addr)))
  316. return -1;
  317. if (rtattr_pack(&req.nh, sizeof(req), IFA_ADDRESS, &addr, sizeof(addr)))
  318. return -1;
  319. if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
  320. pr_err("send()");
  321. return -1;
  322. }
  323. return netlink_check_answer(sock);
  324. }
  325. static int link_set_up(int sock, uint32_t seq, const char *intf)
  326. {
  327. struct {
  328. struct nlmsghdr nh;
  329. struct ifinfomsg info;
  330. char attrbuf[MAX_PAYLOAD];
  331. } req;
  332. memset(&req, 0, sizeof(req));
  333. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.info));
  334. req.nh.nlmsg_type = RTM_NEWLINK;
  335. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  336. req.nh.nlmsg_seq = seq;
  337. req.info.ifi_family = AF_UNSPEC;
  338. req.info.ifi_change = 0xFFFFFFFF;
  339. req.info.ifi_index = if_nametoindex(intf);
  340. req.info.ifi_flags = IFF_UP;
  341. req.info.ifi_change = IFF_UP;
  342. if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
  343. pr_err("send()");
  344. return -1;
  345. }
  346. return netlink_check_answer(sock);
  347. }
  348. static int ip4_route_set(int sock, uint32_t seq, const char *intf,
  349. struct in_addr src, struct in_addr dst)
  350. {
  351. struct {
  352. struct nlmsghdr nh;
  353. struct rtmsg rt;
  354. char attrbuf[MAX_PAYLOAD];
  355. } req;
  356. unsigned int index = if_nametoindex(intf);
  357. memset(&req, 0, sizeof(req));
  358. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.rt));
  359. req.nh.nlmsg_type = RTM_NEWROUTE;
  360. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE;
  361. req.nh.nlmsg_seq = seq;
  362. req.rt.rtm_family = AF_INET;
  363. req.rt.rtm_dst_len = 32;
  364. req.rt.rtm_table = RT_TABLE_MAIN;
  365. req.rt.rtm_protocol = RTPROT_BOOT;
  366. req.rt.rtm_scope = RT_SCOPE_LINK;
  367. req.rt.rtm_type = RTN_UNICAST;
  368. if (rtattr_pack(&req.nh, sizeof(req), RTA_DST, &dst, sizeof(dst)))
  369. return -1;
  370. if (rtattr_pack(&req.nh, sizeof(req), RTA_PREFSRC, &src, sizeof(src)))
  371. return -1;
  372. if (rtattr_pack(&req.nh, sizeof(req), RTA_OIF, &index, sizeof(index)))
  373. return -1;
  374. if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
  375. pr_err("send()");
  376. return -1;
  377. }
  378. return netlink_check_answer(sock);
  379. }
  380. static int tunnel_set_route(int route_sock, uint32_t *route_seq, char *veth,
  381. struct in_addr tunsrc, struct in_addr tundst)
  382. {
  383. if (ip4_addr_set(route_sock, (*route_seq)++, "lo",
  384. tunsrc, PREFIX_LEN)) {
  385. printk("Failed to set ipv4 addr");
  386. return -1;
  387. }
  388. if (ip4_route_set(route_sock, (*route_seq)++, veth, tunsrc, tundst)) {
  389. printk("Failed to set ipv4 route");
  390. return -1;
  391. }
  392. return 0;
  393. }
  394. static int init_child(int nsfd, char *veth, unsigned int src, unsigned int dst)
  395. {
  396. struct in_addr intsrc = inet_makeaddr(INADDR_B, src);
  397. struct in_addr tunsrc = inet_makeaddr(INADDR_A, src);
  398. struct in_addr tundst = inet_makeaddr(INADDR_A, dst);
  399. int route_sock = -1, ret = -1;
  400. uint32_t route_seq;
  401. if (switch_ns(nsfd))
  402. return -1;
  403. if (netlink_sock(&route_sock, &route_seq, NETLINK_ROUTE)) {
  404. printk("Failed to open netlink route socket in child");
  405. return -1;
  406. }
  407. if (ip4_addr_set(route_sock, route_seq++, veth, intsrc, PREFIX_LEN)) {
  408. printk("Failed to set ipv4 addr");
  409. goto err;
  410. }
  411. if (link_set_up(route_sock, route_seq++, veth)) {
  412. printk("Failed to bring up %s", veth);
  413. goto err;
  414. }
  415. if (tunnel_set_route(route_sock, &route_seq, veth, tunsrc, tundst)) {
  416. printk("Failed to add tunnel route on %s", veth);
  417. goto err;
  418. }
  419. ret = 0;
  420. err:
  421. close(route_sock);
  422. return ret;
  423. }
  424. #define ALGO_LEN 64
  425. enum desc_type {
  426. CREATE_TUNNEL = 0,
  427. ALLOCATE_SPI,
  428. MONITOR_ACQUIRE,
  429. EXPIRE_STATE,
  430. EXPIRE_POLICY,
  431. SPDINFO_ATTRS,
  432. };
  433. const char *desc_name[] = {
  434. "create tunnel",
  435. "alloc spi",
  436. "monitor acquire",
  437. "expire state",
  438. "expire policy",
  439. "spdinfo attributes",
  440. ""
  441. };
  442. struct xfrm_desc {
  443. enum desc_type type;
  444. uint8_t proto;
  445. char a_algo[ALGO_LEN];
  446. char e_algo[ALGO_LEN];
  447. char c_algo[ALGO_LEN];
  448. char ae_algo[ALGO_LEN];
  449. unsigned int icv_len;
  450. /* unsigned key_len; */
  451. };
  452. enum msg_type {
  453. MSG_ACK = 0,
  454. MSG_EXIT,
  455. MSG_PING,
  456. MSG_XFRM_PREPARE,
  457. MSG_XFRM_ADD,
  458. MSG_XFRM_DEL,
  459. MSG_XFRM_CLEANUP,
  460. };
  461. struct test_desc {
  462. enum msg_type type;
  463. union {
  464. struct {
  465. in_addr_t reply_ip;
  466. unsigned int port;
  467. } ping;
  468. struct xfrm_desc xfrm_desc;
  469. } body;
  470. };
  471. struct test_result {
  472. struct xfrm_desc desc;
  473. unsigned int res;
  474. };
  475. static void write_test_result(unsigned int res, struct xfrm_desc *d)
  476. {
  477. struct test_result tr = {};
  478. ssize_t ret;
  479. tr.desc = *d;
  480. tr.res = res;
  481. ret = write(results_fd[1], &tr, sizeof(tr));
  482. if (ret != sizeof(tr))
  483. pr_err("Failed to write the result in pipe %zd", ret);
  484. }
  485. static void write_msg(int fd, struct test_desc *msg, bool exit_of_fail)
  486. {
  487. ssize_t bytes = write(fd, msg, sizeof(*msg));
  488. /* Make sure that write/read is atomic to a pipe */
  489. BUILD_BUG_ON(sizeof(struct test_desc) > PIPE_BUF);
  490. if (bytes < 0) {
  491. pr_err("write()");
  492. if (exit_of_fail)
  493. exit(KSFT_FAIL);
  494. }
  495. if (bytes != sizeof(*msg)) {
  496. pr_err("sent part of the message %zd/%zu", bytes, sizeof(*msg));
  497. if (exit_of_fail)
  498. exit(KSFT_FAIL);
  499. }
  500. }
  501. static void read_msg(int fd, struct test_desc *msg, bool exit_of_fail)
  502. {
  503. ssize_t bytes = read(fd, msg, sizeof(*msg));
  504. if (bytes < 0) {
  505. pr_err("read()");
  506. if (exit_of_fail)
  507. exit(KSFT_FAIL);
  508. }
  509. if (bytes != sizeof(*msg)) {
  510. pr_err("got incomplete message %zd/%zu", bytes, sizeof(*msg));
  511. if (exit_of_fail)
  512. exit(KSFT_FAIL);
  513. }
  514. }
  515. static int udp_ping_init(struct in_addr listen_ip, unsigned int u_timeout,
  516. unsigned int *server_port, int sock[2])
  517. {
  518. struct sockaddr_in server;
  519. struct timeval t = { .tv_sec = 0, .tv_usec = u_timeout };
  520. socklen_t s_len = sizeof(server);
  521. sock[0] = socket(AF_INET, SOCK_DGRAM, 0);
  522. if (sock[0] < 0) {
  523. pr_err("socket()");
  524. return -1;
  525. }
  526. server.sin_family = AF_INET;
  527. server.sin_port = 0;
  528. memcpy(&server.sin_addr.s_addr, &listen_ip, sizeof(struct in_addr));
  529. if (bind(sock[0], (struct sockaddr *)&server, s_len)) {
  530. pr_err("bind()");
  531. goto err_close_server;
  532. }
  533. if (getsockname(sock[0], (struct sockaddr *)&server, &s_len)) {
  534. pr_err("getsockname()");
  535. goto err_close_server;
  536. }
  537. *server_port = ntohs(server.sin_port);
  538. if (setsockopt(sock[0], SOL_SOCKET, SO_RCVTIMEO, (const char *)&t, sizeof t)) {
  539. pr_err("setsockopt()");
  540. goto err_close_server;
  541. }
  542. sock[1] = socket(AF_INET, SOCK_DGRAM, 0);
  543. if (sock[1] < 0) {
  544. pr_err("socket()");
  545. goto err_close_server;
  546. }
  547. return 0;
  548. err_close_server:
  549. close(sock[0]);
  550. return -1;
  551. }
  552. static int udp_ping_send(int sock[2], in_addr_t dest_ip, unsigned int port,
  553. char *buf, size_t buf_len)
  554. {
  555. struct sockaddr_in server;
  556. const struct sockaddr *dest_addr = (struct sockaddr *)&server;
  557. char *sock_buf[buf_len];
  558. ssize_t r_bytes, s_bytes;
  559. server.sin_family = AF_INET;
  560. server.sin_port = htons(port);
  561. server.sin_addr.s_addr = dest_ip;
  562. s_bytes = sendto(sock[1], buf, buf_len, 0, dest_addr, sizeof(server));
  563. if (s_bytes < 0) {
  564. pr_err("sendto()");
  565. return -1;
  566. } else if (s_bytes != buf_len) {
  567. printk("send part of the message: %zd/%zu", s_bytes, sizeof(server));
  568. return -1;
  569. }
  570. r_bytes = recv(sock[0], sock_buf, buf_len, 0);
  571. if (r_bytes < 0) {
  572. if (errno != EAGAIN)
  573. pr_err("recv()");
  574. return -1;
  575. } else if (r_bytes == 0) { /* EOF */
  576. printk("EOF on reply to ping");
  577. return -1;
  578. } else if (r_bytes != buf_len || memcmp(buf, sock_buf, buf_len)) {
  579. printk("ping reply packet is corrupted %zd/%zu", r_bytes, buf_len);
  580. return -1;
  581. }
  582. return 0;
  583. }
  584. static int udp_ping_reply(int sock[2], in_addr_t dest_ip, unsigned int port,
  585. char *buf, size_t buf_len)
  586. {
  587. struct sockaddr_in server;
  588. const struct sockaddr *dest_addr = (struct sockaddr *)&server;
  589. char *sock_buf[buf_len];
  590. ssize_t r_bytes, s_bytes;
  591. server.sin_family = AF_INET;
  592. server.sin_port = htons(port);
  593. server.sin_addr.s_addr = dest_ip;
  594. r_bytes = recv(sock[0], sock_buf, buf_len, 0);
  595. if (r_bytes < 0) {
  596. if (errno != EAGAIN)
  597. pr_err("recv()");
  598. return -1;
  599. }
  600. if (r_bytes == 0) { /* EOF */
  601. printk("EOF on reply to ping");
  602. return -1;
  603. }
  604. if (r_bytes != buf_len || memcmp(buf, sock_buf, buf_len)) {
  605. printk("ping reply packet is corrupted %zd/%zu", r_bytes, buf_len);
  606. return -1;
  607. }
  608. s_bytes = sendto(sock[1], buf, buf_len, 0, dest_addr, sizeof(server));
  609. if (s_bytes < 0) {
  610. pr_err("sendto()");
  611. return -1;
  612. } else if (s_bytes != buf_len) {
  613. printk("send part of the message: %zd/%zu", s_bytes, sizeof(server));
  614. return -1;
  615. }
  616. return 0;
  617. }
  618. typedef int (*ping_f)(int sock[2], in_addr_t dest_ip, unsigned int port,
  619. char *buf, size_t buf_len);
  620. static int do_ping(int cmd_fd, char *buf, size_t buf_len, struct in_addr from,
  621. bool init_side, int d_port, in_addr_t to, ping_f func)
  622. {
  623. struct test_desc msg;
  624. unsigned int s_port, i, ping_succeeded = 0;
  625. int ping_sock[2];
  626. char to_str[IPV4_STR_SZ] = {}, from_str[IPV4_STR_SZ] = {};
  627. if (udp_ping_init(from, ping_timeout, &s_port, ping_sock)) {
  628. printk("Failed to init ping");
  629. return -1;
  630. }
  631. memset(&msg, 0, sizeof(msg));
  632. msg.type = MSG_PING;
  633. msg.body.ping.port = s_port;
  634. memcpy(&msg.body.ping.reply_ip, &from, sizeof(from));
  635. write_msg(cmd_fd, &msg, 0);
  636. if (init_side) {
  637. /* The other end sends ip to ping */
  638. read_msg(cmd_fd, &msg, 0);
  639. if (msg.type != MSG_PING)
  640. return -1;
  641. to = msg.body.ping.reply_ip;
  642. d_port = msg.body.ping.port;
  643. }
  644. for (i = 0; i < ping_count ; i++) {
  645. struct timespec sleep_time = {
  646. .tv_sec = 0,
  647. .tv_nsec = ping_delay_nsec,
  648. };
  649. ping_succeeded += !func(ping_sock, to, d_port, buf, page_size);
  650. nanosleep(&sleep_time, 0);
  651. }
  652. close(ping_sock[0]);
  653. close(ping_sock[1]);
  654. strncpy(to_str, inet_ntoa(*(struct in_addr *)&to), IPV4_STR_SZ - 1);
  655. strncpy(from_str, inet_ntoa(from), IPV4_STR_SZ - 1);
  656. if (ping_succeeded < ping_success) {
  657. printk("ping (%s) %s->%s failed %u/%u times",
  658. init_side ? "send" : "reply", from_str, to_str,
  659. ping_count - ping_succeeded, ping_count);
  660. return -1;
  661. }
  662. #ifdef DEBUG
  663. printk("ping (%s) %s->%s succeeded %u/%u times",
  664. init_side ? "send" : "reply", from_str, to_str,
  665. ping_succeeded, ping_count);
  666. #endif
  667. return 0;
  668. }
  669. static int xfrm_fill_key(char *name, char *buf,
  670. size_t buf_len, unsigned int *key_len)
  671. {
  672. int i;
  673. for (i = 0; i < XFRM_ALGO_NR_KEYS; i++) {
  674. if (strncmp(name, xfrm_key_entries[i].algo_name, ALGO_LEN) == 0)
  675. *key_len = xfrm_key_entries[i].key_len;
  676. }
  677. if (*key_len > buf_len) {
  678. printk("Can't pack a key - too big for buffer");
  679. return -1;
  680. }
  681. randomize_buffer(buf, *key_len);
  682. return 0;
  683. }
  684. static int xfrm_state_pack_algo(struct nlmsghdr *nh, size_t req_sz,
  685. struct xfrm_desc *desc)
  686. {
  687. struct {
  688. union {
  689. struct xfrm_algo alg;
  690. struct xfrm_algo_aead aead;
  691. struct xfrm_algo_auth auth;
  692. } u;
  693. char buf[XFRM_ALGO_KEY_BUF_SIZE];
  694. } alg = {};
  695. size_t alen, elen, clen, aelen;
  696. unsigned short type;
  697. alen = strlen(desc->a_algo);
  698. elen = strlen(desc->e_algo);
  699. clen = strlen(desc->c_algo);
  700. aelen = strlen(desc->ae_algo);
  701. /* Verify desc */
  702. switch (desc->proto) {
  703. case IPPROTO_AH:
  704. if (!alen || elen || clen || aelen) {
  705. printk("BUG: buggy ah desc");
  706. return -1;
  707. }
  708. strncpy(alg.u.alg.alg_name, desc->a_algo, ALGO_LEN - 1);
  709. if (xfrm_fill_key(desc->a_algo, alg.u.alg.alg_key,
  710. sizeof(alg.buf), &alg.u.alg.alg_key_len))
  711. return -1;
  712. type = XFRMA_ALG_AUTH;
  713. break;
  714. case IPPROTO_COMP:
  715. if (!clen || elen || alen || aelen) {
  716. printk("BUG: buggy comp desc");
  717. return -1;
  718. }
  719. strncpy(alg.u.alg.alg_name, desc->c_algo, ALGO_LEN - 1);
  720. if (xfrm_fill_key(desc->c_algo, alg.u.alg.alg_key,
  721. sizeof(alg.buf), &alg.u.alg.alg_key_len))
  722. return -1;
  723. type = XFRMA_ALG_COMP;
  724. break;
  725. case IPPROTO_ESP:
  726. if (!((alen && elen) ^ aelen) || clen) {
  727. printk("BUG: buggy esp desc");
  728. return -1;
  729. }
  730. if (aelen) {
  731. alg.u.aead.alg_icv_len = desc->icv_len;
  732. strncpy(alg.u.aead.alg_name, desc->ae_algo, ALGO_LEN - 1);
  733. if (xfrm_fill_key(desc->ae_algo, alg.u.aead.alg_key,
  734. sizeof(alg.buf), &alg.u.aead.alg_key_len))
  735. return -1;
  736. type = XFRMA_ALG_AEAD;
  737. } else {
  738. strncpy(alg.u.alg.alg_name, desc->e_algo, ALGO_LEN - 1);
  739. type = XFRMA_ALG_CRYPT;
  740. if (xfrm_fill_key(desc->e_algo, alg.u.alg.alg_key,
  741. sizeof(alg.buf), &alg.u.alg.alg_key_len))
  742. return -1;
  743. if (rtattr_pack(nh, req_sz, type, &alg, sizeof(alg)))
  744. return -1;
  745. strncpy(alg.u.alg.alg_name, desc->a_algo, ALGO_LEN);
  746. type = XFRMA_ALG_AUTH;
  747. if (xfrm_fill_key(desc->a_algo, alg.u.alg.alg_key,
  748. sizeof(alg.buf), &alg.u.alg.alg_key_len))
  749. return -1;
  750. }
  751. break;
  752. default:
  753. printk("BUG: unknown proto in desc");
  754. return -1;
  755. }
  756. if (rtattr_pack(nh, req_sz, type, &alg, sizeof(alg)))
  757. return -1;
  758. return 0;
  759. }
  760. static inline uint32_t gen_spi(struct in_addr src)
  761. {
  762. return htonl(inet_lnaof(src));
  763. }
  764. static int xfrm_state_add(int xfrm_sock, uint32_t seq, uint32_t spi,
  765. struct in_addr src, struct in_addr dst,
  766. struct xfrm_desc *desc)
  767. {
  768. struct {
  769. struct nlmsghdr nh;
  770. struct xfrm_usersa_info info;
  771. char attrbuf[MAX_PAYLOAD];
  772. } req;
  773. memset(&req, 0, sizeof(req));
  774. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.info));
  775. req.nh.nlmsg_type = XFRM_MSG_NEWSA;
  776. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  777. req.nh.nlmsg_seq = seq;
  778. /* Fill selector. */
  779. memcpy(&req.info.sel.daddr, &dst, sizeof(dst));
  780. memcpy(&req.info.sel.saddr, &src, sizeof(src));
  781. req.info.sel.family = AF_INET;
  782. req.info.sel.prefixlen_d = PREFIX_LEN;
  783. req.info.sel.prefixlen_s = PREFIX_LEN;
  784. /* Fill id */
  785. memcpy(&req.info.id.daddr, &dst, sizeof(dst));
  786. /* Note: zero-spi cannot be deleted */
  787. req.info.id.spi = spi;
  788. req.info.id.proto = desc->proto;
  789. memcpy(&req.info.saddr, &src, sizeof(src));
  790. /* Fill lifteme_cfg */
  791. req.info.lft.soft_byte_limit = XFRM_INF;
  792. req.info.lft.hard_byte_limit = XFRM_INF;
  793. req.info.lft.soft_packet_limit = XFRM_INF;
  794. req.info.lft.hard_packet_limit = XFRM_INF;
  795. req.info.family = AF_INET;
  796. req.info.mode = XFRM_MODE_TUNNEL;
  797. if (xfrm_state_pack_algo(&req.nh, sizeof(req), desc))
  798. return -1;
  799. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  800. pr_err("send()");
  801. return -1;
  802. }
  803. return netlink_check_answer(xfrm_sock);
  804. }
  805. static bool xfrm_usersa_found(struct xfrm_usersa_info *info, uint32_t spi,
  806. struct in_addr src, struct in_addr dst,
  807. struct xfrm_desc *desc)
  808. {
  809. if (memcmp(&info->sel.daddr, &dst, sizeof(dst)))
  810. return false;
  811. if (memcmp(&info->sel.saddr, &src, sizeof(src)))
  812. return false;
  813. if (info->sel.family != AF_INET ||
  814. info->sel.prefixlen_d != PREFIX_LEN ||
  815. info->sel.prefixlen_s != PREFIX_LEN)
  816. return false;
  817. if (info->id.spi != spi || info->id.proto != desc->proto)
  818. return false;
  819. if (memcmp(&info->id.daddr, &dst, sizeof(dst)))
  820. return false;
  821. if (memcmp(&info->saddr, &src, sizeof(src)))
  822. return false;
  823. if (info->lft.soft_byte_limit != XFRM_INF ||
  824. info->lft.hard_byte_limit != XFRM_INF ||
  825. info->lft.soft_packet_limit != XFRM_INF ||
  826. info->lft.hard_packet_limit != XFRM_INF)
  827. return false;
  828. if (info->family != AF_INET || info->mode != XFRM_MODE_TUNNEL)
  829. return false;
  830. /* XXX: check xfrm algo, see xfrm_state_pack_algo(). */
  831. return true;
  832. }
  833. static int xfrm_state_check(int xfrm_sock, uint32_t seq, uint32_t spi,
  834. struct in_addr src, struct in_addr dst,
  835. struct xfrm_desc *desc)
  836. {
  837. struct {
  838. struct nlmsghdr nh;
  839. char attrbuf[MAX_PAYLOAD];
  840. } req;
  841. struct {
  842. struct nlmsghdr nh;
  843. union {
  844. struct xfrm_usersa_info info;
  845. int error;
  846. };
  847. char attrbuf[MAX_PAYLOAD];
  848. } answer;
  849. struct xfrm_address_filter filter = {};
  850. bool found = false;
  851. memset(&req, 0, sizeof(req));
  852. req.nh.nlmsg_len = NLMSG_LENGTH(0);
  853. req.nh.nlmsg_type = XFRM_MSG_GETSA;
  854. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
  855. req.nh.nlmsg_seq = seq;
  856. /*
  857. * Add dump filter by source address as there may be other tunnels
  858. * in this netns (if tests run in parallel).
  859. */
  860. filter.family = AF_INET;
  861. filter.splen = 0x1f; /* 0xffffffff mask see addr_match() */
  862. memcpy(&filter.saddr, &src, sizeof(src));
  863. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_ADDRESS_FILTER,
  864. &filter, sizeof(filter)))
  865. return -1;
  866. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  867. pr_err("send()");
  868. return -1;
  869. }
  870. while (1) {
  871. if (recv(xfrm_sock, &answer, sizeof(answer), 0) < 0) {
  872. pr_err("recv()");
  873. return -1;
  874. }
  875. if (answer.nh.nlmsg_type == NLMSG_ERROR) {
  876. printk("NLMSG_ERROR: %d: %s",
  877. answer.error, strerror(-answer.error));
  878. return -1;
  879. } else if (answer.nh.nlmsg_type == NLMSG_DONE) {
  880. if (found)
  881. return 0;
  882. printk("didn't find allocated xfrm state in dump");
  883. return -1;
  884. } else if (answer.nh.nlmsg_type == XFRM_MSG_NEWSA) {
  885. if (xfrm_usersa_found(&answer.info, spi, src, dst, desc))
  886. found = true;
  887. }
  888. }
  889. }
  890. static int xfrm_set(int xfrm_sock, uint32_t *seq,
  891. struct in_addr src, struct in_addr dst,
  892. struct in_addr tunsrc, struct in_addr tundst,
  893. struct xfrm_desc *desc)
  894. {
  895. int err;
  896. err = xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc);
  897. if (err) {
  898. printk("Failed to add xfrm state");
  899. return -1;
  900. }
  901. err = xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), dst, src, desc);
  902. if (err) {
  903. printk("Failed to add xfrm state");
  904. return -1;
  905. }
  906. /* Check dumps for XFRM_MSG_GETSA */
  907. err = xfrm_state_check(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc);
  908. err |= xfrm_state_check(xfrm_sock, (*seq)++, gen_spi(src), dst, src, desc);
  909. if (err) {
  910. printk("Failed to check xfrm state");
  911. return -1;
  912. }
  913. return 0;
  914. }
  915. static int xfrm_policy_add(int xfrm_sock, uint32_t seq, uint32_t spi,
  916. struct in_addr src, struct in_addr dst, uint8_t dir,
  917. struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
  918. {
  919. struct {
  920. struct nlmsghdr nh;
  921. struct xfrm_userpolicy_info info;
  922. char attrbuf[MAX_PAYLOAD];
  923. } req;
  924. struct xfrm_user_tmpl tmpl;
  925. memset(&req, 0, sizeof(req));
  926. memset(&tmpl, 0, sizeof(tmpl));
  927. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.info));
  928. req.nh.nlmsg_type = XFRM_MSG_NEWPOLICY;
  929. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  930. req.nh.nlmsg_seq = seq;
  931. /* Fill selector. */
  932. memcpy(&req.info.sel.daddr, &dst, sizeof(tundst));
  933. memcpy(&req.info.sel.saddr, &src, sizeof(tunsrc));
  934. req.info.sel.family = AF_INET;
  935. req.info.sel.prefixlen_d = PREFIX_LEN;
  936. req.info.sel.prefixlen_s = PREFIX_LEN;
  937. /* Fill lifteme_cfg */
  938. req.info.lft.soft_byte_limit = XFRM_INF;
  939. req.info.lft.hard_byte_limit = XFRM_INF;
  940. req.info.lft.soft_packet_limit = XFRM_INF;
  941. req.info.lft.hard_packet_limit = XFRM_INF;
  942. req.info.dir = dir;
  943. /* Fill tmpl */
  944. memcpy(&tmpl.id.daddr, &dst, sizeof(dst));
  945. /* Note: zero-spi cannot be deleted */
  946. tmpl.id.spi = spi;
  947. tmpl.id.proto = proto;
  948. tmpl.family = AF_INET;
  949. memcpy(&tmpl.saddr, &src, sizeof(src));
  950. tmpl.mode = XFRM_MODE_TUNNEL;
  951. tmpl.aalgos = (~(uint32_t)0);
  952. tmpl.ealgos = (~(uint32_t)0);
  953. tmpl.calgos = (~(uint32_t)0);
  954. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_TMPL, &tmpl, sizeof(tmpl)))
  955. return -1;
  956. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  957. pr_err("send()");
  958. return -1;
  959. }
  960. return netlink_check_answer(xfrm_sock);
  961. }
  962. static int xfrm_prepare(int xfrm_sock, uint32_t *seq,
  963. struct in_addr src, struct in_addr dst,
  964. struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
  965. {
  966. if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst,
  967. XFRM_POLICY_OUT, tunsrc, tundst, proto)) {
  968. printk("Failed to add xfrm policy");
  969. return -1;
  970. }
  971. if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), dst, src,
  972. XFRM_POLICY_IN, tunsrc, tundst, proto)) {
  973. printk("Failed to add xfrm policy");
  974. return -1;
  975. }
  976. return 0;
  977. }
  978. static int xfrm_policy_del(int xfrm_sock, uint32_t seq,
  979. struct in_addr src, struct in_addr dst, uint8_t dir,
  980. struct in_addr tunsrc, struct in_addr tundst)
  981. {
  982. struct {
  983. struct nlmsghdr nh;
  984. struct xfrm_userpolicy_id id;
  985. char attrbuf[MAX_PAYLOAD];
  986. } req;
  987. memset(&req, 0, sizeof(req));
  988. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.id));
  989. req.nh.nlmsg_type = XFRM_MSG_DELPOLICY;
  990. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  991. req.nh.nlmsg_seq = seq;
  992. /* Fill id */
  993. memcpy(&req.id.sel.daddr, &dst, sizeof(tundst));
  994. memcpy(&req.id.sel.saddr, &src, sizeof(tunsrc));
  995. req.id.sel.family = AF_INET;
  996. req.id.sel.prefixlen_d = PREFIX_LEN;
  997. req.id.sel.prefixlen_s = PREFIX_LEN;
  998. req.id.dir = dir;
  999. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1000. pr_err("send()");
  1001. return -1;
  1002. }
  1003. return netlink_check_answer(xfrm_sock);
  1004. }
  1005. static int xfrm_cleanup(int xfrm_sock, uint32_t *seq,
  1006. struct in_addr src, struct in_addr dst,
  1007. struct in_addr tunsrc, struct in_addr tundst)
  1008. {
  1009. if (xfrm_policy_del(xfrm_sock, (*seq)++, src, dst,
  1010. XFRM_POLICY_OUT, tunsrc, tundst)) {
  1011. printk("Failed to add xfrm policy");
  1012. return -1;
  1013. }
  1014. if (xfrm_policy_del(xfrm_sock, (*seq)++, dst, src,
  1015. XFRM_POLICY_IN, tunsrc, tundst)) {
  1016. printk("Failed to add xfrm policy");
  1017. return -1;
  1018. }
  1019. return 0;
  1020. }
  1021. static int xfrm_state_del(int xfrm_sock, uint32_t seq, uint32_t spi,
  1022. struct in_addr src, struct in_addr dst, uint8_t proto)
  1023. {
  1024. struct {
  1025. struct nlmsghdr nh;
  1026. struct xfrm_usersa_id id;
  1027. char attrbuf[MAX_PAYLOAD];
  1028. } req;
  1029. xfrm_address_t saddr = {};
  1030. memset(&req, 0, sizeof(req));
  1031. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.id));
  1032. req.nh.nlmsg_type = XFRM_MSG_DELSA;
  1033. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  1034. req.nh.nlmsg_seq = seq;
  1035. memcpy(&req.id.daddr, &dst, sizeof(dst));
  1036. req.id.family = AF_INET;
  1037. req.id.proto = proto;
  1038. /* Note: zero-spi cannot be deleted */
  1039. req.id.spi = spi;
  1040. memcpy(&saddr, &src, sizeof(src));
  1041. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_SRCADDR, &saddr, sizeof(saddr)))
  1042. return -1;
  1043. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1044. pr_err("send()");
  1045. return -1;
  1046. }
  1047. return netlink_check_answer(xfrm_sock);
  1048. }
  1049. static int xfrm_delete(int xfrm_sock, uint32_t *seq,
  1050. struct in_addr src, struct in_addr dst,
  1051. struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
  1052. {
  1053. if (xfrm_state_del(xfrm_sock, (*seq)++, gen_spi(src), src, dst, proto)) {
  1054. printk("Failed to remove xfrm state");
  1055. return -1;
  1056. }
  1057. if (xfrm_state_del(xfrm_sock, (*seq)++, gen_spi(src), dst, src, proto)) {
  1058. printk("Failed to remove xfrm state");
  1059. return -1;
  1060. }
  1061. return 0;
  1062. }
  1063. static int xfrm_state_allocspi(int xfrm_sock, uint32_t *seq,
  1064. uint32_t spi, uint8_t proto)
  1065. {
  1066. struct {
  1067. struct nlmsghdr nh;
  1068. struct xfrm_userspi_info spi;
  1069. } req;
  1070. struct {
  1071. struct nlmsghdr nh;
  1072. union {
  1073. struct xfrm_usersa_info info;
  1074. int error;
  1075. };
  1076. } answer;
  1077. memset(&req, 0, sizeof(req));
  1078. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.spi));
  1079. req.nh.nlmsg_type = XFRM_MSG_ALLOCSPI;
  1080. req.nh.nlmsg_flags = NLM_F_REQUEST;
  1081. req.nh.nlmsg_seq = (*seq)++;
  1082. req.spi.info.family = AF_INET;
  1083. req.spi.min = spi;
  1084. req.spi.max = spi;
  1085. req.spi.info.id.proto = proto;
  1086. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1087. pr_err("send()");
  1088. return KSFT_FAIL;
  1089. }
  1090. if (recv(xfrm_sock, &answer, sizeof(answer), 0) < 0) {
  1091. pr_err("recv()");
  1092. return KSFT_FAIL;
  1093. } else if (answer.nh.nlmsg_type == XFRM_MSG_NEWSA) {
  1094. uint32_t new_spi = htonl(answer.info.id.spi);
  1095. if (new_spi != spi) {
  1096. printk("allocated spi is different from requested: %#x != %#x",
  1097. new_spi, spi);
  1098. return KSFT_FAIL;
  1099. }
  1100. return KSFT_PASS;
  1101. } else if (answer.nh.nlmsg_type != NLMSG_ERROR) {
  1102. printk("expected NLMSG_ERROR, got %d", (int)answer.nh.nlmsg_type);
  1103. return KSFT_FAIL;
  1104. }
  1105. printk("NLMSG_ERROR: %d: %s", answer.error, strerror(-answer.error));
  1106. return (answer.error) ? KSFT_FAIL : KSFT_PASS;
  1107. }
  1108. static int netlink_sock_bind(int *sock, uint32_t *seq, int proto, uint32_t groups)
  1109. {
  1110. struct sockaddr_nl snl = {};
  1111. socklen_t addr_len;
  1112. int ret = -1;
  1113. snl.nl_family = AF_NETLINK;
  1114. snl.nl_groups = groups;
  1115. if (netlink_sock(sock, seq, proto)) {
  1116. printk("Failed to open xfrm netlink socket");
  1117. return -1;
  1118. }
  1119. if (bind(*sock, (struct sockaddr *)&snl, sizeof(snl)) < 0) {
  1120. pr_err("bind()");
  1121. goto out_close;
  1122. }
  1123. addr_len = sizeof(snl);
  1124. if (getsockname(*sock, (struct sockaddr *)&snl, &addr_len) < 0) {
  1125. pr_err("getsockname()");
  1126. goto out_close;
  1127. }
  1128. if (addr_len != sizeof(snl)) {
  1129. printk("Wrong address length %d", addr_len);
  1130. goto out_close;
  1131. }
  1132. if (snl.nl_family != AF_NETLINK) {
  1133. printk("Wrong address family %d", snl.nl_family);
  1134. goto out_close;
  1135. }
  1136. return 0;
  1137. out_close:
  1138. close(*sock);
  1139. return ret;
  1140. }
  1141. static int xfrm_monitor_acquire(int xfrm_sock, uint32_t *seq, unsigned int nr)
  1142. {
  1143. struct {
  1144. struct nlmsghdr nh;
  1145. union {
  1146. struct xfrm_user_acquire acq;
  1147. int error;
  1148. };
  1149. char attrbuf[MAX_PAYLOAD];
  1150. } req;
  1151. struct xfrm_user_tmpl xfrm_tmpl = {};
  1152. int xfrm_listen = -1, ret = KSFT_FAIL;
  1153. uint32_t seq_listen;
  1154. if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_ACQUIRE))
  1155. return KSFT_FAIL;
  1156. memset(&req, 0, sizeof(req));
  1157. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.acq));
  1158. req.nh.nlmsg_type = XFRM_MSG_ACQUIRE;
  1159. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  1160. req.nh.nlmsg_seq = (*seq)++;
  1161. req.acq.policy.sel.family = AF_INET;
  1162. req.acq.aalgos = 0xfeed;
  1163. req.acq.ealgos = 0xbaad;
  1164. req.acq.calgos = 0xbabe;
  1165. xfrm_tmpl.family = AF_INET;
  1166. xfrm_tmpl.id.proto = IPPROTO_ESP;
  1167. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_TMPL, &xfrm_tmpl, sizeof(xfrm_tmpl)))
  1168. goto out_close;
  1169. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1170. pr_err("send()");
  1171. goto out_close;
  1172. }
  1173. if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
  1174. pr_err("recv()");
  1175. goto out_close;
  1176. } else if (req.nh.nlmsg_type != NLMSG_ERROR) {
  1177. printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
  1178. goto out_close;
  1179. }
  1180. if (req.error) {
  1181. printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
  1182. ret = req.error;
  1183. goto out_close;
  1184. }
  1185. if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
  1186. pr_err("recv()");
  1187. goto out_close;
  1188. }
  1189. if (req.acq.aalgos != 0xfeed || req.acq.ealgos != 0xbaad
  1190. || req.acq.calgos != 0xbabe) {
  1191. printk("xfrm_user_acquire has changed %x %x %x",
  1192. req.acq.aalgos, req.acq.ealgos, req.acq.calgos);
  1193. goto out_close;
  1194. }
  1195. ret = KSFT_PASS;
  1196. out_close:
  1197. close(xfrm_listen);
  1198. return ret;
  1199. }
  1200. static int xfrm_expire_state(int xfrm_sock, uint32_t *seq,
  1201. unsigned int nr, struct xfrm_desc *desc)
  1202. {
  1203. struct {
  1204. struct nlmsghdr nh;
  1205. union {
  1206. struct xfrm_user_expire expire;
  1207. int error;
  1208. };
  1209. } req;
  1210. struct in_addr src, dst;
  1211. int xfrm_listen = -1, ret = KSFT_FAIL;
  1212. uint32_t seq_listen;
  1213. src = inet_makeaddr(INADDR_B, child_ip(nr));
  1214. dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
  1215. if (xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc)) {
  1216. printk("Failed to add xfrm state");
  1217. return KSFT_FAIL;
  1218. }
  1219. if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_EXPIRE))
  1220. return KSFT_FAIL;
  1221. memset(&req, 0, sizeof(req));
  1222. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.expire));
  1223. req.nh.nlmsg_type = XFRM_MSG_EXPIRE;
  1224. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  1225. req.nh.nlmsg_seq = (*seq)++;
  1226. memcpy(&req.expire.state.id.daddr, &dst, sizeof(dst));
  1227. req.expire.state.id.spi = gen_spi(src);
  1228. req.expire.state.id.proto = desc->proto;
  1229. req.expire.state.family = AF_INET;
  1230. req.expire.hard = 0xff;
  1231. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1232. pr_err("send()");
  1233. goto out_close;
  1234. }
  1235. if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
  1236. pr_err("recv()");
  1237. goto out_close;
  1238. } else if (req.nh.nlmsg_type != NLMSG_ERROR) {
  1239. printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
  1240. goto out_close;
  1241. }
  1242. if (req.error) {
  1243. printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
  1244. ret = req.error;
  1245. goto out_close;
  1246. }
  1247. if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
  1248. pr_err("recv()");
  1249. goto out_close;
  1250. }
  1251. if (req.expire.hard != 0x1) {
  1252. printk("expire.hard is not set: %x", req.expire.hard);
  1253. goto out_close;
  1254. }
  1255. ret = KSFT_PASS;
  1256. out_close:
  1257. close(xfrm_listen);
  1258. return ret;
  1259. }
  1260. static int xfrm_expire_policy(int xfrm_sock, uint32_t *seq,
  1261. unsigned int nr, struct xfrm_desc *desc)
  1262. {
  1263. struct {
  1264. struct nlmsghdr nh;
  1265. union {
  1266. struct xfrm_user_polexpire expire;
  1267. int error;
  1268. };
  1269. } req;
  1270. struct in_addr src, dst, tunsrc, tundst;
  1271. int xfrm_listen = -1, ret = KSFT_FAIL;
  1272. uint32_t seq_listen;
  1273. src = inet_makeaddr(INADDR_B, child_ip(nr));
  1274. dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
  1275. tunsrc = inet_makeaddr(INADDR_A, child_ip(nr));
  1276. tundst = inet_makeaddr(INADDR_A, grchild_ip(nr));
  1277. if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst,
  1278. XFRM_POLICY_OUT, tunsrc, tundst, desc->proto)) {
  1279. printk("Failed to add xfrm policy");
  1280. return KSFT_FAIL;
  1281. }
  1282. if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_EXPIRE))
  1283. return KSFT_FAIL;
  1284. memset(&req, 0, sizeof(req));
  1285. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.expire));
  1286. req.nh.nlmsg_type = XFRM_MSG_POLEXPIRE;
  1287. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  1288. req.nh.nlmsg_seq = (*seq)++;
  1289. /* Fill selector. */
  1290. memcpy(&req.expire.pol.sel.daddr, &dst, sizeof(tundst));
  1291. memcpy(&req.expire.pol.sel.saddr, &src, sizeof(tunsrc));
  1292. req.expire.pol.sel.family = AF_INET;
  1293. req.expire.pol.sel.prefixlen_d = PREFIX_LEN;
  1294. req.expire.pol.sel.prefixlen_s = PREFIX_LEN;
  1295. req.expire.pol.dir = XFRM_POLICY_OUT;
  1296. req.expire.hard = 0xff;
  1297. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1298. pr_err("send()");
  1299. goto out_close;
  1300. }
  1301. if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
  1302. pr_err("recv()");
  1303. goto out_close;
  1304. } else if (req.nh.nlmsg_type != NLMSG_ERROR) {
  1305. printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
  1306. goto out_close;
  1307. }
  1308. if (req.error) {
  1309. printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
  1310. ret = req.error;
  1311. goto out_close;
  1312. }
  1313. if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
  1314. pr_err("recv()");
  1315. goto out_close;
  1316. }
  1317. if (req.expire.hard != 0x1) {
  1318. printk("expire.hard is not set: %x", req.expire.hard);
  1319. goto out_close;
  1320. }
  1321. ret = KSFT_PASS;
  1322. out_close:
  1323. close(xfrm_listen);
  1324. return ret;
  1325. }
  1326. static int xfrm_spdinfo_set_thresh(int xfrm_sock, uint32_t *seq,
  1327. unsigned thresh4_l, unsigned thresh4_r,
  1328. unsigned thresh6_l, unsigned thresh6_r,
  1329. bool add_bad_attr)
  1330. {
  1331. struct {
  1332. struct nlmsghdr nh;
  1333. union {
  1334. uint32_t unused;
  1335. int error;
  1336. };
  1337. char attrbuf[MAX_PAYLOAD];
  1338. } req;
  1339. struct xfrmu_spdhthresh thresh;
  1340. memset(&req, 0, sizeof(req));
  1341. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.unused));
  1342. req.nh.nlmsg_type = XFRM_MSG_NEWSPDINFO;
  1343. req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  1344. req.nh.nlmsg_seq = (*seq)++;
  1345. thresh.lbits = thresh4_l;
  1346. thresh.rbits = thresh4_r;
  1347. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_SPD_IPV4_HTHRESH, &thresh, sizeof(thresh)))
  1348. return -1;
  1349. thresh.lbits = thresh6_l;
  1350. thresh.rbits = thresh6_r;
  1351. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_SPD_IPV6_HTHRESH, &thresh, sizeof(thresh)))
  1352. return -1;
  1353. if (add_bad_attr) {
  1354. BUILD_BUG_ON(XFRMA_IF_ID <= XFRMA_SPD_MAX + 1);
  1355. if (rtattr_pack(&req.nh, sizeof(req), XFRMA_IF_ID, NULL, 0)) {
  1356. pr_err("adding attribute failed: no space");
  1357. return -1;
  1358. }
  1359. }
  1360. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1361. pr_err("send()");
  1362. return -1;
  1363. }
  1364. if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
  1365. pr_err("recv()");
  1366. return -1;
  1367. } else if (req.nh.nlmsg_type != NLMSG_ERROR) {
  1368. printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
  1369. return -1;
  1370. }
  1371. if (req.error) {
  1372. printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
  1373. return -1;
  1374. }
  1375. return 0;
  1376. }
  1377. static int xfrm_spdinfo_attrs(int xfrm_sock, uint32_t *seq)
  1378. {
  1379. struct {
  1380. struct nlmsghdr nh;
  1381. union {
  1382. uint32_t unused;
  1383. int error;
  1384. };
  1385. char attrbuf[MAX_PAYLOAD];
  1386. } req;
  1387. if (xfrm_spdinfo_set_thresh(xfrm_sock, seq, 32, 31, 120, 16, false)) {
  1388. pr_err("Can't set SPD HTHRESH");
  1389. return KSFT_FAIL;
  1390. }
  1391. memset(&req, 0, sizeof(req));
  1392. req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.unused));
  1393. req.nh.nlmsg_type = XFRM_MSG_GETSPDINFO;
  1394. req.nh.nlmsg_flags = NLM_F_REQUEST;
  1395. req.nh.nlmsg_seq = (*seq)++;
  1396. if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
  1397. pr_err("send()");
  1398. return KSFT_FAIL;
  1399. }
  1400. if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
  1401. pr_err("recv()");
  1402. return KSFT_FAIL;
  1403. } else if (req.nh.nlmsg_type == XFRM_MSG_NEWSPDINFO) {
  1404. size_t len = NLMSG_PAYLOAD(&req.nh, sizeof(req.unused));
  1405. struct rtattr *attr = (void *)req.attrbuf;
  1406. int got_thresh = 0;
  1407. for (; RTA_OK(attr, len); attr = RTA_NEXT(attr, len)) {
  1408. if (attr->rta_type == XFRMA_SPD_IPV4_HTHRESH) {
  1409. struct xfrmu_spdhthresh *t = RTA_DATA(attr);
  1410. got_thresh++;
  1411. if (t->lbits != 32 || t->rbits != 31) {
  1412. pr_err("thresh differ: %u, %u",
  1413. t->lbits, t->rbits);
  1414. return KSFT_FAIL;
  1415. }
  1416. }
  1417. if (attr->rta_type == XFRMA_SPD_IPV6_HTHRESH) {
  1418. struct xfrmu_spdhthresh *t = RTA_DATA(attr);
  1419. got_thresh++;
  1420. if (t->lbits != 120 || t->rbits != 16) {
  1421. pr_err("thresh differ: %u, %u",
  1422. t->lbits, t->rbits);
  1423. return KSFT_FAIL;
  1424. }
  1425. }
  1426. }
  1427. if (got_thresh != 2) {
  1428. pr_err("only %d thresh returned by XFRM_MSG_GETSPDINFO", got_thresh);
  1429. return KSFT_FAIL;
  1430. }
  1431. } else if (req.nh.nlmsg_type != NLMSG_ERROR) {
  1432. printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
  1433. return KSFT_FAIL;
  1434. } else {
  1435. printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
  1436. return -1;
  1437. }
  1438. /* Restore the default */
  1439. if (xfrm_spdinfo_set_thresh(xfrm_sock, seq, 32, 32, 128, 128, false)) {
  1440. pr_err("Can't restore SPD HTHRESH");
  1441. return KSFT_FAIL;
  1442. }
  1443. /*
  1444. * At this moment xfrm uses nlmsg_parse_deprecated(), which
  1445. * implies NL_VALIDATE_LIBERAL - ignoring attributes with
  1446. * (type > maxtype). nla_parse_depricated_strict() would enforce
  1447. * it. Or even stricter nla_parse().
  1448. * Right now it's not expected to fail, but to be ignored.
  1449. */
  1450. if (xfrm_spdinfo_set_thresh(xfrm_sock, seq, 32, 32, 128, 128, true))
  1451. return KSFT_PASS;
  1452. return KSFT_PASS;
  1453. }
  1454. static int child_serv(int xfrm_sock, uint32_t *seq,
  1455. unsigned int nr, int cmd_fd, void *buf, struct xfrm_desc *desc)
  1456. {
  1457. struct in_addr src, dst, tunsrc, tundst;
  1458. struct test_desc msg;
  1459. int ret = KSFT_FAIL;
  1460. src = inet_makeaddr(INADDR_B, child_ip(nr));
  1461. dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
  1462. tunsrc = inet_makeaddr(INADDR_A, child_ip(nr));
  1463. tundst = inet_makeaddr(INADDR_A, grchild_ip(nr));
  1464. /* UDP pinging without xfrm */
  1465. if (do_ping(cmd_fd, buf, page_size, src, true, 0, 0, udp_ping_send)) {
  1466. printk("ping failed before setting xfrm");
  1467. return KSFT_FAIL;
  1468. }
  1469. memset(&msg, 0, sizeof(msg));
  1470. msg.type = MSG_XFRM_PREPARE;
  1471. memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
  1472. write_msg(cmd_fd, &msg, 1);
  1473. if (xfrm_prepare(xfrm_sock, seq, src, dst, tunsrc, tundst, desc->proto)) {
  1474. printk("failed to prepare xfrm");
  1475. goto cleanup;
  1476. }
  1477. memset(&msg, 0, sizeof(msg));
  1478. msg.type = MSG_XFRM_ADD;
  1479. memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
  1480. write_msg(cmd_fd, &msg, 1);
  1481. if (xfrm_set(xfrm_sock, seq, src, dst, tunsrc, tundst, desc)) {
  1482. printk("failed to set xfrm");
  1483. goto delete;
  1484. }
  1485. /* UDP pinging with xfrm tunnel */
  1486. if (do_ping(cmd_fd, buf, page_size, tunsrc,
  1487. true, 0, 0, udp_ping_send)) {
  1488. printk("ping failed for xfrm");
  1489. goto delete;
  1490. }
  1491. ret = KSFT_PASS;
  1492. delete:
  1493. /* xfrm delete */
  1494. memset(&msg, 0, sizeof(msg));
  1495. msg.type = MSG_XFRM_DEL;
  1496. memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
  1497. write_msg(cmd_fd, &msg, 1);
  1498. if (xfrm_delete(xfrm_sock, seq, src, dst, tunsrc, tundst, desc->proto)) {
  1499. printk("failed ping to remove xfrm");
  1500. ret = KSFT_FAIL;
  1501. }
  1502. cleanup:
  1503. memset(&msg, 0, sizeof(msg));
  1504. msg.type = MSG_XFRM_CLEANUP;
  1505. memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
  1506. write_msg(cmd_fd, &msg, 1);
  1507. if (xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst)) {
  1508. printk("failed ping to cleanup xfrm");
  1509. ret = KSFT_FAIL;
  1510. }
  1511. return ret;
  1512. }
  1513. static int child_f(unsigned int nr, int test_desc_fd, int cmd_fd, void *buf)
  1514. {
  1515. struct xfrm_desc desc;
  1516. struct test_desc msg;
  1517. int xfrm_sock = -1;
  1518. uint32_t seq;
  1519. if (switch_ns(nsfd_childa))
  1520. exit(KSFT_FAIL);
  1521. if (netlink_sock(&xfrm_sock, &seq, NETLINK_XFRM)) {
  1522. printk("Failed to open xfrm netlink socket");
  1523. exit(KSFT_FAIL);
  1524. }
  1525. /* Check that seq sock is ready, just for sure. */
  1526. memset(&msg, 0, sizeof(msg));
  1527. msg.type = MSG_ACK;
  1528. write_msg(cmd_fd, &msg, 1);
  1529. read_msg(cmd_fd, &msg, 1);
  1530. if (msg.type != MSG_ACK) {
  1531. printk("Ack failed");
  1532. exit(KSFT_FAIL);
  1533. }
  1534. for (;;) {
  1535. ssize_t received = read(test_desc_fd, &desc, sizeof(desc));
  1536. int ret;
  1537. if (received == 0) /* EOF */
  1538. break;
  1539. if (received != sizeof(desc)) {
  1540. pr_err("read() returned %zd", received);
  1541. exit(KSFT_FAIL);
  1542. }
  1543. switch (desc.type) {
  1544. case CREATE_TUNNEL:
  1545. ret = child_serv(xfrm_sock, &seq, nr,
  1546. cmd_fd, buf, &desc);
  1547. break;
  1548. case ALLOCATE_SPI:
  1549. ret = xfrm_state_allocspi(xfrm_sock, &seq,
  1550. -1, desc.proto);
  1551. break;
  1552. case MONITOR_ACQUIRE:
  1553. ret = xfrm_monitor_acquire(xfrm_sock, &seq, nr);
  1554. break;
  1555. case EXPIRE_STATE:
  1556. ret = xfrm_expire_state(xfrm_sock, &seq, nr, &desc);
  1557. break;
  1558. case EXPIRE_POLICY:
  1559. ret = xfrm_expire_policy(xfrm_sock, &seq, nr, &desc);
  1560. break;
  1561. case SPDINFO_ATTRS:
  1562. ret = xfrm_spdinfo_attrs(xfrm_sock, &seq);
  1563. break;
  1564. default:
  1565. printk("Unknown desc type %d", desc.type);
  1566. exit(KSFT_FAIL);
  1567. }
  1568. write_test_result(ret, &desc);
  1569. }
  1570. close(xfrm_sock);
  1571. msg.type = MSG_EXIT;
  1572. write_msg(cmd_fd, &msg, 1);
  1573. exit(KSFT_PASS);
  1574. }
  1575. static void grand_child_serv(unsigned int nr, int cmd_fd, void *buf,
  1576. struct test_desc *msg, int xfrm_sock, uint32_t *seq)
  1577. {
  1578. struct in_addr src, dst, tunsrc, tundst;
  1579. bool tun_reply;
  1580. struct xfrm_desc *desc = &msg->body.xfrm_desc;
  1581. src = inet_makeaddr(INADDR_B, grchild_ip(nr));
  1582. dst = inet_makeaddr(INADDR_B, child_ip(nr));
  1583. tunsrc = inet_makeaddr(INADDR_A, grchild_ip(nr));
  1584. tundst = inet_makeaddr(INADDR_A, child_ip(nr));
  1585. switch (msg->type) {
  1586. case MSG_EXIT:
  1587. exit(KSFT_PASS);
  1588. case MSG_ACK:
  1589. write_msg(cmd_fd, msg, 1);
  1590. break;
  1591. case MSG_PING:
  1592. tun_reply = memcmp(&dst, &msg->body.ping.reply_ip, sizeof(in_addr_t));
  1593. /* UDP pinging without xfrm */
  1594. if (do_ping(cmd_fd, buf, page_size, tun_reply ? tunsrc : src,
  1595. false, msg->body.ping.port,
  1596. msg->body.ping.reply_ip, udp_ping_reply)) {
  1597. printk("ping failed before setting xfrm");
  1598. }
  1599. break;
  1600. case MSG_XFRM_PREPARE:
  1601. if (xfrm_prepare(xfrm_sock, seq, src, dst, tunsrc, tundst,
  1602. desc->proto)) {
  1603. xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
  1604. printk("failed to prepare xfrm");
  1605. }
  1606. break;
  1607. case MSG_XFRM_ADD:
  1608. if (xfrm_set(xfrm_sock, seq, src, dst, tunsrc, tundst, desc)) {
  1609. xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
  1610. printk("failed to set xfrm");
  1611. }
  1612. break;
  1613. case MSG_XFRM_DEL:
  1614. if (xfrm_delete(xfrm_sock, seq, src, dst, tunsrc, tundst,
  1615. desc->proto)) {
  1616. xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
  1617. printk("failed to remove xfrm");
  1618. }
  1619. break;
  1620. case MSG_XFRM_CLEANUP:
  1621. if (xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst)) {
  1622. printk("failed to cleanup xfrm");
  1623. }
  1624. break;
  1625. default:
  1626. printk("got unknown msg type %d", msg->type);
  1627. }
  1628. }
  1629. static int grand_child_f(unsigned int nr, int cmd_fd, void *buf)
  1630. {
  1631. struct test_desc msg;
  1632. int xfrm_sock = -1;
  1633. uint32_t seq;
  1634. if (switch_ns(nsfd_childb))
  1635. exit(KSFT_FAIL);
  1636. if (netlink_sock(&xfrm_sock, &seq, NETLINK_XFRM)) {
  1637. printk("Failed to open xfrm netlink socket");
  1638. exit(KSFT_FAIL);
  1639. }
  1640. do {
  1641. read_msg(cmd_fd, &msg, 1);
  1642. grand_child_serv(nr, cmd_fd, buf, &msg, xfrm_sock, &seq);
  1643. } while (1);
  1644. close(xfrm_sock);
  1645. exit(KSFT_FAIL);
  1646. }
  1647. static int start_child(unsigned int nr, char *veth, int test_desc_fd[2])
  1648. {
  1649. int cmd_sock[2];
  1650. void *data_map;
  1651. pid_t child;
  1652. if (init_child(nsfd_childa, veth, child_ip(nr), grchild_ip(nr)))
  1653. return -1;
  1654. if (init_child(nsfd_childb, veth, grchild_ip(nr), child_ip(nr)))
  1655. return -1;
  1656. child = fork();
  1657. if (child < 0) {
  1658. pr_err("fork()");
  1659. return -1;
  1660. } else if (child) {
  1661. /* in parent - selftest */
  1662. return switch_ns(nsfd_parent);
  1663. }
  1664. if (close(test_desc_fd[1])) {
  1665. pr_err("close()");
  1666. return -1;
  1667. }
  1668. /* child */
  1669. data_map = mmap(0, page_size, PROT_READ | PROT_WRITE,
  1670. MAP_SHARED | MAP_ANONYMOUS, -1, 0);
  1671. if (data_map == MAP_FAILED) {
  1672. pr_err("mmap()");
  1673. return -1;
  1674. }
  1675. randomize_buffer(data_map, page_size);
  1676. if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, cmd_sock)) {
  1677. pr_err("socketpair()");
  1678. return -1;
  1679. }
  1680. child = fork();
  1681. if (child < 0) {
  1682. pr_err("fork()");
  1683. return -1;
  1684. } else if (child) {
  1685. if (close(cmd_sock[0])) {
  1686. pr_err("close()");
  1687. return -1;
  1688. }
  1689. return child_f(nr, test_desc_fd[0], cmd_sock[1], data_map);
  1690. }
  1691. if (close(cmd_sock[1])) {
  1692. pr_err("close()");
  1693. return -1;
  1694. }
  1695. return grand_child_f(nr, cmd_sock[0], data_map);
  1696. }
  1697. static void exit_usage(char **argv)
  1698. {
  1699. printk("Usage: %s [nr_process]", argv[0]);
  1700. exit(KSFT_FAIL);
  1701. }
  1702. static int __write_desc(int test_desc_fd, struct xfrm_desc *desc)
  1703. {
  1704. ssize_t ret;
  1705. ret = write(test_desc_fd, desc, sizeof(*desc));
  1706. if (ret == sizeof(*desc))
  1707. return 0;
  1708. pr_err("Writing test's desc failed %ld", ret);
  1709. return -1;
  1710. }
  1711. static int write_desc(int proto, int test_desc_fd,
  1712. char *a, char *e, char *c, char *ae)
  1713. {
  1714. struct xfrm_desc desc = {};
  1715. desc.type = CREATE_TUNNEL;
  1716. desc.proto = proto;
  1717. if (a)
  1718. strncpy(desc.a_algo, a, ALGO_LEN - 1);
  1719. if (e)
  1720. strncpy(desc.e_algo, e, ALGO_LEN - 1);
  1721. if (c)
  1722. strncpy(desc.c_algo, c, ALGO_LEN - 1);
  1723. if (ae)
  1724. strncpy(desc.ae_algo, ae, ALGO_LEN - 1);
  1725. return __write_desc(test_desc_fd, &desc);
  1726. }
  1727. int proto_list[] = { IPPROTO_AH, IPPROTO_COMP, IPPROTO_ESP };
  1728. char *ah_list[] = {
  1729. "digest_null", "hmac(md5)", "hmac(sha1)", "hmac(sha256)",
  1730. "hmac(sha384)", "hmac(sha512)", "hmac(rmd160)",
  1731. "xcbc(aes)", "cmac(aes)"
  1732. };
  1733. char *comp_list[] = {
  1734. "deflate",
  1735. #if 0
  1736. /* No compression backend realization */
  1737. "lzs", "lzjh"
  1738. #endif
  1739. };
  1740. char *e_list[] = {
  1741. "ecb(cipher_null)", "cbc(des)", "cbc(des3_ede)", "cbc(cast5)",
  1742. "cbc(blowfish)", "cbc(aes)", "cbc(serpent)", "cbc(camellia)",
  1743. "cbc(twofish)", "rfc3686(ctr(aes))"
  1744. };
  1745. char *ae_list[] = {
  1746. #if 0
  1747. /* not implemented */
  1748. "rfc4106(gcm(aes))", "rfc4309(ccm(aes))", "rfc4543(gcm(aes))",
  1749. "rfc7539esp(chacha20,poly1305)"
  1750. #endif
  1751. };
  1752. const unsigned int proto_plan = ARRAY_SIZE(ah_list) + ARRAY_SIZE(comp_list) \
  1753. + (ARRAY_SIZE(ah_list) * ARRAY_SIZE(e_list)) \
  1754. + ARRAY_SIZE(ae_list);
  1755. static int write_proto_plan(int fd, int proto)
  1756. {
  1757. unsigned int i;
  1758. switch (proto) {
  1759. case IPPROTO_AH:
  1760. for (i = 0; i < ARRAY_SIZE(ah_list); i++) {
  1761. if (write_desc(proto, fd, ah_list[i], 0, 0, 0))
  1762. return -1;
  1763. }
  1764. break;
  1765. case IPPROTO_COMP:
  1766. for (i = 0; i < ARRAY_SIZE(comp_list); i++) {
  1767. if (write_desc(proto, fd, 0, 0, comp_list[i], 0))
  1768. return -1;
  1769. }
  1770. break;
  1771. case IPPROTO_ESP:
  1772. for (i = 0; i < ARRAY_SIZE(ah_list); i++) {
  1773. int j;
  1774. for (j = 0; j < ARRAY_SIZE(e_list); j++) {
  1775. if (write_desc(proto, fd, ah_list[i],
  1776. e_list[j], 0, 0))
  1777. return -1;
  1778. }
  1779. }
  1780. for (i = 0; i < ARRAY_SIZE(ae_list); i++) {
  1781. if (write_desc(proto, fd, 0, 0, 0, ae_list[i]))
  1782. return -1;
  1783. }
  1784. break;
  1785. default:
  1786. printk("BUG: Specified unknown proto %d", proto);
  1787. return -1;
  1788. }
  1789. return 0;
  1790. }
  1791. /*
  1792. * Some structures in xfrm uapi header differ in size between
  1793. * 64-bit and 32-bit ABI:
  1794. *
  1795. * 32-bit UABI | 64-bit UABI
  1796. * -------------------------------------|-------------------------------------
  1797. * sizeof(xfrm_usersa_info) = 220 | sizeof(xfrm_usersa_info) = 224
  1798. * sizeof(xfrm_userpolicy_info) = 164 | sizeof(xfrm_userpolicy_info) = 168
  1799. * sizeof(xfrm_userspi_info) = 228 | sizeof(xfrm_userspi_info) = 232
  1800. * sizeof(xfrm_user_acquire) = 276 | sizeof(xfrm_user_acquire) = 280
  1801. * sizeof(xfrm_user_expire) = 224 | sizeof(xfrm_user_expire) = 232
  1802. * sizeof(xfrm_user_polexpire) = 168 | sizeof(xfrm_user_polexpire) = 176
  1803. *
  1804. * Check the affected by the UABI difference structures.
  1805. * Also, check translation for xfrm_set_spdinfo: it has it's own attributes
  1806. * which needs to be correctly copied, but not translated.
  1807. */
  1808. const unsigned int compat_plan = 5;
  1809. static int write_compat_struct_tests(int test_desc_fd)
  1810. {
  1811. struct xfrm_desc desc = {};
  1812. desc.type = ALLOCATE_SPI;
  1813. desc.proto = IPPROTO_AH;
  1814. strncpy(desc.a_algo, ah_list[0], ALGO_LEN - 1);
  1815. if (__write_desc(test_desc_fd, &desc))
  1816. return -1;
  1817. desc.type = MONITOR_ACQUIRE;
  1818. if (__write_desc(test_desc_fd, &desc))
  1819. return -1;
  1820. desc.type = EXPIRE_STATE;
  1821. if (__write_desc(test_desc_fd, &desc))
  1822. return -1;
  1823. desc.type = EXPIRE_POLICY;
  1824. if (__write_desc(test_desc_fd, &desc))
  1825. return -1;
  1826. desc.type = SPDINFO_ATTRS;
  1827. if (__write_desc(test_desc_fd, &desc))
  1828. return -1;
  1829. return 0;
  1830. }
  1831. static int write_test_plan(int test_desc_fd)
  1832. {
  1833. unsigned int i;
  1834. pid_t child;
  1835. child = fork();
  1836. if (child < 0) {
  1837. pr_err("fork()");
  1838. return -1;
  1839. }
  1840. if (child) {
  1841. if (close(test_desc_fd))
  1842. printk("close(): %m");
  1843. return 0;
  1844. }
  1845. if (write_compat_struct_tests(test_desc_fd))
  1846. exit(KSFT_FAIL);
  1847. for (i = 0; i < ARRAY_SIZE(proto_list); i++) {
  1848. if (write_proto_plan(test_desc_fd, proto_list[i]))
  1849. exit(KSFT_FAIL);
  1850. }
  1851. exit(KSFT_PASS);
  1852. }
  1853. static int children_cleanup(void)
  1854. {
  1855. unsigned ret = KSFT_PASS;
  1856. while (1) {
  1857. int status;
  1858. pid_t p = wait(&status);
  1859. if ((p < 0) && errno == ECHILD)
  1860. break;
  1861. if (p < 0) {
  1862. pr_err("wait()");
  1863. return KSFT_FAIL;
  1864. }
  1865. if (!WIFEXITED(status)) {
  1866. ret = KSFT_FAIL;
  1867. continue;
  1868. }
  1869. if (WEXITSTATUS(status) == KSFT_FAIL)
  1870. ret = KSFT_FAIL;
  1871. }
  1872. return ret;
  1873. }
  1874. typedef void (*print_res)(const char *, ...);
  1875. static int check_results(void)
  1876. {
  1877. struct test_result tr = {};
  1878. struct xfrm_desc *d = &tr.desc;
  1879. int ret = KSFT_PASS;
  1880. while (1) {
  1881. ssize_t received = read(results_fd[0], &tr, sizeof(tr));
  1882. print_res result;
  1883. if (received == 0) /* EOF */
  1884. break;
  1885. if (received != sizeof(tr)) {
  1886. pr_err("read() returned %zd", received);
  1887. return KSFT_FAIL;
  1888. }
  1889. switch (tr.res) {
  1890. case KSFT_PASS:
  1891. result = ksft_test_result_pass;
  1892. break;
  1893. case KSFT_FAIL:
  1894. default:
  1895. result = ksft_test_result_fail;
  1896. ret = KSFT_FAIL;
  1897. }
  1898. result(" %s: [%u, '%s', '%s', '%s', '%s', %u]\n",
  1899. desc_name[d->type], (unsigned int)d->proto, d->a_algo,
  1900. d->e_algo, d->c_algo, d->ae_algo, d->icv_len);
  1901. }
  1902. return ret;
  1903. }
  1904. int main(int argc, char **argv)
  1905. {
  1906. long nr_process = 1;
  1907. int route_sock = -1, ret = KSFT_SKIP;
  1908. int test_desc_fd[2];
  1909. uint32_t route_seq;
  1910. unsigned int i;
  1911. if (argc > 2)
  1912. exit_usage(argv);
  1913. if (argc > 1) {
  1914. char *endptr;
  1915. errno = 0;
  1916. nr_process = strtol(argv[1], &endptr, 10);
  1917. if ((errno == ERANGE && (nr_process == LONG_MAX || nr_process == LONG_MIN))
  1918. || (errno != 0 && nr_process == 0)
  1919. || (endptr == argv[1]) || (*endptr != '\0')) {
  1920. printk("Failed to parse [nr_process]");
  1921. exit_usage(argv);
  1922. }
  1923. if (nr_process > MAX_PROCESSES || nr_process < 1) {
  1924. printk("nr_process should be between [1; %u]",
  1925. MAX_PROCESSES);
  1926. exit_usage(argv);
  1927. }
  1928. }
  1929. srand(time(NULL));
  1930. page_size = sysconf(_SC_PAGESIZE);
  1931. if (page_size < 1)
  1932. ksft_exit_skip("sysconf(): %m\n");
  1933. if (pipe2(test_desc_fd, O_DIRECT) < 0)
  1934. ksft_exit_skip("pipe(): %m\n");
  1935. if (pipe2(results_fd, O_DIRECT) < 0)
  1936. ksft_exit_skip("pipe(): %m\n");
  1937. if (init_namespaces())
  1938. ksft_exit_skip("Failed to create namespaces\n");
  1939. if (netlink_sock(&route_sock, &route_seq, NETLINK_ROUTE))
  1940. ksft_exit_skip("Failed to open netlink route socket\n");
  1941. for (i = 0; i < nr_process; i++) {
  1942. char veth[VETH_LEN];
  1943. snprintf(veth, VETH_LEN, VETH_FMT, i);
  1944. if (veth_add(route_sock, route_seq++, veth, nsfd_childa, veth, nsfd_childb)) {
  1945. close(route_sock);
  1946. ksft_exit_fail_msg("Failed to create veth device");
  1947. }
  1948. if (start_child(i, veth, test_desc_fd)) {
  1949. close(route_sock);
  1950. ksft_exit_fail_msg("Child %u failed to start", i);
  1951. }
  1952. }
  1953. if (close(route_sock) || close(test_desc_fd[0]) || close(results_fd[1]))
  1954. ksft_exit_fail_msg("close(): %m");
  1955. ksft_set_plan(proto_plan + compat_plan);
  1956. if (write_test_plan(test_desc_fd[1]))
  1957. ksft_exit_fail_msg("Failed to write test plan to pipe");
  1958. ret = check_results();
  1959. if (children_cleanup() == KSFT_FAIL)
  1960. exit(KSFT_FAIL);
  1961. exit(ret);
  1962. }