generateload.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296
  1. #define _POSIX_C_SOURCE 200112L
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #define __USE_XOPEN_EXTENDED
  6. #define __USE_MISC
  7. #include <arpa/inet.h>
  8. #include <time.h>
  9. #include <errno.h>
  10. #include <fcntl.h>
  11. #include <linux/if.h>
  12. #include <netdb.h>
  13. #include <netinet/in.h>
  14. #include <stdarg.h>
  15. #include <string.h>
  16. #include <sys/socket.h>
  17. #include <linux/ip.h>
  18. #include <linux/udp.h>
  19. #include <unistd.h>
  20. #include <signal.h>
  21. #include <getopt.h>
  22. #include <sys/mman.h>
  23. #define PPPLCP 0xc021
  24. #define PPPPAP 0xc023
  25. #define PPPCHAP 0xc223
  26. #define PPPIPCP 0x8021
  27. #define PPPIP 0x0021
  28. #define PPPCCP 0x80fd
  29. #define CONFREQ 1
  30. #define CONFACK 2
  31. #define CONFNAK 3
  32. #define CONFREJ 4
  33. #define TERMREQ 5
  34. #define TERMACK 6
  35. #define CODEREJ 7
  36. #define PROTREJ 8
  37. #define ECHOREQ 9
  38. #define ECHOREP 10
  39. #define DISCREQ 11
  40. #define PACKET_LENGTH 1000
  41. #define TARGET_PPS 5000
  42. #define TARGET "211.29.131.33"
  43. #define GWADDR "211.29.131.30"
  44. #define NUM_SESSIONS 1
  45. #define MAX_PACKETS 0
  46. #define AVG_SIZE 5
  47. typedef unsigned short u16;
  48. typedef unsigned int u32;
  49. typedef unsigned char u8;
  50. char *lcp_codes[] = {
  51. "reserved",
  52. "CONFREQ",
  53. "CONFACK",
  54. "CONFNAK",
  55. "CONFREJ",
  56. "TERMREQ",
  57. "TERMACK",
  58. "CODEREJ",
  59. "PROTREJ",
  60. "ECHOREQ",
  61. "ECHOREP",
  62. "DISCREQ",
  63. };
  64. char *mtypes[] = {
  65. "reserved",
  66. "SCCRQ",
  67. "SCCRP",
  68. "SCCCN",
  69. "StopCCN", // 4
  70. "reserved",
  71. "HELLO",
  72. "OCRQ",
  73. "OCRP",
  74. "OCCN",
  75. "ICRQ", // 10
  76. "ICRP",
  77. "ICCN",
  78. "reserved",
  79. "CDN",
  80. "WEN", // 15
  81. "SLI",
  82. };
  83. char *attributes[] = {
  84. "Message Type", // 0
  85. "Result Code", // 1
  86. "Protocol Version", // 2
  87. "Framing Capabilities", // 3
  88. "Bearer Capabilities", // 4
  89. "Tie Breaker", // 5
  90. "Firmware Revision", // 6
  91. "Host Name", // 7
  92. "Vendor Name", // 8
  93. "Assigned Tunnel ID", // 9
  94. "Receive Window Size", // 10
  95. "Challenge", // 11
  96. "Q.931 Cause Code", // 12
  97. "Challenge Response", // 13
  98. "Assigned Session ID", // 14
  99. "Call Serial Number", // 15
  100. "Minimum BPS", // 16
  101. "Maximum BPS", // 17
  102. "Bearer Type", // 18 (2 = Analog, 1 = Digital)
  103. "Framing Type", // 19 (2 = Async, 1 = Sync)
  104. "Reserved 20", // 20
  105. "Called Number", // 21
  106. "Calling Number", // 22
  107. "Sub Address", // 23
  108. "Tx Connect Speed", // 24
  109. "Physical Channel ID", // 25
  110. "Initial Received LCP CONFREQ", // 26
  111. "Last Sent LCP CONFREQ", // 27
  112. "Last Received LCP CONFREQ", // 28
  113. "Proxy Authen Type", // 29
  114. "Proxy Authen Name", // 30
  115. "Proxy Authen Challenge", // 31
  116. "Proxy Authen ID", // 32
  117. "Proxy Authen Response", // 33
  118. "Call Errors", // 34
  119. "ACCM", // 35
  120. "Random Vector", // 36
  121. "Private Group ID", // 37
  122. "Rx Connect Speed", // 38
  123. "Sequencing Required", // 39
  124. };
  125. char *result_codes[] = {
  126. "Reserved",
  127. "General request to clear control connection",
  128. "General error--Error Code indicates the problem",
  129. "Control channel already exists",
  130. "Requester is not authorized to establish a control channel",
  131. "The protocol version of the requester is not supported",
  132. "Requester is being shut down",
  133. "Finite State Machine error",
  134. };
  135. char *error_codes[] = {
  136. "No general error",
  137. "No control connection exists yet for this LAC-LNS pair",
  138. "Length is wrong",
  139. "One of the field values was out of range or reserved field was non-zero",
  140. "Insufficient resources to handle this operation now",
  141. "The Session ID is invalid in this context",
  142. "A generic vendor-specific error occurred in the LAC",
  143. "Try another LNS",
  144. "Session or tunnel was shutdown due to receipt of an unknown AVP with the M-bit set",
  145. };
  146. typedef struct
  147. {
  148. char buf[4096];
  149. int length;
  150. } controlt;
  151. typedef struct avp_s
  152. {
  153. int length;
  154. int type;
  155. struct avp_s *next;
  156. char value[1024];
  157. } avp;
  158. typedef struct
  159. {
  160. int length;
  161. u16 session;
  162. u16 tunnel;
  163. u16 ns;
  164. u16 nr;
  165. u16 mtype;
  166. char *buf;
  167. avp *first;
  168. avp *last;
  169. } control_message;
  170. typedef struct {
  171. long long send_count, recv_count;
  172. long long spkt, rpkt ;
  173. int dropped;
  174. long sbytes, rbytes ;
  175. int quitit;
  176. struct sessiont
  177. {
  178. short remote_session;
  179. char open;
  180. int ppp_state;
  181. unsigned char ppp_identifier;
  182. int addr;
  183. } sessions[65536];
  184. int active_sessions ;
  185. } sharedt;
  186. sharedt * ss;
  187. void controlsend(controlt * c, short t, short s);
  188. void controlnull(short t);
  189. controlt *controlnew(u16 mtype);
  190. void controls(controlt * c, u16 avp, char *val, u8 m);
  191. void control16(controlt * c, u16 avp, u16 val, u8 m);
  192. void control32(controlt * c, u16 avp, u32 val, u8 m);
  193. void controlfree(controlt *c);
  194. control_message *parsecontrol(char *buf, int length);
  195. void dump_control_message(control_message *c);
  196. u32 avp_get_32(control_message *c, int id);
  197. u16 avp_get_16(control_message *c, int id);
  198. char *avp_get_s(control_message *c, int id);
  199. void reader_thread(void);
  200. void skip_zlb();
  201. void cm_free(control_message *m);
  202. controlt *ppp_new(u16 session, int protocol);
  203. void ppp_free(controlt *packet);
  204. controlt *ppp_lcp(u16 s, unsigned char type, char identifier);
  205. controlt *ppp_ipcp(u16 s, unsigned char type, char identifier);
  206. void ppp_send(controlt *c);
  207. void ppp_add_16(controlt * c, u16 val);
  208. void ppp_add_32(controlt * c, u32 val);
  209. void ppp_add_s(controlt * c, char *val);
  210. void ppp_lcp_add_option(controlt *c, unsigned char option, unsigned char length, int data);
  211. void dump_ppp_packet(char *packet, int l);
  212. controlt *ppp_pap(u16 s, unsigned char type, char identifier, char *username, char *password);
  213. char *inet_toa(unsigned long addr);
  214. __u16 checksum(unsigned char *addr, int count);
  215. void sigalarm(int junk);
  216. void sigint(int signal);
  217. void clean_shutdown();
  218. void print_report();
  219. int ns = 0, nr = 0;
  220. int udpfd;
  221. int t = 0;
  222. struct sockaddr_in gatewayaddr;
  223. int numsessions = NUM_SESSIONS;
  224. int packet_length = PACKET_LENGTH;
  225. int target_pps = TARGET_PPS;
  226. char *target = TARGET;
  227. char *gwaddr = GWADDR;
  228. int max_packets = MAX_PACKETS;
  229. int ppsend;
  230. int do_init = 1;
  231. char **session_usernames;
  232. char *base_username = "dslloadtest";
  233. char *base_password = "testing";
  234. char *suffix = "@optusnet.com.au";
  235. int main(int argc, char *argv[])
  236. {
  237. int s;
  238. unsigned char *packet;
  239. ss = (sharedt*) mmap(NULL, sizeof(*ss), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
  240. // Process Arguments {{{
  241. while ((s = getopt(argc, argv, "?hs:g:l:p:m:t:nU:P:")) > 0)
  242. {
  243. switch (s)
  244. {
  245. case 's' :
  246. numsessions = atoi(optarg);
  247. if (numsessions <= 0)
  248. {
  249. printf("You must have at least 1 session\n");
  250. return -1;
  251. }
  252. break;
  253. case 'l' :
  254. packet_length = atoi(optarg);
  255. if (packet_length < 64)
  256. {
  257. printf("You must have at least 64 byte packets\n");
  258. return -1;
  259. }
  260. break;
  261. case 'n' :
  262. do_init = 0;
  263. break;
  264. case 'p' :
  265. target_pps = atoi(optarg);
  266. break;
  267. case 'm' :
  268. max_packets = atoi(optarg);
  269. if (max_packets < 50)
  270. {
  271. printf("You must send at least 50 packets.\n");
  272. return -1;
  273. }
  274. break;
  275. case 't' :
  276. target = strdup(optarg);
  277. break;
  278. case 'g' :
  279. gwaddr = strdup(optarg);
  280. break;
  281. case 'U' :
  282. base_username = strdup(optarg);
  283. break;
  284. case 'P' :
  285. base_password = strdup(optarg);
  286. break;
  287. case 'h' :
  288. case '?' :
  289. printf("Options:\n");
  290. printf("\t-s number of ss->sessions\n");
  291. printf("\t-l packet length\n");
  292. printf("\t-p target pps\n");
  293. printf("\t-m maximum number of packets\n");
  294. printf("\t-t target IP address\n");
  295. printf("\t-g gateway IP address\n");
  296. printf("\t-U username (or base if multiple)\n");
  297. printf("\t-P password\n");
  298. return(0);
  299. break;
  300. }
  301. }
  302. if (target_pps)
  303. ppsend = target_pps / 50;
  304. else
  305. ppsend = 0;
  306. packet = calloc(4096, 1);
  307. memset(ss->sessions, 0, sizeof(ss->sessions));
  308. if (do_init)
  309. printf("Creating %d ss->sessions to %s\n", numsessions, gwaddr);
  310. printf("Targeting %d packets per second\n", target_pps);
  311. if (max_packets) printf("Sending a maximum of %d packets\n", max_packets);
  312. printf("Sending packets to %s\n", target);
  313. printf("Sending %d byte packets\n", packet_length);
  314. session_usernames = (char **)calloc(sizeof(char *), numsessions);
  315. if (numsessions > 1)
  316. {
  317. int sul = strlen(base_username) + 10;
  318. int i;
  319. for (i = 0; i < numsessions; i++)
  320. {
  321. session_usernames[i] = (char *)calloc(sul, 1);
  322. snprintf(session_usernames[i], sul, "%s%d", base_username, i+1);
  323. }
  324. }
  325. else
  326. {
  327. session_usernames[0] = strdup(base_username);
  328. }
  329. // }}}
  330. // Create socket/*{{{*/
  331. {
  332. int on = 1;
  333. struct sockaddr_in addr;
  334. memset(&addr, 0, sizeof(addr));
  335. addr.sin_family = AF_INET;
  336. addr.sin_port = htons(38001);
  337. udpfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  338. if (udpfd <= 0)
  339. {
  340. perror("socket");
  341. return -1;
  342. }
  343. setsockopt(udpfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
  344. if (bind(udpfd, (void *) &addr, sizeof(addr)) < 0)
  345. {
  346. perror("bind");
  347. return -1;
  348. }
  349. printf("Bound to port %d\n", htons(addr.sin_port));
  350. }/*}}}*/
  351. memset(&gatewayaddr, 0, sizeof(gatewayaddr));
  352. gatewayaddr.sin_family = AF_INET;
  353. gatewayaddr.sin_port = htons(1701);
  354. inet_aton(gwaddr, &gatewayaddr.sin_addr);
  355. // Create tunnel/*{{{*/
  356. if (do_init) {
  357. controlt *c;
  358. control_message *r;
  359. c = controlnew(1); // SCCRQ
  360. controls(c, 7, "loadtest", 0); // Tunnel Hostname
  361. controls(c, 8, "OIE", 0); // Vendor Name
  362. control16(c, 9, 1, 0); // Assigned Tunnel ID
  363. control16(c, 2, 256, 0); // Version 1.0
  364. control16(c, 3, 1, 0); // Framing (Async)
  365. control16(c, 4, 1, 0); // Bearer (Digital)
  366. control16(c, 10, 20, 0); // Receive Window Size
  367. controlsend(c, 0, 0);
  368. controlfree(c);
  369. // Receive reply/*{{{*/
  370. {
  371. struct sockaddr_in addr;
  372. int l;
  373. socklen_t alen = sizeof(addr);
  374. l = recvfrom(udpfd, packet, 4096, 0, (void *) &addr, &alen);
  375. if (l < 0)
  376. {
  377. printf("Error creating tunnel: %s\n", strerror(errno));
  378. return -1;
  379. }
  380. printf("Received ");
  381. r = parsecontrol((char *) packet, l);
  382. if (!r->first)
  383. {
  384. printf("Invalid packet.. no first avp\n");
  385. return -1;
  386. }
  387. printf("Assigned tunnel: %d\n", t = avp_get_16(r, 9));
  388. cm_free(r);
  389. c = controlnew(3); // SCCCN
  390. controlsend(c, t, 0);
  391. controlfree(c);
  392. skip_zlb();
  393. }/*}}}*/
  394. }/*}}}*/
  395. // Create ss->sessions/*{{{*/
  396. if (do_init)
  397. {
  398. for (s = 1; s <= numsessions; s++)
  399. {
  400. controlt *c;
  401. c = controlnew(10); // ICRQ
  402. controls(c, 21, "12356", 0); // Called Number
  403. controls(c, 22, "000", 0); // Calling Number
  404. control16(c, 14, s, 0); // Assigned Session ID
  405. controlsend(c, t, 0);
  406. controlfree(c);
  407. usleep(15000); // 15 ms
  408. }
  409. }
  410. printf("All session create requests sent...\n");/*}}}*/
  411. if ( fork() == 0) {
  412. reader_thread();
  413. exit(0);
  414. }
  415. {
  416. char tmp[512];
  417. fprintf(stderr, "Press enter to begin sending traffic\n");
  418. fgets(tmp, 512, stdin);
  419. }
  420. fprintf(stderr, "Beginning sending traffic through %d ss->sessions\n", ss->active_sessions);
  421. printf(" TS: Total Packets Sent\n");
  422. printf(" TL: Total Packets Lost\n");
  423. printf(" PL: Packet Loss\n");
  424. printf(" SS: Send Speed\n");
  425. printf(" RS: Receive Speed\n");
  426. printf(" SP: Packets/Second Sent\n");
  427. printf(" RP: Packets/Second Received\n");
  428. printf(" NS: Number of active ss->sessions\n");
  429. signal(SIGALRM, sigalarm);
  430. signal(SIGINT, sigint);
  431. alarm(1);
  432. // Traffic generation loop {{{
  433. {
  434. struct sockaddr_in to;
  435. struct iphdr *iph;
  436. struct udphdr *udph;
  437. char *data;
  438. int len = 0;
  439. unsigned int seq = 0;
  440. controlt *c;
  441. // Get address
  442. memset(&to, 0, sizeof(struct sockaddr_in));
  443. to.sin_family = AF_INET;
  444. inet_aton(target, &to.sin_addr);
  445. c = ppp_new(1, PPPIP);
  446. iph = (struct iphdr *)(c->buf + c->length);
  447. udph = (struct udphdr *)(c->buf + c->length + sizeof(struct iphdr));
  448. data = (char *)(c->buf + c->length + sizeof(struct iphdr) + sizeof(struct udphdr));
  449. len = sizeof(struct iphdr) + sizeof(struct udphdr);
  450. c->length += len;
  451. //IP
  452. c->length += sizeof(struct iphdr);
  453. iph->tos = 0;
  454. iph->id = ntohs(1);
  455. iph->frag_off = ntohs(1 << 14);
  456. iph->ttl = 30;
  457. iph->check = 0;
  458. iph->version = 4;
  459. iph->ihl = 5;
  460. iph->protocol = 17;
  461. memcpy(&iph->daddr, &to.sin_addr, sizeof(iph->daddr));
  462. // UDP
  463. udph->source = ntohs(39999);
  464. udph->dest = ntohs(39000);
  465. udph->check = 0;
  466. // Data
  467. memset(data, 64, 1500);
  468. udph->len = ntohs(sizeof(struct udphdr) + packet_length);
  469. iph->tot_len = ntohs(len + packet_length);
  470. c->length += packet_length;
  471. while (!ss->quitit && ss->active_sessions)
  472. {
  473. int i;
  474. for (i = 1; i <= numsessions && !ss->quitit; i++)
  475. {
  476. // Skip ss->sessions that aren't active yet
  477. if (!ss->sessions[i].open || ss->sessions[i].ppp_state != 2)
  478. continue;
  479. *(u16 *)(c->buf + 4) = htons(ss->sessions[i].remote_session); // Session ID
  480. iph->saddr = ss->sessions[i].addr;
  481. iph->check = 0;
  482. iph->check = ntohs(checksum((unsigned char *)iph, sizeof(struct iphdr)));
  483. *((unsigned int *) data) = seq++;
  484. ppp_send(c);
  485. ss->send_count++;
  486. ss->spkt++;
  487. ss->sbytes += c->length;
  488. if (ppsend && ss->send_count % ppsend == 0)
  489. {
  490. struct timespec req;
  491. req.tv_sec = 0;
  492. req.tv_nsec = 5 * 1000 * 1000;
  493. nanosleep(&req, NULL);
  494. }
  495. if (max_packets && ss->send_count >= max_packets)
  496. ss->quitit++;
  497. }
  498. }
  499. c->length -= packet_length;
  500. }/*}}}*/
  501. clean_shutdown();
  502. print_report();
  503. close(udpfd);
  504. return 0;
  505. }
  506. void print_report()
  507. {
  508. float loss;
  509. loss = 100 - (((ss->recv_count * 1.0) / (ss->send_count * 1.0)) * 100.0);
  510. printf("\n");
  511. printf("Total Packets Sent: %llu\n", ss->send_count);
  512. printf("Total Packets Received: %llu\n", ss->recv_count);
  513. printf("Overall Packet Loss: %0.2f%%", loss);
  514. printf("\n");
  515. }
  516. void clean_shutdown()/*{{{*/
  517. {
  518. int i;
  519. for (i = 0; i < numsessions; i++)
  520. {
  521. // Close Session
  522. controlt *c;
  523. if (!ss->sessions[i].open) continue;
  524. c = controlnew(14); // CDN
  525. control16(c, 14, i, 0); // Assigned Session ID
  526. control16(c, 1, 1, 0); // Result Code
  527. controlsend(c, t, ss->sessions[i].remote_session);
  528. controlfree(c);
  529. }
  530. // Close Tunnel
  531. {
  532. controlt *c;
  533. c = controlnew(4); // StopCCN
  534. control16(c, 9, 1, 0); // Assigned Tunnel ID
  535. control16(c, 1, 1, 0); // Result Code
  536. controlsend(c, t, 0);
  537. controlfree(c);
  538. }
  539. }/*}}}*/
  540. void sigint(int unused __attribute__ ((unused)))
  541. {
  542. ss->quitit++;
  543. }
  544. void sigalarm(int unused __attribute__ ((unused)))
  545. {
  546. static unsigned long long last_rpkts[AVG_SIZE], last_spkts[AVG_SIZE];
  547. static int last = 0, avg_count = 0;
  548. unsigned int avg_s = 0, avg_r = 0;
  549. int i;
  550. float loss;
  551. last_rpkts[last] = ss->rpkt;
  552. last_spkts[last] = ss->spkt;
  553. last = (last + 1) % AVG_SIZE;
  554. if (avg_count < AVG_SIZE)
  555. avg_count++;
  556. for (i = 0; i < avg_count; i++)
  557. {
  558. avg_s += last_spkts[i];
  559. avg_r += last_rpkts[i];
  560. }
  561. avg_s /= avg_count;
  562. avg_r /= avg_count;
  563. loss = 100 - (((avg_r * 1.0) / (avg_s * 1.0)) * 100.0);
  564. fprintf(stderr, "TS:%llu TL:%lld DR:%4d PL:%-3.2f%% SS:%0.1fMbits/s RS:%0.1fMbits/s NS:%u SP:%u RP:%u\n",
  565. ss->send_count, ss->send_count-ss->recv_count, ss->dropped, loss,
  566. (ss->sbytes/1024.0/1024.0*8), (ss->rbytes/1024.0/1024.0*8),
  567. ss->active_sessions,
  568. avg_s, avg_r);
  569. ss->spkt = ss->rpkt = 0;
  570. ss->sbytes = ss->rbytes = 0;
  571. alarm(1);
  572. }
  573. __u16 checksum(unsigned char *addr, int count)
  574. {
  575. register long sum = 0;
  576. for (; count > 1; count -= 2)
  577. {
  578. sum += ntohs(*(u16 *)addr);
  579. addr += 2;
  580. }
  581. if (count > 0) sum += *(unsigned char *)addr;
  582. // take only 16 bits out of the 32 bit sum and add up the carries
  583. if (sum >> 16)
  584. sum = (sum & 0xFFFF) + (sum >> 16);
  585. // one's complement the result
  586. sum = ~sum;
  587. return ((u16) sum);
  588. }
  589. // Control Stuff {{{
  590. void control16(controlt * c, u16 avp, u16 val, u8 m)
  591. {
  592. u16 l = (m ? 0x8008 : 0x0008);
  593. *(u16 *) (c->buf + c->length + 0) = htons(l);
  594. *(u16 *) (c->buf + c->length + 2) = htons(0);
  595. *(u16 *) (c->buf + c->length + 4) = htons(avp);
  596. *(u16 *) (c->buf + c->length + 6) = htons(val);
  597. c->length += 8;
  598. }
  599. // add an AVP (32 bit)
  600. void control32(controlt * c, u16 avp, u32 val, u8 m)
  601. {
  602. u16 l = (m ? 0x800A : 0x000A);
  603. *(u16 *) (c->buf + c->length + 0) = htons(l);
  604. *(u16 *) (c->buf + c->length + 2) = htons(0);
  605. *(u16 *) (c->buf + c->length + 4) = htons(avp);
  606. *(u32 *) (c->buf + c->length + 6) = htonl(val);
  607. c->length += 10;
  608. }
  609. // add an AVP (32 bit)
  610. void controls(controlt * c, u16 avp, char *val, u8 m)
  611. {
  612. u16 l = ((m ? 0x8000 : 0) + strlen(val) + 6);
  613. *(u16 *) (c->buf + c->length + 0) = htons(l);
  614. *(u16 *) (c->buf + c->length + 2) = htons(0);
  615. *(u16 *) (c->buf + c->length + 4) = htons(avp);
  616. memcpy(c->buf + c->length + 6, val, strlen(val));
  617. c->length += 6 + strlen(val);
  618. }
  619. // new control connection
  620. controlt *controlnew(u16 mtype)
  621. {
  622. controlt *c;
  623. c = calloc(sizeof(controlt), 1);
  624. c->length = 12;
  625. control16(c, 0, mtype, 1);
  626. return c;
  627. }
  628. void controlnull(short t)
  629. {
  630. controlt *c;
  631. c = calloc(sizeof(controlt), 1);
  632. c->length = 12;
  633. controlsend(c, t, 0);
  634. controlfree(c);
  635. ns--;
  636. }
  637. // add a control message to a tunnel, and send if within window
  638. void controlsend(controlt * c, short t, short s)
  639. {
  640. *(u16 *) (c->buf + 0) = htons(0xC802); // flags/ver
  641. *(u16 *) (c->buf + 2) = htons(c->length); // length
  642. *(u16 *) (c->buf + 4) = htons(t); // tunnel
  643. *(u16 *) (c->buf + 6) = htons(s); // session
  644. *(u16 *) (c->buf + 8) = htons(ns++); // sequence
  645. *(u16 *) (c->buf + 10) = htons(nr); // sequence
  646. // printf("Sending ");
  647. // cm_free(parsecontrol(c->buf, c->length));
  648. sendto(udpfd, c->buf, c->length, 0, (struct sockaddr *)&gatewayaddr, sizeof(gatewayaddr));
  649. }
  650. void controlfree(controlt *c)
  651. {
  652. if (!c) return;
  653. free(c);
  654. }
  655. control_message *parsecontrol(char *buf, int length)
  656. {
  657. char *p = buf;
  658. control_message *c;
  659. c = calloc(sizeof(control_message), 1);
  660. c->buf = buf;
  661. c->length = length;
  662. c->tunnel = ntohs(*(u16 *)(buf + 4));
  663. c->session = ntohs(*(u16 *)(buf + 6));
  664. c->ns = ntohs(*(u16 *)(buf + 8));
  665. c->nr = nr = ntohs(*(u16 *)(buf + 10));
  666. p += 12;
  667. while ((p - buf) < length)
  668. {
  669. avp *a = calloc(sizeof(avp), 1);
  670. a->length = ntohs(*(short *)(p)) & 0x3FF;
  671. a->type = ntohs(*(short *)(p + 4));
  672. memcpy(a->value, p + 6, a->length - 6);
  673. if (a->type == 0) c->mtype = ntohs(*(short *)a->value);
  674. p += a->length;
  675. if (c->last)
  676. c->last->next = a;
  677. else
  678. c->first = a;
  679. c->last = a;
  680. }
  681. if (c->first)
  682. dump_control_message(c);
  683. return c;
  684. }
  685. void dump_control_message(control_message *c)
  686. {
  687. avp *a;
  688. printf("Control Message (type=%u s=%u t=%d ns=%d nr=%d)\n", c->mtype, c->session, c->tunnel, c->ns, c->nr);
  689. for (a = c->first; a; a = a->next)
  690. {
  691. printf(" avp: %s, len: %d", attributes[a->type], a->length - 6);
  692. switch (a->type)
  693. {
  694. // Short
  695. case 6 :
  696. case 9 :
  697. case 10 :
  698. case 39 :
  699. case 14 : printf(", value: %u\n", ntohs(*(short *)a->value));
  700. break;
  701. // Integer
  702. case 16 :
  703. case 17 :
  704. case 24 :
  705. case 25 :
  706. case 38 :
  707. case 15 : printf(", value: %u\n", ntohl(*(u32 *)a->value));
  708. break;
  709. // String
  710. case 7 :
  711. case 21 :
  712. case 22 :
  713. case 23 :
  714. case 37 :
  715. case 8 : printf(", value: \"%s\"\n", a->value);
  716. break;
  717. case 2 : printf(", value: %d.%d\n", *(char *)a->value, *(char *)a->value + 1);
  718. break;
  719. case 0 : printf(", value: %s\n", mtypes[ntohs(*(short *)a->value)]);
  720. break;
  721. case 19 :
  722. case 3 : printf(", value: (%d) %s %s\n", ntohl(*(u32 *)a->value),
  723. (ntohl(*(u32 *)a->value) & 0x01) ? "synchronous" : "",
  724. (ntohl(*(u32 *)a->value) & 0x02) ? "asynchronous" : "");
  725. break;
  726. case 18 :
  727. case 4 : printf(", value: (%d) %s %s\n", ntohl(*(u32 *)a->value),
  728. (ntohl(*(u32 *)a->value) & 0x01) ? "digital" : "",
  729. (ntohl(*(u32 *)a->value) & 0x02) ? "analog" : "");
  730. break;
  731. default : printf("\n");
  732. break;
  733. }
  734. }
  735. printf("\n");
  736. }
  737. u16 avp_get_16(control_message *c, int id)
  738. {
  739. avp *a;
  740. for (a = c->first; a; a = a->next)
  741. if (a->type == id) return ntohs(*(short *)a->value);
  742. return 0;
  743. }
  744. u32 avp_get_32(control_message *c, int id)
  745. {
  746. avp *a;
  747. for (a = c->first; a; a = a->next)
  748. if (a->type == id) return ntohl(*(u32 *)a->value);
  749. return 0;
  750. }
  751. char *avp_get_s(control_message *c, int id)
  752. {
  753. avp *a;
  754. for (a = c->first; a; a = a->next)
  755. if (a->type == id) return (char *)a->value;
  756. return 0;
  757. }
  758. void cm_free(control_message *m)
  759. {
  760. avp *a, *n;
  761. for (a = m->first; a; )
  762. {
  763. n = a->next;
  764. free(a);
  765. a = n;
  766. }
  767. free(m);
  768. }
  769. // }}}
  770. void reader_thread()/*{{{*/
  771. {
  772. unsigned char *packet;
  773. unsigned int seq = 0;
  774. printf("Starting reader thread\n");
  775. packet = malloc(4096);
  776. while (!ss->quitit)
  777. {
  778. struct sockaddr_in addr;
  779. socklen_t alen = sizeof(addr);
  780. control_message *m;
  781. int l;
  782. int s;
  783. int pfc = 0;
  784. // memset(packet, 0, 4096);
  785. if ((l = recvfrom(udpfd, packet, 4096, 0, (void *) &addr, &alen)) < 0) break;
  786. ss->rbytes += l;
  787. if (!do_init)
  788. {
  789. ss->recv_count++;
  790. ss->rpkt++;
  791. continue;
  792. }
  793. if (l < 12)
  794. {
  795. printf("Short packet received: %d bytes\n", l);
  796. }
  797. s = ntohs(*(u16 *)(packet + 4));
  798. if (!s)
  799. {
  800. printf("Invalid session ID\n");
  801. continue;
  802. }
  803. if (packet[0] == 0xc8)
  804. {
  805. // Control Packet
  806. printf("Reader Received ");
  807. m = parsecontrol((char *) packet, l);
  808. printf("\n");
  809. s = m->session;
  810. switch (m->mtype)
  811. {
  812. case 4 : printf("StopCCN\n");
  813. printf("Killing tunnel %d\n", avp_get_16(m, 9));
  814. ss->quitit++;
  815. break;
  816. case 6 : printf("HELLO, sending ZLB ACK\n");
  817. controlnull(t);
  818. break;
  819. case 11 :
  820. {
  821. controlt *c;
  822. printf("Received ICRP. Responding with CONFREQ\n");
  823. ss->sessions[s].remote_session = avp_get_16(m, 14);
  824. ss->sessions[s].open = 1;
  825. ss->sessions[s].ppp_state = 1;
  826. c = controlnew(12); // ICCN
  827. controlsend(c, t, ss->sessions[s].remote_session);
  828. controlfree(c);
  829. c = ppp_lcp(s, CONFREQ, 0);
  830. ppp_lcp_add_option(c, 1, 2, htons(1500)); // MRU = 1400
  831. ppp_lcp_add_option(c, 3, 2, htons(0xC023)); // Authentication Protocol - PAP
  832. ppp_send(c);
  833. controlfree(c);
  834. break;
  835. }
  836. case 14 : {
  837. int s;
  838. printf("CDN\n");
  839. s = avp_get_16(m, 14);
  840. printf("Killing session %d\n", s);
  841. ss->sessions[s].open = 0;
  842. ss->sessions[s].ppp_state = 0;
  843. ss->active_sessions--;
  844. controlnull(t);
  845. break;
  846. }
  847. }
  848. if (m->mtype == 4)
  849. {
  850. printf("StopCCN Received.. Dieing\n");
  851. ss->quitit++;
  852. break;
  853. }
  854. cm_free(m);
  855. }
  856. else
  857. {
  858. // Data Packet
  859. unsigned short protocol = ntohs(*(u16 *)(packet + 6));
  860. if (protocol == 0xff03)
  861. {
  862. pfc = 2;
  863. packet += 2;
  864. protocol = ntohs(*(u16 *)(packet + 6));
  865. }
  866. if (protocol != PPPIP)
  867. {
  868. printf("Received ");
  869. dump_ppp_packet((char *) (packet + 6), l - 6);
  870. }
  871. if (protocol == PPPLCP)
  872. {
  873. controlt *r;
  874. unsigned char ppp_id = *(char *)(packet + 9);
  875. switch (*(char *)(packet + 8))
  876. {
  877. case CONFREQ :
  878. r = ppp_lcp(s, CONFACK, ppp_id);
  879. ppp_send(r);
  880. break;
  881. case CONFACK :
  882. r = ppp_pap(s, CONFREQ, 0, session_usernames[s-1], base_password);
  883. ppp_send(r);
  884. break;
  885. case TERMREQ :
  886. r = ppp_lcp(s, TERMACK, ppp_id);
  887. ppp_send(r);
  888. break;
  889. case ECHOREQ :
  890. r = ppp_lcp(s, ECHOREP, ppp_id);
  891. ppp_add_32(r, 0);
  892. ppp_send(r);
  893. break;
  894. }
  895. }
  896. else if (protocol == PPPIPCP)
  897. {
  898. controlt *r;
  899. int taddr = 0;
  900. u32 address = *(u32 *)(packet + 14);
  901. switch (*(char *)(packet + 8))
  902. {
  903. case CONFREQ :
  904. r = ppp_ipcp(s, CONFREQ, time(NULL) % 255);
  905. ppp_lcp_add_option(r, 3, 4, htonl(taddr)); // Request 0.0.0.0
  906. ppp_send(r);
  907. controlfree(r);
  908. r = ppp_ipcp(s, CONFACK, time(NULL) % 255);
  909. ppp_lcp_add_option(r, 3, 4, address); // ACK gateway IP
  910. ppp_send(r);
  911. controlfree(r);
  912. break;
  913. case CONFNAK :
  914. // Request whatever address we are given - it's ours
  915. r = ppp_ipcp(s, CONFREQ, time(NULL) % 255);
  916. ppp_lcp_add_option(r, 3, 4, address);
  917. ppp_send(r);
  918. controlfree(r);
  919. printf("Session %d: %s\n", s, inet_toa(address));
  920. ss->sessions[s].ppp_state = 2;
  921. ss->sessions[s].addr = address;
  922. ss->active_sessions++;
  923. break;
  924. case CONFACK :
  925. printf("Conf-Ack Received\n");
  926. break;
  927. case TERMREQ :
  928. printf("Term-Req Received\n");
  929. break;
  930. case ECHOREQ :
  931. printf("Echo-Req Received\n");
  932. break;
  933. case ECHOREP :
  934. printf("Echo-Rep Received\n");
  935. break;
  936. }
  937. }
  938. else if (protocol == PPPPAP)
  939. {
  940. if (*(u16 *)(packet + 8) == 3)
  941. {
  942. controlt *c;
  943. printf("Closing Connection\n");
  944. c = controlnew(14); // CDN
  945. control16(c, 14, ss->sessions[s].remote_session, 0); // Assigned Session ID
  946. controlsend(c, t, 0);
  947. controlfree(c);
  948. ss->sessions[s].open = 0;
  949. }
  950. }
  951. else if (protocol == PPPIP)
  952. {
  953. struct iphdr *iph = (struct iphdr *)(packet + 8);
  954. char * data = (char*) (packet + 8 + sizeof(struct iphdr) + sizeof(struct udphdr));
  955. if (!ss->sessions[s].open)
  956. {
  957. printf("Packet for closed session %d\n", s);
  958. continue;
  959. }
  960. if (iph->protocol == 17)
  961. {
  962. unsigned int iseq;
  963. ss->recv_count++;
  964. ss->rpkt++;
  965. iseq = *((unsigned int *) data);
  966. if (seq != iseq)
  967. ss->dropped += (iseq - seq) ;
  968. seq = iseq + 1; // Next sequence number to expect.
  969. }
  970. }
  971. }
  972. packet -= pfc;
  973. }
  974. free(packet);
  975. printf("Closing reader thread\n");
  976. }/*}}}*/
  977. void skip_zlb() /*{{{*/
  978. {
  979. struct sockaddr_in addr;
  980. socklen_t alen = sizeof(addr);
  981. char buf[1024];
  982. int l;
  983. l = recvfrom(udpfd, buf, 1024, MSG_PEEK, (void *) &addr, &alen);
  984. if (l < 0)
  985. {
  986. printf("recvfrom: %s\n", strerror(errno));
  987. return;
  988. }
  989. if (l <= 12)
  990. {
  991. printf("Skipping ZLB (l=%d)\n", l);
  992. recvfrom(udpfd, buf, 1024, 0, (void *) &addr, &alen);
  993. }
  994. }
  995. /*}}}*/
  996. // PPP Stuff {{{
  997. controlt *ppp_new(u16 session, int protocol)
  998. {
  999. controlt *c = calloc(sizeof(controlt), 1);
  1000. *(u16 *)(c->buf + 4) = htons(ss->sessions[session].remote_session); // Tunnel
  1001. *(u16 *)(c->buf + 6) = htons(protocol);
  1002. c->length += 8;
  1003. return c;
  1004. }
  1005. void ppp_free(controlt *c)
  1006. {
  1007. free(c);
  1008. }
  1009. controlt *ppp_lcp(u16 s, unsigned char type, char identifier)
  1010. {
  1011. controlt *c;
  1012. if (!identifier) identifier = ss->sessions[s].ppp_identifier++;
  1013. c = ppp_new(s, PPPLCP);
  1014. *(char *)(c->buf + c->length + 0) = type;
  1015. *(char *)(c->buf + c->length + 1) = identifier;
  1016. *(u16 *)(c->buf + c->length + 2) = ntohs(4);
  1017. c->length += 4;
  1018. return c;
  1019. }
  1020. controlt *ppp_ipcp(u16 s, unsigned char type, char identifier)
  1021. {
  1022. controlt *c;
  1023. if (!identifier) identifier = ss->sessions[s].ppp_identifier++;
  1024. c = ppp_new(s, PPPIPCP);
  1025. *(char *)(c->buf + c->length + 0) = type;
  1026. *(char *)(c->buf + c->length + 1) = identifier;
  1027. *(u16 *)(c->buf + c->length + 2) = ntohs(4);
  1028. c->length += 4;
  1029. return c;
  1030. }
  1031. controlt *ppp_pap(u16 s, unsigned char type, char identifier, char *username, char *password)
  1032. {
  1033. controlt *c;
  1034. if (!identifier) identifier = ss->sessions[s].ppp_identifier++;
  1035. c = ppp_new(s, PPPPAP);
  1036. *(char *)(c->buf + c->length + 0) = type;
  1037. *(char *)(c->buf + c->length + 1) = identifier;
  1038. *(u16 *)(c->buf + c->length + 2) = ntohs(4);
  1039. c->length += 4;
  1040. *(char *)(c->buf + c->length) = strlen(username) + strlen(suffix);
  1041. memcpy((c->buf + c->length + 1), username, strlen(username));
  1042. memcpy((c->buf + c->length + 1 + strlen(username)), suffix, strlen(suffix));
  1043. c->length += strlen(username) + 1 + strlen(suffix);
  1044. *(char *)(c->buf + c->length) = strlen(password);
  1045. memcpy((c->buf + c->length + 1), password, strlen(password));
  1046. c->length += strlen(password) + 1;
  1047. return c;
  1048. }
  1049. void ppp_send(controlt *c)
  1050. {
  1051. *(u16 *)(c->buf + 0) = htons(0x0002); // flags/ver
  1052. *(u16 *)(c->buf + 2) = htons(t); // tunnel
  1053. *(u16 *)(c->buf + 10) = ntohs(c->length - 8);
  1054. if (sendto(udpfd, c->buf, c->length, 0, (struct sockaddr *)&gatewayaddr, sizeof(gatewayaddr)) < 0)
  1055. perror("sendto");
  1056. if (htons(*(u16 *)(c->buf + 6)) != PPPIP)
  1057. {
  1058. printf("PPP Sending ");
  1059. dump_ppp_packet(c->buf + 6, c->length - 6);
  1060. }
  1061. }
  1062. void ppp_add_16(controlt *c, u16 val)
  1063. {
  1064. *(u16 *) (c->buf + c->length) = htons(val);
  1065. c->length += 2;
  1066. }
  1067. void ppp_add_32(controlt *c, u32 val)
  1068. {
  1069. *(u32 *) (c->buf + c->length) = htons(val);
  1070. c->length += 4;
  1071. }
  1072. void ppp_add_s(controlt *c, char *val)
  1073. {
  1074. memcpy(c->buf + c->length, val, strlen(val));
  1075. c->length += strlen(val);
  1076. }
  1077. void ppp_lcp_add_option(controlt *c, unsigned char option, unsigned char length, int data)
  1078. {
  1079. *(char *)(c->buf + c->length + 0) = option;
  1080. *(char *)(c->buf + c->length + 1) = length + 2;
  1081. memcpy(c->buf + c->length + 2, &data, length);
  1082. c->length += 2 + length;
  1083. }
  1084. void dump_ppp_packet(char *packet, int l)
  1085. {
  1086. char *p = packet;
  1087. int protocol ;
  1088. if (*(unsigned char *)p == 0xff) p += 2;
  1089. protocol = ntohs(*(u16 *)(p));
  1090. printf("PPP Packet\n");
  1091. switch (protocol)
  1092. {
  1093. case PPPCCP : printf(" Protocol: PPPCCP\n"); break;
  1094. }
  1095. if (protocol == PPPLCP)
  1096. {
  1097. printf(" Protocol: PPPLCP\n");
  1098. printf(" LCP Code: %s\n", lcp_codes[*(u8 *)(p + 2)]);
  1099. }
  1100. else if (protocol == PPPPAP)
  1101. {
  1102. printf(" Protocol: PPPPAP\n");
  1103. if (*(char *)(p + 2) == 2)
  1104. {
  1105. printf(" Authentication accepted\n");
  1106. }
  1107. else if (*(char *)(p + 2) == 3)
  1108. {
  1109. printf(" Authentication denied\n");
  1110. }
  1111. }
  1112. else if (protocol == PPPIPCP)
  1113. {
  1114. printf(" Protocol: PPPIPCP\n");
  1115. printf(" IPCP Code: %s\n", lcp_codes[*(u8 *)(p + 2)]);
  1116. printf(" Address: %s\n", inet_toa(*(u32 *)(p + 8)));
  1117. }
  1118. else if (protocol == PPPIP)
  1119. {
  1120. struct iphdr *iph;
  1121. struct protoent *pr;
  1122. iph = (struct iphdr *)(p + 2);
  1123. printf(" Protocol: PPPIP\n");
  1124. printf(" Length: %d\n", l);
  1125. printf(" IP Version: %d\n", iph->version);
  1126. if (iph->version != 4) return;
  1127. pr = getprotobynumber(iph->protocol);
  1128. printf(" IP Header Length: %d\n", iph->ihl);
  1129. printf(" IP TTL: %d\n", iph->ttl);
  1130. printf(" IP Protocol: %s (%d)\n", (pr ? pr->p_name : "unknown"), iph->protocol);
  1131. printf(" IP Checksum: %x\n", ntohs(iph->check));
  1132. }
  1133. else
  1134. {
  1135. printf(" Protocol: unknown 0x%x\n", protocol);
  1136. }
  1137. printf("\n");
  1138. }
  1139. char *inet_toa(unsigned long addr)
  1140. {
  1141. struct in_addr in;
  1142. memcpy(&in, &addr, sizeof(unsigned long));
  1143. return inet_ntoa(in);
  1144. }
  1145. // }}}