gencode.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:37k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21. #ifndef lint
  22. static const char rcsid[] =
  23.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/gencode.c,v 1.3 2003/02/06 20:28:07 renaud Exp $ (LBL)";
  24. #endif
  25. #include <sys/types.h>
  26. #include <sys/socket.h>
  27. #include <sys/time.h>
  28. #if __STDC__
  29. struct mbuf;
  30. struct rtentry;
  31. #endif
  32. #include <net/if.h>
  33. #include <netinet/in.h>
  34. #include <netinet/if_ether.h>
  35. #include <stdlib.h>
  36. #include <memory.h>
  37. #include <setjmp.h>
  38. #if __STDC__
  39. #include <stdarg.h>
  40. #else
  41. #include <varargs.h>
  42. #endif
  43. #include "pcap-int.h"
  44. #include "ethertype.h"
  45. #include "gencode.h"
  46. #include "ppp.h"
  47. #include "pcap-namedb.h"
  48. #include "gnuc.h"
  49. #ifdef HAVE_OS_PROTO_H
  50. #include "os-proto.h"
  51. #endif
  52. #define JMP(c) ((c)|BPF_JMP|BPF_K)
  53. /* Locals */
  54. static jmp_buf top_ctx;
  55. static pcap_t *bpf_pcap;
  56. /* XXX */
  57. #ifdef PCAP_FDDIPAD
  58. int pcap_fddipad = PCAP_FDDIPAD;
  59. #else
  60. int pcap_fddipad;
  61. #endif
  62. /* VARARGS */
  63. __dead void
  64. #if __STDC__
  65. bpf_error(const char *fmt, ...)
  66. #else
  67. bpf_error(fmt, va_alist)
  68. const char *fmt;
  69. va_dcl
  70. #endif
  71. {
  72. va_list ap;
  73. #if __STDC__
  74. va_start(ap, fmt);
  75. #else
  76. va_start(ap);
  77. #endif
  78. if (bpf_pcap != NULL)
  79. (void)vsprintf(pcap_geterr(bpf_pcap), fmt, ap);
  80. va_end(ap);
  81. longjmp(top_ctx, 1);
  82. /* NOTREACHED */
  83. }
  84. static void init_linktype(int);
  85. static int alloc_reg(void);
  86. static void free_reg(int);
  87. static struct block *root;
  88. /*
  89.  * We divy out chunks of memory rather than call malloc each time so
  90.  * we don't have to worry about leaking memory.  It's probably
  91.  * not a big deal if all this memory was wasted but it this ever
  92.  * goes into a library that would probably not be a good idea.
  93.  */
  94. #define NCHUNKS 16
  95. #define CHUNK0SIZE 1024
  96. struct chunk {
  97. u_int n_left;
  98. void *m;
  99. };
  100. static struct chunk chunks[NCHUNKS];
  101. static int cur_chunk;
  102. static void *newchunk(u_int);
  103. static void freechunks(void);
  104. static inline struct block *new_block(int);
  105. static inline struct slist *new_stmt(int);
  106. static struct block *gen_retblk(int);
  107. static inline void syntax(void);
  108. static void backpatch(struct block *, struct block *);
  109. static void merge(struct block *, struct block *);
  110. static struct block *gen_cmp(u_int, u_int, bpf_int32);
  111. static struct block *gen_mcmp(u_int, u_int, bpf_int32, bpf_u_int32);
  112. static struct block *gen_bcmp(u_int, u_int, const u_char *);
  113. static struct block *gen_uncond(int);
  114. static inline struct block *gen_true(void);
  115. static inline struct block *gen_false(void);
  116. static struct block *gen_linktype(int);
  117. static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int);
  118. static struct block *gen_ehostop(const u_char *, int);
  119. static struct block *gen_fhostop(const u_char *, int);
  120. static struct block *gen_dnhostop(bpf_u_int32, int, u_int);
  121. static struct block *gen_host(bpf_u_int32, bpf_u_int32, int, int);
  122. static struct block *gen_gateway(const u_char *, bpf_u_int32 **, int, int);
  123. static struct block *gen_ipfrag(void);
  124. static struct block *gen_portatom(int, bpf_int32);
  125. struct block *gen_portop(int, int, int);
  126. static struct block *gen_port(int, int, int);
  127. static int lookup_proto(const char *, int);
  128. static struct block *gen_proto(int, int, int);
  129. static struct slist *xfer_to_x(struct arth *);
  130. static struct slist *xfer_to_a(struct arth *);
  131. static struct block *gen_len(int, int);
  132. static void *
  133. newchunk(n)
  134. u_int n;
  135. {
  136. struct chunk *cp;
  137. int k, size;
  138. /* XXX Round up to nearest long. */
  139. n = (n + sizeof(long) - 1) & ~(sizeof(long) - 1);
  140. cp = &chunks[cur_chunk];
  141. if (n > cp->n_left) {
  142. ++cp, k = ++cur_chunk;
  143. if (k >= NCHUNKS)
  144. bpf_error("out of memory");
  145. size = CHUNK0SIZE << k;
  146. cp->m = (void *)malloc(size);
  147. memset((char *)cp->m, 0, size);
  148. cp->n_left = size;
  149. if (n > size)
  150. bpf_error("out of memory");
  151. }
  152. cp->n_left -= n;
  153. return (void *)((char *)cp->m + cp->n_left);
  154. }
  155. static void
  156. freechunks()
  157. {
  158. int i;
  159. cur_chunk = 0;
  160. for (i = 0; i < NCHUNKS; ++i)
  161. if (chunks[i].m != NULL) {
  162. free(chunks[i].m);
  163. chunks[i].m = NULL;
  164. }
  165. }
  166. /*
  167.  * A strdup whose allocations are freed after code generation is over.
  168.  */
  169. char *
  170. sdup(s)
  171. register const char *s;
  172. {
  173. int n = strlen(s) + 1;
  174. char *cp = newchunk(n);
  175. strcpy(cp, s);
  176. return (cp);
  177. }
  178. static inline struct block *
  179. new_block(code)
  180. int code;
  181. {
  182. struct block *p;
  183. p = (struct block *)newchunk(sizeof(*p));
  184. p->s.code = code;
  185. p->head = p;
  186. return p;
  187. }
  188. static inline struct slist *
  189. new_stmt(code)
  190. int code;
  191. {
  192. struct slist *p;
  193. p = (struct slist *)newchunk(sizeof(*p));
  194. p->s.code = code;
  195. return p;
  196. }
  197. static struct block *
  198. gen_retblk(v)
  199. int v;
  200. {
  201. struct block *b = new_block(BPF_RET|BPF_K);
  202. b->s.k = v;
  203. return b;
  204. }
  205. static inline void
  206. syntax()
  207. {
  208. bpf_error("syntax error in filter expression");
  209. }
  210. static bpf_u_int32 netmask;
  211. static int snaplen;
  212. int
  213. pcap_compile(pcap_t *p, struct bpf_program *program,
  214.      char *buf, int optimize, bpf_u_int32 mask)
  215. {
  216. extern int n_errors;
  217. int len;
  218. n_errors = 0;
  219. root = NULL;
  220. bpf_pcap = p;
  221. if (setjmp(top_ctx)) {
  222. freechunks();
  223. return (-1);
  224. }
  225. netmask = mask;
  226. snaplen = pcap_snapshot(p);
  227. lex_init(buf ? buf : "");
  228. init_linktype(pcap_datalink(p));
  229. (void)pcap_parse();
  230. if (n_errors)
  231. syntax();
  232. if (root == NULL)
  233. root = gen_retblk(snaplen);
  234. if (optimize) {
  235. bpf_optimize(&root);
  236. if (root == NULL ||
  237.     (root->s.code == (BPF_RET|BPF_K) && root->s.k == 0))
  238. bpf_error("expression rejects all packets");
  239. }
  240. program->bf_insns = icode_to_fcode(root, &len);
  241. program->bf_len = len;
  242. freechunks();
  243. return (0);
  244. }
  245. /*
  246.  * Backpatch the blocks in 'list' to 'target'.  The 'sense' field indicates
  247.  * which of the jt and jf fields has been resolved and which is a pointer
  248.  * back to another unresolved block (or nil).  At least one of the fields
  249.  * in each block is already resolved.
  250.  */
  251. static void
  252. backpatch(list, target)
  253. struct block *list, *target;
  254. {
  255. struct block *next;
  256. while (list) {
  257. if (!list->sense) {
  258. next = JT(list);
  259. JT(list) = target;
  260. } else {
  261. next = JF(list);
  262. JF(list) = target;
  263. }
  264. list = next;
  265. }
  266. }
  267. /*
  268.  * Merge the lists in b0 and b1, using the 'sense' field to indicate
  269.  * which of jt and jf is the link.
  270.  */
  271. static void
  272. merge(b0, b1)
  273. struct block *b0, *b1;
  274. {
  275. register struct block **p = &b0;
  276. /* Find end of list. */
  277. while (*p)
  278. p = !((*p)->sense) ? &JT(*p) : &JF(*p);
  279. /* Concatenate the lists. */
  280. *p = b1;
  281. }
  282. void
  283. finish_parse(p)
  284. struct block *p;
  285. {
  286. backpatch(p, gen_retblk(snaplen));
  287. p->sense = !p->sense;
  288. backpatch(p, gen_retblk(0));
  289. root = p->head;
  290. }
  291. void
  292. gen_and(b0, b1)
  293. struct block *b0, *b1;
  294. {
  295. backpatch(b0, b1->head);
  296. b0->sense = !b0->sense;
  297. b1->sense = !b1->sense;
  298. merge(b1, b0);
  299. b1->sense = !b1->sense;
  300. b1->head = b0->head;
  301. }
  302. void
  303. gen_or(b0, b1)
  304. struct block *b0, *b1;
  305. {
  306. b0->sense = !b0->sense;
  307. backpatch(b0, b1->head);
  308. b0->sense = !b0->sense;
  309. merge(b1, b0);
  310. b1->head = b0->head;
  311. }
  312. void
  313. gen_not(b)
  314. struct block *b;
  315. {
  316. b->sense = !b->sense;
  317. }
  318. static struct block *
  319. gen_cmp(offset, size, v)
  320. u_int offset, size;
  321. bpf_int32 v;
  322. {
  323. struct slist *s;
  324. struct block *b;
  325. s = new_stmt(BPF_LD|BPF_ABS|size);
  326. s->s.k = offset;
  327. b = new_block(JMP(BPF_JEQ));
  328. b->stmts = s;
  329. b->s.k = v;
  330. return b;
  331. }
  332. static struct block *
  333. gen_mcmp(offset, size, v, mask)
  334. u_int offset, size;
  335. bpf_int32 v;
  336. bpf_u_int32 mask;
  337. {
  338. struct block *b = gen_cmp(offset, size, v);
  339. struct slist *s;
  340. if (mask != 0xffffffff) {
  341. s = new_stmt(BPF_ALU|BPF_AND|BPF_K);
  342. s->s.k = mask;
  343. b->stmts->next = s;
  344. }
  345. return b;
  346. }
  347. static struct block *
  348. gen_bcmp(offset, size, v)
  349. register u_int offset, size;
  350. register const u_char *v;
  351. {
  352. register struct block *b, *tmp;
  353. b = NULL;
  354. while (size >= 4) {
  355. register const u_char *p = &v[size - 4];
  356. bpf_int32 w = ((bpf_int32)p[0] << 24) |
  357.     ((bpf_int32)p[1] << 16) | ((bpf_int32)p[2] << 8) | p[3];
  358. tmp = gen_cmp(offset + size - 4, BPF_W, w);
  359. if (b != NULL)
  360. gen_and(b, tmp);
  361. b = tmp;
  362. size -= 4;
  363. }
  364. while (size >= 2) {
  365. register const u_char *p = &v[size - 2];
  366. bpf_int32 w = ((bpf_int32)p[0] << 8) | p[1];
  367. tmp = gen_cmp(offset + size - 2, BPF_H, w);
  368. if (b != NULL)
  369. gen_and(b, tmp);
  370. b = tmp;
  371. size -= 2;
  372. }
  373. if (size > 0) {
  374. tmp = gen_cmp(offset, BPF_B, (bpf_int32)v[0]);
  375. if (b != NULL)
  376. gen_and(b, tmp);
  377. b = tmp;
  378. }
  379. return b;
  380. }
  381. /*
  382.  * Various code constructs need to know the layout of the data link
  383.  * layer.  These variables give the necessary offsets.  off_linktype
  384.  * is set to -1 for no encapsulation, in which case, IP is assumed.
  385.  */
  386. static u_int off_linktype;
  387. static u_int off_nl;
  388. static int linktype;
  389. static void
  390. init_linktype(type)
  391. int type;
  392. {
  393. linktype = type;
  394. switch (type) {
  395. case DLT_EN10MB:
  396. off_linktype = 12;
  397. off_nl = 14;
  398. return;
  399. case DLT_SLIP:
  400. /*
  401.  * SLIP doesn't have a link level type.  The 16 byte
  402.  * header is hacked into our SLIP driver.
  403.  */
  404. off_linktype = -1;
  405. off_nl = 16;
  406. return;
  407. case DLT_SLIP_BSDOS:
  408. /* XXX this may be the same as the DLT_PPP_BSDOS case */
  409. off_linktype = -1;
  410. /* XXX end */
  411. off_nl = 24;
  412. return;
  413. case DLT_NULL:
  414. off_linktype = 0;
  415. off_nl = 4;
  416. return;
  417. case DLT_PPP:
  418. off_linktype = 2;
  419. off_nl = 4;
  420. return;
  421. case DLT_PPP_BSDOS:
  422. off_linktype = 5;
  423. off_nl = 24;
  424. return;
  425. case DLT_FDDI:
  426. /*
  427.  * FDDI doesn't really have a link-level type field.
  428.  * We assume that SSAP = SNAP is being used and pick
  429.  * out the encapsulated Ethernet type.
  430.  */
  431. off_linktype = 19;
  432. #ifdef PCAP_FDDIPAD
  433. off_linktype += pcap_fddipad;
  434. #endif
  435. off_nl = 21;
  436. #ifdef PCAP_FDDIPAD
  437. off_nl += pcap_fddipad;
  438. #endif
  439. return;
  440. case DLT_IEEE802:
  441. off_linktype = 20;
  442. off_nl = 22;
  443. return;
  444. case DLT_ATM_RFC1483:
  445. /*
  446.  * assume routed, non-ISO PDUs
  447.  * (i.e., LLC = 0xAA-AA-03, OUT = 0x00-00-00)
  448.  */
  449. off_linktype = 6;
  450. off_nl = 8;
  451. return;
  452. case DLT_RAW:
  453. off_linktype = -1;
  454. off_nl = 0;
  455. return;
  456. }
  457. bpf_error("unknown data link type 0x%x", linktype);
  458. /* NOTREACHED */
  459. }
  460. static struct block *
  461. gen_uncond(rsense)
  462. int rsense;
  463. {
  464. struct block *b;
  465. struct slist *s;
  466. s = new_stmt(BPF_LD|BPF_IMM);
  467. s->s.k = !rsense;
  468. b = new_block(JMP(BPF_JEQ));
  469. b->stmts = s;
  470. return b;
  471. }
  472. static inline struct block *
  473. gen_true()
  474. {
  475. return gen_uncond(1);
  476. }
  477. static inline struct block *
  478. gen_false()
  479. {
  480. return gen_uncond(0);
  481. }
  482. static struct block *
  483. gen_linktype(proto)
  484. register int proto;
  485. {
  486. struct block *b0, *b1;
  487. /* If we're not using encapsulation and checking for IP, we're done */
  488. if (off_linktype == -1 && proto == ETHERTYPE_IP)
  489. return gen_true();
  490. switch (linktype) {
  491. case DLT_SLIP:
  492. return gen_false();
  493. case DLT_PPP:
  494. if (proto == ETHERTYPE_IP)
  495. proto = PPP_IP; /* XXX was 0x21 */
  496. break;
  497. case DLT_PPP_BSDOS:
  498. switch (proto) {
  499. case ETHERTYPE_IP:
  500. b0 = gen_cmp(off_linktype, BPF_H, PPP_IP);
  501. b1 = gen_cmp(off_linktype, BPF_H, PPP_VJC);
  502. gen_or(b0, b1);
  503. b0 = gen_cmp(off_linktype, BPF_H, PPP_VJNC);
  504. gen_or(b1, b0);
  505. return b0;
  506. case ETHERTYPE_DN:
  507. proto = PPP_DECNET;
  508. break;
  509. case ETHERTYPE_ATALK:
  510. proto = PPP_APPLE;
  511. break;
  512. case ETHERTYPE_NS:
  513. proto = PPP_NS;
  514. break;
  515. }
  516. break;
  517. case DLT_NULL:
  518. /* XXX */
  519. if (proto == ETHERTYPE_IP)
  520. return (gen_cmp(0, BPF_W, (bpf_int32)htonl(AF_INET)));
  521. else
  522. return gen_false();
  523. }
  524. return gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
  525. }
  526. static struct block *
  527. gen_hostop(addr, mask, dir, proto, src_off, dst_off)
  528. bpf_u_int32 addr;
  529. bpf_u_int32 mask;
  530. int dir, proto;
  531. u_int src_off, dst_off;
  532. {
  533. struct block *b0, *b1;
  534. u_int offset;
  535. switch (dir) {
  536. case Q_SRC:
  537. offset = src_off;
  538. break;
  539. case Q_DST:
  540. offset = dst_off;
  541. break;
  542. case Q_AND:
  543. b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
  544. b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
  545. gen_and(b0, b1);
  546. return b1;
  547. case Q_OR:
  548. case Q_DEFAULT:
  549. b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
  550. b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
  551. gen_or(b0, b1);
  552. return b1;
  553. default:
  554. abort();
  555. }
  556. b0 = gen_linktype(proto);
  557. b1 = gen_mcmp(offset, BPF_W, (bpf_int32)addr, mask);
  558. gen_and(b0, b1);
  559. return b1;
  560. }
  561. static struct block *
  562. gen_ehostop(eaddr, dir)
  563. register const u_char *eaddr;
  564. register int dir;
  565. {
  566. register struct block *b0, *b1;
  567. switch (dir) {
  568. case Q_SRC:
  569. return gen_bcmp(6, 6, eaddr);
  570. case Q_DST:
  571. return gen_bcmp(0, 6, eaddr);
  572. case Q_AND:
  573. b0 = gen_ehostop(eaddr, Q_SRC);
  574. b1 = gen_ehostop(eaddr, Q_DST);
  575. gen_and(b0, b1);
  576. return b1;
  577. case Q_DEFAULT:
  578. case Q_OR:
  579. b0 = gen_ehostop(eaddr, Q_SRC);
  580. b1 = gen_ehostop(eaddr, Q_DST);
  581. gen_or(b0, b1);
  582. return b1;
  583. }
  584. abort();
  585. /* NOTREACHED */
  586. }
  587. /*
  588.  * Like gen_ehostop, but for DLT_FDDI
  589.  */
  590. static struct block *
  591. gen_fhostop(eaddr, dir)
  592. register const u_char *eaddr;
  593. register int dir;
  594. {
  595. struct block *b0, *b1;
  596. switch (dir) {
  597. case Q_SRC:
  598. #ifdef PCAP_FDDIPAD
  599. return gen_bcmp(6 + 1 + pcap_fddipad, 6, eaddr);
  600. #else
  601. return gen_bcmp(6 + 1, 6, eaddr);
  602. #endif
  603. case Q_DST:
  604. #ifdef PCAP_FDDIPAD
  605. return gen_bcmp(0 + 1 + pcap_fddipad, 6, eaddr);
  606. #else
  607. return gen_bcmp(0 + 1, 6, eaddr);
  608. #endif
  609. case Q_AND:
  610. b0 = gen_fhostop(eaddr, Q_SRC);
  611. b1 = gen_fhostop(eaddr, Q_DST);
  612. gen_and(b0, b1);
  613. return b1;
  614. case Q_DEFAULT:
  615. case Q_OR:
  616. b0 = gen_fhostop(eaddr, Q_SRC);
  617. b1 = gen_fhostop(eaddr, Q_DST);
  618. gen_or(b0, b1);
  619. return b1;
  620. }
  621. abort();
  622. /* NOTREACHED */
  623. }
  624. /*
  625.  * This is quite tricky because there may be pad bytes in front of the
  626.  * DECNET header, and then there are two possible data packet formats that
  627.  * carry both src and dst addresses, plus 5 packet types in a format that
  628.  * carries only the src node, plus 2 types that use a different format and
  629.  * also carry just the src node.
  630.  *
  631.  * Yuck.
  632.  *
  633.  * Instead of doing those all right, we just look for data packets with
  634.  * 0 or 1 bytes of padding.  If you want to look at other packets, that
  635.  * will require a lot more hacking.
  636.  *
  637.  * To add support for filtering on DECNET "areas" (network numbers)
  638.  * one would want to add a "mask" argument to this routine.  That would
  639.  * make the filter even more inefficient, although one could be clever
  640.  * and not generate masking instructions if the mask is 0xFFFF.
  641.  */
  642. static struct block *
  643. gen_dnhostop(addr, dir, base_off)
  644. bpf_u_int32 addr;
  645. int dir;
  646. u_int base_off;
  647. {
  648. struct block *b0, *b1, *b2, *tmp;
  649. u_int offset_lh; /* offset if long header is received */
  650. u_int offset_sh; /* offset if short header is received */
  651. switch (dir) {
  652. case Q_DST:
  653. offset_sh = 1; /* follows flags */
  654. offset_lh = 7; /* flgs,darea,dsubarea,HIORD */
  655. break;
  656. case Q_SRC:
  657. offset_sh = 3; /* follows flags, dstnode */
  658. offset_lh = 15; /* flgs,darea,dsubarea,did,sarea,ssub,HIORD */
  659. break;
  660. case Q_AND:
  661. /* Inefficient because we do our Calvinball dance twice */
  662. b0 = gen_dnhostop(addr, Q_SRC, base_off);
  663. b1 = gen_dnhostop(addr, Q_DST, base_off);
  664. gen_and(b0, b1);
  665. return b1;
  666. case Q_OR:
  667. case Q_DEFAULT:
  668. /* Inefficient because we do our Calvinball dance twice */
  669. b0 = gen_dnhostop(addr, Q_SRC, base_off);
  670. b1 = gen_dnhostop(addr, Q_DST, base_off);
  671. gen_or(b0, b1);
  672. return b1;
  673. default:
  674. abort();
  675. }
  676. b0 = gen_linktype(ETHERTYPE_DN);
  677. /* Check for pad = 1, long header case */
  678. tmp = gen_mcmp(base_off + 2, BPF_H,
  679.     (bpf_int32)ntohs(0x0681), (bpf_int32)ntohs(0x07FF));
  680. b1 = gen_cmp(base_off + 2 + 1 + offset_lh,
  681.     BPF_H, (bpf_int32)ntohs(addr));
  682. gen_and(tmp, b1);
  683. /* Check for pad = 0, long header case */
  684. tmp = gen_mcmp(base_off + 2, BPF_B, (bpf_int32)0x06, (bpf_int32)0x7);
  685. b2 = gen_cmp(base_off + 2 + offset_lh, BPF_H, (bpf_int32)ntohs(addr));
  686. gen_and(tmp, b2);
  687. gen_or(b2, b1);
  688. /* Check for pad = 1, short header case */
  689. tmp = gen_mcmp(base_off + 2, BPF_H,
  690.     (bpf_int32)ntohs(0x0281), (bpf_int32)ntohs(0x07FF));
  691. b2 = gen_cmp(base_off + 2 + 1 + offset_sh,
  692.     BPF_H, (bpf_int32)ntohs(addr));
  693. gen_and(tmp, b2);
  694. gen_or(b2, b1);
  695. /* Check for pad = 0, short header case */
  696. tmp = gen_mcmp(base_off + 2, BPF_B, (bpf_int32)0x02, (bpf_int32)0x7);
  697. b2 = gen_cmp(base_off + 2 + offset_sh, BPF_H, (bpf_int32)ntohs(addr));
  698. gen_and(tmp, b2);
  699. gen_or(b2, b1);
  700. /* Combine with test for linktype */
  701. gen_and(b0, b1);
  702. return b1;
  703. }
  704. static struct block *
  705. gen_host(addr, mask, proto, dir)
  706. bpf_u_int32 addr;
  707. bpf_u_int32 mask;
  708. int proto;
  709. int dir;
  710. {
  711. struct block *b0, *b1;
  712. switch (proto) {
  713. case Q_DEFAULT:
  714. b0 = gen_host(addr, mask, Q_IP, dir);
  715. b1 = gen_host(addr, mask, Q_ARP, dir);
  716. gen_or(b0, b1);
  717. b0 = gen_host(addr, mask, Q_RARP, dir);
  718. gen_or(b1, b0);
  719. return b0;
  720. case Q_IP:
  721. return gen_hostop(addr, mask, dir, ETHERTYPE_IP,
  722.   off_nl + 12, off_nl + 16);
  723. case Q_RARP:
  724. return gen_hostop(addr, mask, dir, ETHERTYPE_REVARP,
  725.   off_nl + 14, off_nl + 24);
  726. case Q_ARP:
  727. return gen_hostop(addr, mask, dir, ETHERTYPE_ARP,
  728.   off_nl + 14, off_nl + 24);
  729. case Q_TCP:
  730. bpf_error("'tcp' modifier applied to host");
  731. case Q_UDP:
  732. bpf_error("'udp' modifier applied to host");
  733. case Q_ICMP:
  734. bpf_error("'icmp' modifier applied to host");
  735. case Q_IGMP:
  736. bpf_error("'igmp' modifier applied to host");
  737. case Q_IGRP:
  738. bpf_error("'igrp' modifier applied to host");
  739. case Q_ATALK:
  740. bpf_error("ATALK host filtering not implemented");
  741. case Q_DECNET:
  742. return gen_dnhostop(addr, dir, off_nl);
  743. case Q_SCA:
  744. bpf_error("SCA host filtering not implemented");
  745. case Q_LAT:
  746. bpf_error("LAT host filtering not implemented");
  747. case Q_MOPDL:
  748. bpf_error("MOPDL host filtering not implemented");
  749. case Q_MOPRC:
  750. bpf_error("MOPRC host filtering not implemented");
  751. default:
  752. abort();
  753. }
  754. /* NOTREACHED */
  755. }
  756. static struct block *
  757. gen_gateway(eaddr, alist, proto, dir)
  758. const u_char *eaddr;
  759. bpf_u_int32 **alist;
  760. int proto;
  761. int dir;
  762. {
  763. struct block *b0, *b1, *tmp;
  764. if (dir != 0)
  765. bpf_error("direction applied to 'gateway'");
  766. switch (proto) {
  767. case Q_DEFAULT:
  768. case Q_IP:
  769. case Q_ARP:
  770. case Q_RARP:
  771. if (linktype == DLT_EN10MB)
  772. b0 = gen_ehostop(eaddr, Q_OR);
  773. else if (linktype == DLT_FDDI)
  774. b0 = gen_fhostop(eaddr, Q_OR);
  775. else
  776. bpf_error(
  777.     "'gateway' supported only on ethernet or FDDI");
  778. b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR);
  779. while (*alist) {
  780. tmp = gen_host(**alist++, 0xffffffff, proto, Q_OR);
  781. gen_or(b1, tmp);
  782. b1 = tmp;
  783. }
  784. gen_not(b1);
  785. gen_and(b0, b1);
  786. return b1;
  787. }
  788. bpf_error("illegal modifier of 'gateway'");
  789. /* NOTREACHED */
  790. }
  791. struct block *
  792. gen_proto_abbrev(proto)
  793. int proto;
  794. {
  795. struct block *b0, *b1;
  796. switch (proto) {
  797. case Q_TCP:
  798. b0 = gen_linktype(ETHERTYPE_IP);
  799. b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)IPPROTO_TCP);
  800. gen_and(b0, b1);
  801. break;
  802. case Q_UDP:
  803. b0 =  gen_linktype(ETHERTYPE_IP);
  804. b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)IPPROTO_UDP);
  805. gen_and(b0, b1);
  806. break;
  807. case Q_ICMP:
  808. b0 =  gen_linktype(ETHERTYPE_IP);
  809. b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)IPPROTO_ICMP);
  810. gen_and(b0, b1);
  811. break;
  812. case Q_IGMP:
  813. b0 =  gen_linktype(ETHERTYPE_IP);
  814. b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)2);
  815. gen_and(b0, b1);
  816. break;
  817. #ifndef IPPROTO_IGRP
  818. #define IPPROTO_IGRP 9
  819. #endif
  820. case Q_IGRP:
  821. b0 =  gen_linktype(ETHERTYPE_IP);
  822. b1 = gen_cmp(off_nl + 9, BPF_B, (long)IPPROTO_IGRP);
  823. gen_and(b0, b1);
  824. break;
  825. case Q_IP:
  826. b1 =  gen_linktype(ETHERTYPE_IP);
  827. break;
  828. case Q_ARP:
  829. b1 =  gen_linktype(ETHERTYPE_ARP);
  830. break;
  831. case Q_RARP:
  832. b1 =  gen_linktype(ETHERTYPE_REVARP);
  833. break;
  834. case Q_LINK:
  835. bpf_error("link layer applied in wrong context");
  836. case Q_ATALK:
  837. b1 =  gen_linktype(ETHERTYPE_ATALK);
  838. break;
  839. case Q_DECNET:
  840. b1 =  gen_linktype(ETHERTYPE_DN);
  841. break;
  842. case Q_SCA:
  843. b1 =  gen_linktype(ETHERTYPE_SCA);
  844. break;
  845. case Q_LAT:
  846. b1 =  gen_linktype(ETHERTYPE_LAT);
  847. break;
  848. case Q_MOPDL:
  849. b1 =  gen_linktype(ETHERTYPE_MOPDL);
  850. break;
  851. case Q_MOPRC:
  852. b1 =  gen_linktype(ETHERTYPE_MOPRC);
  853. break;
  854. default:
  855. abort();
  856. }
  857. return b1;
  858. }
  859. static struct block *
  860. gen_ipfrag()
  861. {
  862. struct slist *s;
  863. struct block *b;
  864. /* not ip frag */
  865. s = new_stmt(BPF_LD|BPF_H|BPF_ABS);
  866. s->s.k = off_nl + 6;
  867. b = new_block(JMP(BPF_JSET));
  868. b->s.k = 0x1fff;
  869. b->stmts = s;
  870. gen_not(b);
  871. return b;
  872. }
  873. static struct block *
  874. gen_portatom(off, v)
  875. int off;
  876. bpf_int32 v;
  877. {
  878. struct slist *s;
  879. struct block *b;
  880. s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
  881. s->s.k = off_nl;
  882. s->next = new_stmt(BPF_LD|BPF_IND|BPF_H);
  883. s->next->s.k = off_nl + off;
  884. b = new_block(JMP(BPF_JEQ));
  885. b->stmts = s;
  886. b->s.k = v;
  887. return b;
  888. }
  889. struct block *
  890. gen_portop(port, proto, dir)
  891. int port, proto, dir;
  892. {
  893. struct block *b0, *b1, *tmp;
  894. /* ip proto 'proto' */
  895. tmp = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)proto);
  896. b0 = gen_ipfrag();
  897. gen_and(tmp, b0);
  898. switch (dir) {
  899. case Q_SRC:
  900. b1 = gen_portatom(0, (bpf_int32)port);
  901. break;
  902. case Q_DST:
  903. b1 = gen_portatom(2, (bpf_int32)port);
  904. break;
  905. case Q_OR:
  906. case Q_DEFAULT:
  907. tmp = gen_portatom(0, (bpf_int32)port);
  908. b1 = gen_portatom(2, (bpf_int32)port);
  909. gen_or(tmp, b1);
  910. break;
  911. case Q_AND:
  912. tmp = gen_portatom(0, (bpf_int32)port);
  913. b1 = gen_portatom(2, (bpf_int32)port);
  914. gen_and(tmp, b1);
  915. break;
  916. default:
  917. abort();
  918. }
  919. gen_and(b0, b1);
  920. return b1;
  921. }
  922. static struct block *
  923. gen_port(port, ip_proto, dir)
  924. int port;
  925. int ip_proto;
  926. int dir;
  927. {
  928. struct block *b0, *b1, *tmp;
  929. /* ether proto ip */
  930. b0 =  gen_linktype(ETHERTYPE_IP);
  931. switch (ip_proto) {
  932. case IPPROTO_UDP:
  933. case IPPROTO_TCP:
  934. b1 = gen_portop(port, ip_proto, dir);
  935. break;
  936. case PROTO_UNDEF:
  937. tmp = gen_portop(port, IPPROTO_TCP, dir);
  938. b1 = gen_portop(port, IPPROTO_UDP, dir);
  939. gen_or(tmp, b1);
  940. break;
  941. default:
  942. abort();
  943. }
  944. gen_and(b0, b1);
  945. return b1;
  946. }
  947. static int
  948. lookup_proto(name, proto)
  949. register const char *name;
  950. register int proto;
  951. {
  952. register int v;
  953. switch (proto) {
  954. case Q_DEFAULT:
  955. case Q_IP:
  956. v = pcap_nametoproto(name);
  957. if (v == PROTO_UNDEF)
  958. bpf_error("unknown ip proto '%s'", name);
  959. break;
  960. case Q_LINK:
  961. /* XXX should look up h/w protocol type based on linktype */
  962. v = pcap_nametoeproto(name);
  963. if (v == PROTO_UNDEF)
  964. bpf_error("unknown ether proto '%s'", name);
  965. break;
  966. default:
  967. v = PROTO_UNDEF;
  968. break;
  969. }
  970. return v;
  971. }
  972. static struct block *
  973. gen_proto(v, proto, dir)
  974. int v;
  975. int proto;
  976. int dir;
  977. {
  978. struct block *b0, *b1;
  979. if (dir != Q_DEFAULT)
  980. bpf_error("direction applied to 'proto'");
  981. switch (proto) {
  982. case Q_DEFAULT:
  983. case Q_IP:
  984. b0 = gen_linktype(ETHERTYPE_IP);
  985. b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)v);
  986. gen_and(b0, b1);
  987. return b1;
  988. case Q_ARP:
  989. bpf_error("arp does not encapsulate another protocol");
  990. /* NOTREACHED */
  991. case Q_RARP:
  992. bpf_error("rarp does not encapsulate another protocol");
  993. /* NOTREACHED */
  994. case Q_ATALK:
  995. bpf_error("atalk encapsulation is not specifiable");
  996. /* NOTREACHED */
  997. case Q_DECNET:
  998. bpf_error("decnet encapsulation is not specifiable");
  999. /* NOTREACHED */
  1000. case Q_SCA:
  1001. bpf_error("sca does not encapsulate another protocol");
  1002. /* NOTREACHED */
  1003. case Q_LAT:
  1004. bpf_error("lat does not encapsulate another protocol");
  1005. /* NOTREACHED */
  1006. case Q_MOPRC:
  1007. bpf_error("moprc does not encapsulate another protocol");
  1008. /* NOTREACHED */
  1009. case Q_MOPDL:
  1010. bpf_error("mopdl does not encapsulate another protocol");
  1011. /* NOTREACHED */
  1012. case Q_LINK:
  1013. return gen_linktype(v);
  1014. case Q_UDP:
  1015. bpf_error("'udp proto' is bogus");
  1016. /* NOTREACHED */
  1017. case Q_TCP:
  1018. bpf_error("'tcp proto' is bogus");
  1019. /* NOTREACHED */
  1020. case Q_ICMP:
  1021. bpf_error("'icmp proto' is bogus");
  1022. /* NOTREACHED */
  1023. case Q_IGMP:
  1024. bpf_error("'igmp proto' is bogus");
  1025. /* NOTREACHED */
  1026. case Q_IGRP:
  1027. bpf_error("'igrp proto' is bogus");
  1028. /* NOTREACHED */
  1029. default:
  1030. abort();
  1031. /* NOTREACHED */
  1032. }
  1033. /* NOTREACHED */
  1034. }
  1035. struct block *
  1036. gen_scode(name, q)
  1037. register const char *name;
  1038. struct qual q;
  1039. {
  1040. int proto = q.proto;
  1041. int dir = q.dir;
  1042. int tproto;
  1043. u_char *eaddr;
  1044. bpf_u_int32 mask, addr, **alist;
  1045. struct block *b, *tmp;
  1046. int port, real_proto;
  1047. switch (q.addr) {
  1048. case Q_NET:
  1049. addr = pcap_nametonetaddr(name);
  1050. if (addr == 0)
  1051. bpf_error("unknown network '%s'", name);
  1052. /* Left justify network addr and calculate its network mask */
  1053. mask = 0xffffffff;
  1054. while (addr && (addr & 0xff000000) == 0) {
  1055. addr <<= 8;
  1056. mask <<= 8;
  1057. }
  1058. return gen_host(addr, mask, proto, dir);
  1059. case Q_DEFAULT:
  1060. case Q_HOST:
  1061. if (proto == Q_LINK) {
  1062. switch (linktype) {
  1063. case DLT_EN10MB:
  1064. eaddr = pcap_ether_hostton(name);
  1065. if (eaddr == NULL)
  1066. bpf_error(
  1067.     "unknown ether host '%s'", name);
  1068. return gen_ehostop(eaddr, dir);
  1069. case DLT_FDDI:
  1070. eaddr = pcap_ether_hostton(name);
  1071. if (eaddr == NULL)
  1072. bpf_error(
  1073.     "unknown FDDI host '%s'", name);
  1074. return gen_fhostop(eaddr, dir);
  1075. default:
  1076. bpf_error(
  1077. "only ethernet/FDDI supports link-level host name");
  1078. break;
  1079. }
  1080. } else if (proto == Q_DECNET) {
  1081. unsigned short dn_addr = __pcap_nametodnaddr(name);
  1082. /*
  1083.  * I don't think DECNET hosts can be multihomed, so
  1084.  * there is no need to build up a list of addresses
  1085.  */
  1086. return (gen_host(dn_addr, 0, proto, dir));
  1087. } else {
  1088. alist = pcap_nametoaddr(name);
  1089. if (alist == NULL || *alist == NULL)
  1090. bpf_error("unknown host '%s'", name);
  1091. tproto = proto;
  1092. if (off_linktype == -1 && tproto == Q_DEFAULT)
  1093. tproto = Q_IP;
  1094. b = gen_host(**alist++, 0xffffffff, tproto, dir);
  1095. while (*alist) {
  1096. tmp = gen_host(**alist++, 0xffffffff,
  1097.        tproto, dir);
  1098. gen_or(b, tmp);
  1099. b = tmp;
  1100. }
  1101. return b;
  1102. }
  1103. case Q_PORT:
  1104. if (proto != Q_DEFAULT && proto != Q_UDP && proto != Q_TCP)
  1105. bpf_error("illegal qualifier of 'port'");
  1106. if (pcap_nametoport(name, &port, &real_proto) == 0)
  1107. bpf_error("unknown port '%s'", name);
  1108. if (proto == Q_UDP) {
  1109. if (real_proto == IPPROTO_TCP)
  1110. bpf_error("port '%s' is tcp", name);
  1111. else
  1112. /* override PROTO_UNDEF */
  1113. real_proto = IPPROTO_UDP;
  1114. }
  1115. if (proto == Q_TCP) {
  1116. if (real_proto == IPPROTO_UDP)
  1117. bpf_error("port '%s' is udp", name);
  1118. else
  1119. /* override PROTO_UNDEF */
  1120. real_proto = IPPROTO_TCP;
  1121. }
  1122. return gen_port(port, real_proto, dir);
  1123. case Q_GATEWAY:
  1124. eaddr = pcap_ether_hostton(name);
  1125. if (eaddr == NULL)
  1126. bpf_error("unknown ether host: %s", name);
  1127. alist = pcap_nametoaddr(name);
  1128. if (alist == NULL || *alist == NULL)
  1129. bpf_error("unknown host '%s'", name);
  1130. return gen_gateway(eaddr, alist, proto, dir);
  1131. case Q_PROTO:
  1132. real_proto = lookup_proto(name, proto);
  1133. if (real_proto >= 0)
  1134. return gen_proto(real_proto, proto, dir);
  1135. else
  1136. bpf_error("unknown protocol: %s", name);
  1137. case Q_UNDEF:
  1138. syntax();
  1139. /* NOTREACHED */
  1140. }
  1141. abort();
  1142. /* NOTREACHED */
  1143. }
  1144. struct block *
  1145. gen_mcode(s1, s2, masklen, q)
  1146. register const char *s1, *s2;
  1147. register int masklen;
  1148. struct qual q;
  1149. {
  1150. register int nlen, mlen;
  1151. bpf_u_int32 n, m;
  1152. nlen = __pcap_atoin(s1, &n);
  1153. /* Promote short ipaddr */
  1154. n <<= 32 - nlen;
  1155. if (s2 != NULL) {
  1156. mlen = __pcap_atoin(s2, &m);
  1157. /* Promote short ipaddr */
  1158. m <<= 32 - mlen;
  1159. if ((n & ~m) != 0)
  1160. bpf_error("non-network bits set in "%s mask %s"",
  1161.     s1, s2);
  1162. } else {
  1163. /* Convert mask len to mask */
  1164. if (masklen > 32)
  1165. bpf_error("mask length must be <= 32");
  1166. m = 0xffffffff << (32 - masklen);
  1167. if ((n & ~m) != 0)
  1168. bpf_error("non-network bits set in "%s/%d"",
  1169.     s1, masklen);
  1170. }
  1171. switch (q.addr) {
  1172. case Q_NET:
  1173. return gen_host(n, m, q.proto, q.dir);
  1174. default:
  1175. bpf_error("Mask syntax for networks only");
  1176. /* NOTREACHED */
  1177. }
  1178. }
  1179. struct block *
  1180. gen_ncode(s, v, q)
  1181. register const char *s;
  1182. bpf_u_int32 v;
  1183. struct qual q;
  1184. {
  1185. bpf_u_int32 mask;
  1186. int proto = q.proto;
  1187. int dir = q.dir;
  1188. register int vlen;
  1189. if (s == NULL)
  1190. vlen = 32;
  1191. else if (q.proto == Q_DECNET)
  1192. vlen = __pcap_atodn(s, &v);
  1193. else
  1194. vlen = __pcap_atoin(s, &v);
  1195. switch (q.addr) {
  1196. case Q_DEFAULT:
  1197. case Q_HOST:
  1198. case Q_NET:
  1199. if (proto == Q_DECNET)
  1200. return gen_host(v, 0, proto, dir);
  1201. else if (proto == Q_LINK) {
  1202. bpf_error("illegal link layer address");
  1203. } else {
  1204. mask = 0xffffffff;
  1205. if (s == NULL && q.addr == Q_NET) {
  1206. /* Promote short net number */
  1207. while (v && (v & 0xff000000) == 0) {
  1208. v <<= 8;
  1209. mask <<= 8;
  1210. }
  1211. } else {
  1212. /* Promote short ipaddr */
  1213. v <<= 32 - vlen;
  1214. mask <<= 32 - vlen;
  1215. }
  1216. return gen_host(v, mask, proto, dir);
  1217. }
  1218. case Q_PORT:
  1219. if (proto == Q_UDP)
  1220. proto = IPPROTO_UDP;
  1221. else if (proto == Q_TCP)
  1222. proto = IPPROTO_TCP;
  1223. else if (proto == Q_DEFAULT)
  1224. proto = PROTO_UNDEF;
  1225. else
  1226. bpf_error("illegal qualifier of 'port'");
  1227. return gen_port((int)v, proto, dir);
  1228. case Q_GATEWAY:
  1229. bpf_error("'gateway' requires a name");
  1230. /* NOTREACHED */
  1231. case Q_PROTO:
  1232. return gen_proto((int)v, proto, dir);
  1233. case Q_UNDEF:
  1234. syntax();
  1235. /* NOTREACHED */
  1236. default:
  1237. abort();
  1238. /* NOTREACHED */
  1239. }
  1240. /* NOTREACHED */
  1241. }
  1242. struct block *
  1243. gen_ecode(eaddr, q)
  1244. register const u_char *eaddr;
  1245. struct qual q;
  1246. {
  1247. if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
  1248. if (linktype == DLT_EN10MB)
  1249. return gen_ehostop(eaddr, (int)q.dir);
  1250. if (linktype == DLT_FDDI)
  1251. return gen_fhostop(eaddr, (int)q.dir);
  1252. }
  1253. bpf_error("ethernet address used in non-ether expression");
  1254. /* NOTREACHED */
  1255. }
  1256. void
  1257. sappend(s0, s1)
  1258. struct slist *s0, *s1;
  1259. {
  1260. /*
  1261.  * This is definitely not the best way to do this, but the
  1262.  * lists will rarely get long.
  1263.  */
  1264. while (s0->next)
  1265. s0 = s0->next;
  1266. s0->next = s1;
  1267. }
  1268. static struct slist *
  1269. xfer_to_x(a)
  1270. struct arth *a;
  1271. {
  1272. struct slist *s;
  1273. s = new_stmt(BPF_LDX|BPF_MEM);
  1274. s->s.k = a->regno;
  1275. return s;
  1276. }
  1277. static struct slist *
  1278. xfer_to_a(a)
  1279. struct arth *a;
  1280. {
  1281. struct slist *s;
  1282. s = new_stmt(BPF_LD|BPF_MEM);
  1283. s->s.k = a->regno;
  1284. return s;
  1285. }
  1286. struct arth *
  1287. gen_load(proto, index, size)
  1288. int proto;
  1289. struct arth *index;
  1290. int size;
  1291. {
  1292. struct slist *s, *tmp;
  1293. struct block *b;
  1294. int regno = alloc_reg();
  1295. free_reg(index->regno);
  1296. switch (size) {
  1297. default:
  1298. bpf_error("data size must be 1, 2, or 4");
  1299. case 1:
  1300. size = BPF_B;
  1301. break;
  1302. case 2:
  1303. size = BPF_H;
  1304. break;
  1305. case 4:
  1306. size = BPF_W;
  1307. break;
  1308. }
  1309. switch (proto) {
  1310. default:
  1311. bpf_error("unsupported index operation");
  1312. case Q_LINK:
  1313. s = xfer_to_x(index);
  1314. tmp = new_stmt(BPF_LD|BPF_IND|size);
  1315. sappend(s, tmp);
  1316. sappend(index->s, s);
  1317. break;
  1318. case Q_IP:
  1319. case Q_ARP:
  1320. case Q_RARP:
  1321. case Q_ATALK:
  1322. case Q_DECNET:
  1323. case Q_SCA:
  1324. case Q_LAT:
  1325. case Q_MOPRC:
  1326. case Q_MOPDL:
  1327. /* XXX Note that we assume a fixed link link header here. */
  1328. s = xfer_to_x(index);
  1329. tmp = new_stmt(BPF_LD|BPF_IND|size);
  1330. tmp->s.k = off_nl;
  1331. sappend(s, tmp);
  1332. sappend(index->s, s);
  1333. b = gen_proto_abbrev(proto);
  1334. if (index->b)
  1335. gen_and(index->b, b);
  1336. index->b = b;
  1337. break;
  1338. case Q_TCP:
  1339. case Q_UDP:
  1340. case Q_ICMP:
  1341. case Q_IGMP:
  1342. case Q_IGRP:
  1343. s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
  1344. s->s.k = off_nl;
  1345. sappend(s, xfer_to_a(index));
  1346. sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
  1347. sappend(s, new_stmt(BPF_MISC|BPF_TAX));
  1348. sappend(s, tmp = new_stmt(BPF_LD|BPF_IND|size));
  1349. tmp->s.k = off_nl;
  1350. sappend(index->s, s);
  1351. gen_and(gen_proto_abbrev(proto), b = gen_ipfrag());
  1352. if (index->b)
  1353. gen_and(index->b, b);
  1354. index->b = b;
  1355. break;
  1356. }
  1357. index->regno = regno;
  1358. s = new_stmt(BPF_ST);
  1359. s->s.k = regno;
  1360. sappend(index->s, s);
  1361. return index;
  1362. }
  1363. struct block *
  1364. gen_relation(code, a0, a1, reversed)
  1365. int code;
  1366. struct arth *a0, *a1;
  1367. int reversed;
  1368. {
  1369. struct slist *s0, *s1, *s2;
  1370. struct block *b, *tmp;
  1371. s0 = xfer_to_x(a1);
  1372. s1 = xfer_to_a(a0);
  1373. s2 = new_stmt(BPF_ALU|BPF_SUB|BPF_X);
  1374. b = new_block(JMP(code));
  1375. if (code == BPF_JGT || code == BPF_JGE) {
  1376. reversed = !reversed;
  1377. b->s.k = 0x80000000;
  1378. }
  1379. if (reversed)
  1380. gen_not(b);
  1381. sappend(s1, s2);
  1382. sappend(s0, s1);
  1383. sappend(a1->s, s0);
  1384. sappend(a0->s, a1->s);
  1385. b->stmts = a0->s;
  1386. free_reg(a0->regno);
  1387. free_reg(a1->regno);
  1388. /* 'and' together protocol checks */
  1389. if (a0->b) {
  1390. if (a1->b) {
  1391. gen_and(a0->b, tmp = a1->b);
  1392. }
  1393. else
  1394. tmp = a0->b;
  1395. } else
  1396. tmp = a1->b;
  1397. if (tmp)
  1398. gen_and(tmp, b);
  1399. return b;
  1400. }
  1401. struct arth *
  1402. gen_loadlen()
  1403. {
  1404. int regno = alloc_reg();
  1405. struct arth *a = (struct arth *)newchunk(sizeof(*a));
  1406. struct slist *s;
  1407. s = new_stmt(BPF_LD|BPF_LEN);
  1408. s->next = new_stmt(BPF_ST);
  1409. s->next->s.k = regno;
  1410. a->s = s;
  1411. a->regno = regno;
  1412. return a;
  1413. }
  1414. struct arth *
  1415. gen_loadi(val)
  1416. int val;
  1417. {
  1418. struct arth *a;
  1419. struct slist *s;
  1420. int reg;
  1421. a = (struct arth *)newchunk(sizeof(*a));
  1422. reg = alloc_reg();
  1423. s = new_stmt(BPF_LD|BPF_IMM);
  1424. s->s.k = val;
  1425. s->next = new_stmt(BPF_ST);
  1426. s->next->s.k = reg;
  1427. a->s = s;
  1428. a->regno = reg;
  1429. return a;
  1430. }
  1431. struct arth *
  1432. gen_neg(a)
  1433. struct arth *a;
  1434. {
  1435. struct slist *s;
  1436. s = xfer_to_a(a);
  1437. sappend(a->s, s);
  1438. s = new_stmt(BPF_ALU|BPF_NEG);
  1439. s->s.k = 0;
  1440. sappend(a->s, s);
  1441. s = new_stmt(BPF_ST);
  1442. s->s.k = a->regno;
  1443. sappend(a->s, s);
  1444. return a;
  1445. }
  1446. struct arth *
  1447. gen_arth(code, a0, a1)
  1448. int code;
  1449. struct arth *a0, *a1;
  1450. {
  1451. struct slist *s0, *s1, *s2;
  1452. s0 = xfer_to_x(a1);
  1453. s1 = xfer_to_a(a0);
  1454. s2 = new_stmt(BPF_ALU|BPF_X|code);
  1455. sappend(s1, s2);
  1456. sappend(s0, s1);
  1457. sappend(a1->s, s0);
  1458. sappend(a0->s, a1->s);
  1459. free_reg(a1->regno);
  1460. s0 = new_stmt(BPF_ST);
  1461. a0->regno = s0->s.k = alloc_reg();
  1462. sappend(a0->s, s0);
  1463. return a0;
  1464. }
  1465. /*
  1466.  * Here we handle simple allocation of the scratch registers.
  1467.  * If too many registers are alloc'd, the allocator punts.
  1468.  */
  1469. static int regused[BPF_MEMWORDS];
  1470. static int curreg;
  1471. /*
  1472.  * Return the next free register.
  1473.  */
  1474. static int
  1475. alloc_reg()
  1476. {
  1477. int n = BPF_MEMWORDS;
  1478. while (--n >= 0) {
  1479. if (regused[curreg])
  1480. curreg = (curreg + 1) % BPF_MEMWORDS;
  1481. else {
  1482. regused[curreg] = 1;
  1483. return curreg;
  1484. }
  1485. }
  1486. bpf_error("too many registers needed to evaluate expression");
  1487. /* NOTREACHED */
  1488. }
  1489. /*
  1490.  * Return a register to the table so it can
  1491.  * be used later.
  1492.  */
  1493. static void
  1494. free_reg(n)
  1495. int n;
  1496. {
  1497. regused[n] = 0;
  1498. }
  1499. static struct block *
  1500. gen_len(jmp, n)
  1501. int jmp, n;
  1502. {
  1503. struct slist *s;
  1504. struct block *b;
  1505. s = new_stmt(BPF_LD|BPF_LEN);
  1506. b = new_block(JMP(jmp));
  1507. b->stmts = s;
  1508. b->s.k = n;
  1509. return b;
  1510. }
  1511. struct block *
  1512. gen_greater(n)
  1513. int n;
  1514. {
  1515. return gen_len(BPF_JGE, n);
  1516. }
  1517. struct block *
  1518. gen_less(n)
  1519. int n;
  1520. {
  1521. struct block *b;
  1522. b = gen_len(BPF_JGT, n);
  1523. gen_not(b);
  1524. return b;
  1525. }
  1526. struct block *
  1527. gen_byteop(op, idx, val)
  1528. int op, idx, val;
  1529. {
  1530. struct block *b;
  1531. struct slist *s;
  1532. switch (op) {
  1533. default:
  1534. abort();
  1535. case '=':
  1536. return gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
  1537. case '<':
  1538. b = gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
  1539. b->s.code = JMP(BPF_JGE);
  1540. gen_not(b);
  1541. return b;
  1542. case '>':
  1543. b = gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
  1544. b->s.code = JMP(BPF_JGT);
  1545. return b;
  1546. case '|':
  1547. s = new_stmt(BPF_ALU|BPF_OR|BPF_K);
  1548. break;
  1549. case '&':
  1550. s = new_stmt(BPF_ALU|BPF_AND|BPF_K);
  1551. break;
  1552. }
  1553. s->s.k = val;
  1554. b = new_block(JMP(BPF_JEQ));
  1555. b->stmts = s;
  1556. gen_not(b);
  1557. return b;
  1558. }
  1559. struct block *
  1560. gen_broadcast(proto)
  1561. int proto;
  1562. {
  1563. bpf_u_int32 hostmask;
  1564. struct block *b0, *b1, *b2;
  1565. static u_char ebroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  1566. switch (proto) {
  1567. case Q_DEFAULT:
  1568. case Q_LINK:
  1569. if (linktype == DLT_EN10MB)
  1570. return gen_ehostop(ebroadcast, Q_DST);
  1571. if (linktype == DLT_FDDI)
  1572. return gen_fhostop(ebroadcast, Q_DST);
  1573. bpf_error("not a broadcast link");
  1574. break;
  1575. case Q_IP:
  1576. b0 = gen_linktype(ETHERTYPE_IP);
  1577. hostmask = ~netmask;
  1578. b1 = gen_mcmp(off_nl + 16, BPF_W, (bpf_int32)0, hostmask);
  1579. b2 = gen_mcmp(off_nl + 16, BPF_W,
  1580.       (bpf_int32)(~0 & hostmask), hostmask);
  1581. gen_or(b1, b2);
  1582. gen_and(b0, b2);
  1583. return b2;
  1584. }
  1585. bpf_error("only ether/ip broadcast filters supported");
  1586. }
  1587. struct block *
  1588. gen_multicast(proto)
  1589. int proto;
  1590. {
  1591. register struct block *b0, *b1;
  1592. register struct slist *s;
  1593. switch (proto) {
  1594. case Q_DEFAULT:
  1595. case Q_LINK:
  1596. if (linktype == DLT_EN10MB) {
  1597. /* ether[0] & 1 != 0 */
  1598. s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
  1599. s->s.k = 0;
  1600. b0 = new_block(JMP(BPF_JSET));
  1601. b0->s.k = 1;
  1602. b0->stmts = s;
  1603. return b0;
  1604. }
  1605. if (linktype == DLT_FDDI) {
  1606. /* XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX */
  1607. /* fddi[1] & 1 != 0 */
  1608. s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
  1609. s->s.k = 1;
  1610. b0 = new_block(JMP(BPF_JSET));
  1611. b0->s.k = 1;
  1612. b0->stmts = s;
  1613. return b0;
  1614. }
  1615. /* Link not known to support multicasts */
  1616. break;
  1617. case Q_IP:
  1618. b0 = gen_linktype(ETHERTYPE_IP);
  1619. b1 = gen_cmp(off_nl + 16, BPF_B, (bpf_int32)224);
  1620. b1->s.code = JMP(BPF_JGE);
  1621. gen_and(b0, b1);
  1622. return b1;
  1623. }
  1624. bpf_error("only IP multicast filters supported on ethernet/FDDI");
  1625. }
  1626. /*
  1627.  * generate command for inbound/outbound.  It's here so we can
  1628.  * make it link-type specific.  'dir' = 0 implies "inbound",
  1629.  * = 1 implies "outbound".
  1630.  */
  1631. struct block *
  1632. gen_inbound(dir)
  1633. int dir;
  1634. {
  1635. register struct block *b0;
  1636. b0 = gen_relation(BPF_JEQ,
  1637.   gen_load(Q_LINK, gen_loadi(0), 1),
  1638.   gen_loadi(0),
  1639.   dir);
  1640. return (b0);
  1641. }