3 * Copyright (C) 1997-1998 by Darren Reed.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that this notice is preserved and due credit is given
7 * to the original author and the contributors.
9 * $Id: iplang_y.y,v 2.2.2.3 2002/12/06 11:41:14 darrenr Exp $
12 #if defined(__sgi) && (IRIX > 602)
13 # include <sys/ptimers.h>
18 #if !defined(__SVR4) && !defined(__svr4__)
21 #include <sys/byteorder.h>
23 #include <sys/types.h>
25 #include <sys/param.h>
30 #include <sys/socket.h>
31 #include <netinet/in.h>
32 #include <netinet/in_systm.h>
33 #include <netinet/ip.h>
34 #include <netinet/ip_icmp.h>
36 #include <netinet/ip_var.h>
38 #include <netinet/tcp.h>
39 #include <netinet/udp.h>
42 #include <netinet/if_ether.h>
45 #include <arpa/nameser.h>
46 #include <arpa/inet.h>
50 #include "ip_compat.h"
54 #if !defined(__NetBSD__) && (!defined(__FreeBSD_version) && \
55 __FreeBSD_version
< 400020 ) && SOLARIS2
< 10
56 extern
struct ether_addr
*ether_aton __P
((char *));
60 extern
struct ipopt_names ionames
[];
61 extern
int state
, state
, lineNum
, token
;
65 int yylex __P
((void));
67 #if !defined(ultrix) && !defined(hpux)
73 iface_t
*iflist
= NULL
, **iftail
= &iflist
;
75 arp_t
*arplist
= NULL
, **arptail
= &arplist
, *carp
= NULL
;
76 struct in_addr defrouter
;
79 u_short c_chksum __P
((u_short
*, u_int
, u_long
));
80 u_long p_chksum __P
((u_short
*, u_int
));
82 u_long ipbuffer
[67584/sizeof
(u_long
)]; /* 66K */
83 aniphdr_t
*aniphead
= NULL
, *canip
= NULL
, **aniptail
= &aniphead
;
87 icmphdr_t
*icmp
= NULL
;
94 struct in_addr getipv4addr __P
((char *arg
));
95 u_short getportnum __P
((char *, char *));
96 struct ether_addr
*geteaddr __P
((char *, struct ether_addr
*));
97 void *new_header __P
((int));
98 void free_aniplist __P
((void));
99 void inc_anipheaders __P
((int));
100 void new_data __P
((void));
101 void set_datalen __P
((char **));
102 void set_datafile __P
((char **));
103 void set_data __P
((char **));
104 void new_packet __P
((void));
105 void set_ipv4proto __P
((char **));
106 void set_ipv4src __P
((char **));
107 void set_ipv4dst __P
((char **));
108 void set_ipv4off __P
((char **));
109 void set_ipv4v __P
((char **));
110 void set_ipv4hl __P
((char **));
111 void set_ipv4ttl __P
((char **));
112 void set_ipv4tos __P
((char **));
113 void set_ipv4id __P
((char **));
114 void set_ipv4sum __P
((char **));
115 void set_ipv4len __P
((char **));
116 void new_tcpheader __P
((void));
117 void set_tcpsport __P
((char **));
118 void set_tcpdport __P
((char **));
119 void set_tcpseq __P
((char **));
120 void set_tcpack __P
((char **));
121 void set_tcpoff __P
((char **));
122 void set_tcpurp __P
((char **));
123 void set_tcpwin __P
((char **));
124 void set_tcpsum __P
((char **));
125 void set_tcpflags __P
((char **));
126 void set_tcpopt __P
((int, char **));
127 void end_tcpopt __P
((void));
128 void new_udpheader __P
((void));
129 void set_udplen __P
((char **));
130 void set_udpsum __P
((char **));
131 void prep_packet __P
((void));
132 void packet_done __P
((void));
133 void new_interface __P
((void));
134 void check_interface __P
((void));
135 void set_ifname __P
((char **));
136 void set_ifmtu __P
((int));
137 void set_ifv4addr __P
((char **));
138 void set_ifeaddr __P
((char **));
139 void new_arp __P
((void));
140 void set_arpeaddr __P
((char **));
141 void set_arpv4addr __P
((char **));
142 void reset_send __P
((void));
143 void set_sendif __P
((char **));
144 void set_sendvia __P
((char **));
145 void set_defaultrouter __P
((char **));
146 void new_icmpheader __P
((void));
147 void set_icmpcode __P
((int));
148 void set_icmptype __P
((int));
149 void set_icmpcodetok __P
((char **));
150 void set_icmptypetok __P
((char **));
151 void set_icmpid __P
((int));
152 void set_icmpseq __P
((int));
153 void set_icmpotime __P
((int));
154 void set_icmprtime __P
((int));
155 void set_icmpttime __P
((int));
156 void set_icmpmtu __P
((int));
157 void set_redir __P
((int, char **));
158 void new_ipv4opt __P
((void));
159 void set_icmppprob __P
((int));
160 void add_ipopt __P
((int, void *));
161 void end_ipopt __P
((void));
162 void set_secclass __P
((char **));
163 void free_anipheader __P
((void));
164 void end_ipv4 __P
((void));
165 void end_icmp __P
((void));
166 void end_udp __P
((void));
167 void end_tcp __P
((void));
168 void end_data __P
((void));
169 void yyerror __P
((char *));
170 void iplang __P
((FILE *));
171 int arp_getipv4 __P
((char *, char *));
172 int yyparse __P
((void));
178 %token
<num
> IL_NUMBER
179 %type
<num
> number digits optnumber
180 %token
<str
> IL_TOKEN
181 %type
<str
> token optoken
182 %token IL_HEXDIGIT IL_COLON IL_DOT IL_EOF IL_COMMENT
183 %token IL_INTERFACE IL_IFNAME IL_MTU IL_EADDR
184 %token IL_IPV4 IL_V4PROTO IL_V4SRC IL_V4DST IL_V4OFF IL_V4V IL_V4HL IL_V4TTL
185 %token IL_V4TOS IL_V4SUM IL_V4LEN IL_V4OPT IL_V4ID
186 %token IL_TCP IL_SPORT IL_DPORT IL_TCPFL IL_TCPSEQ IL_TCPACK IL_TCPOFF
187 %token IL_TCPWIN IL_TCPSUM IL_TCPURP IL_TCPOPT IL_TCPO_NOP IL_TCPO_EOL
188 %token IL_TCPO_MSS IL_TCPO_WSCALE IL_TCPO_TS
189 %token IL_UDP IL_UDPLEN IL_UDPSUM
190 %token IL_ICMP IL_ICMPTYPE IL_ICMPCODE
191 %token IL_SEND IL_VIA
194 %token IL_SUM IL_OFF IL_LEN IL_V4ADDR IL_OPT
195 %token IL_DATA IL_DLEN IL_DVALUE IL_DFILE
196 %token IL_IPO_NOP IL_IPO_RR IL_IPO_ZSU IL_IPO_MTUP IL_IPO_MTUR IL_IPO_EOL
197 %token IL_IPO_TS IL_IPO_TR IL_IPO_SEC IL_IPO_LSRR IL_IPO_ESEC
198 %token IL_IPO_SATID IL_IPO_SSRR IL_IPO_ADDEXT IL_IPO_VISA IL_IPO_IMITD
199 %token IL_IPO_EIP IL_IPO_FINN IL_IPO_SECCLASS IL_IPO_CIPSO IL_IPO_ENCODE
200 %token
<str
> IL_IPS_RESERV4 IL_IPS_TOPSECRET IL_IPS_SECRET IL_IPS_RESERV3
201 %token
<str
> IL_IPS_CONFID IL_IPS_UNCLASS IL_IPS_RESERV2 IL_IPS_RESERV1
202 %token IL_ICMP_ECHOREPLY IL_ICMP_UNREACH IL_ICMP_UNREACH_NET
203 %token IL_ICMP_UNREACH_HOST IL_ICMP_UNREACH_PROTOCOL IL_ICMP_UNREACH_PORT
204 %token IL_ICMP_UNREACH_NEEDFRAG IL_ICMP_UNREACH_SRCFAIL
205 %token IL_ICMP_UNREACH_NET_UNKNOWN IL_ICMP_UNREACH_HOST_UNKNOWN
206 %token IL_ICMP_UNREACH_ISOLATED IL_ICMP_UNREACH_NET_PROHIB
207 %token IL_ICMP_UNREACH_HOST_PROHIB IL_ICMP_UNREACH_TOSNET
208 %token IL_ICMP_UNREACH_TOSHOST IL_ICMP_UNREACH_FILTER_PROHIB
209 %token IL_ICMP_UNREACH_HOST_PRECEDENCE IL_ICMP_UNREACH_PRECEDENCE_CUTOFF
210 %token IL_ICMP_SOURCEQUENCH IL_ICMP_REDIRECT IL_ICMP_REDIRECT_NET
211 %token IL_ICMP_REDIRECT_HOST IL_ICMP_REDIRECT_TOSNET
212 %token IL_ICMP_REDIRECT_TOSHOST IL_ICMP_ECHO IL_ICMP_ROUTERADVERT
213 %token IL_ICMP_ROUTERSOLICIT IL_ICMP_TIMXCEED IL_ICMP_TIMXCEED_INTRANS
214 %token IL_ICMP_TIMXCEED_REASS IL_ICMP_PARAMPROB IL_ICMP_PARAMPROB_OPTABSENT
215 %token IL_ICMP_TSTAMP IL_ICMP_TSTAMPREPLY IL_ICMP_IREQ IL_ICMP_IREQREPLY
216 %token IL_ICMP_MASKREQ IL_ICMP_MASKREPLY IL_ICMP_SEQ IL_ICMP_ID
217 %token IL_ICMP_OTIME IL_ICMP_RTIME IL_ICMP_TTIME
233 iface: ifhdr
'{' ifaceopts
'}' ';' { check_interface
(); }
236 ifhdr: IL_INTERFACE
{ new_interface
(); }
245 IL_IFNAME token
{ set_ifname
(&$2); }
246 | IL_MTU number
{ set_ifmtu
($2); }
247 | IL_V4ADDR token
{ set_ifv4addr
(&$2); }
248 | IL_EADDR token
{ set_ifeaddr
(&$2); }
251 send: sendhdr
'{' sendbody
'}' ';' { packet_done
(); }
252 | sendhdr
';' { packet_done
(); }
256 IL_SEND
{ reset_send
(); }
265 IL_IFNAME token
{ set_sendif
(&$2); }
266 | IL_VIA token
{ set_sendvia
(&$2); }
269 arp: arphdr
'{' arpbody
'}' ';'
272 arphdr: IL_ARP
{ new_arp
(); }
280 arpopt: IL_V4ADDR token
{ set_arpv4addr
(&$2); }
281 | IL_EADDR token
{ set_arpeaddr
(&$2); }
285 IL_DEFROUTER token
{ set_defaultrouter
(&$2); }
296 ipline: ipv4
'{' ipv4body
'}' ';' { end_ipv4
(); }
299 ipv4: IL_IPV4
{ new_packet
(); }
308 IL_V4PROTO token
{ set_ipv4proto
(&$2); }
309 | IL_V4SRC token
{ set_ipv4src
(&$2); }
310 | IL_V4DST token
{ set_ipv4dst
(&$2); }
311 | IL_V4OFF token
{ set_ipv4off
(&$2); }
312 | IL_V4V token
{ set_ipv4v
(&$2); }
313 | IL_V4HL token
{ set_ipv4hl
(&$2); }
314 | IL_V4ID token
{ set_ipv4id
(&$2); }
315 | IL_V4TTL token
{ set_ipv4ttl
(&$2); }
316 | IL_V4TOS token
{ set_ipv4tos
(&$2); }
317 | IL_V4SUM token
{ set_ipv4sum
(&$2); }
318 | IL_V4LEN token
{ set_ipv4len
(&$2); }
319 | ipv4opt
'{' ipv4optlist
'}' ';' { end_ipopt
(); }
322 tcp: IL_TCP
{ new_tcpheader
(); }
326 '{' tcpheader
'}' ';' { end_tcp
(); }
336 IL_SPORT token
{ set_tcpsport
(&$2); }
337 | IL_DPORT token
{ set_tcpdport
(&$2); }
338 | IL_TCPSEQ token
{ set_tcpseq
(&$2); }
339 | IL_TCPACK token
{ set_tcpack
(&$2); }
340 | IL_TCPOFF token
{ set_tcpoff
(&$2); }
341 | IL_TCPURP token
{ set_tcpurp
(&$2); }
342 | IL_TCPWIN token
{ set_tcpwin
(&$2); }
343 | IL_TCPSUM token
{ set_tcpsum
(&$2); }
344 | IL_TCPFL token
{ set_tcpflags
(&$2); }
345 | IL_TCPOPT
'{' tcpopts
'}' ';' { end_tcpopt
(); }
352 tcpopt: IL_TCPO_NOP
';' { set_tcpopt
(IL_TCPO_NOP
, NULL
); }
353 | IL_TCPO_EOL
';' { set_tcpopt
(IL_TCPO_EOL
, NULL
); }
354 | IL_TCPO_MSS optoken
{ set_tcpopt
(IL_TCPO_MSS
,&$2);}
355 | IL_TCPO_WSCALE optoken
{ set_tcpopt
(IL_TCPO_WSCALE
,&$2);}
356 | IL_TCPO_TS optoken
{ set_tcpopt
(IL_TCPO_TS
, &$2);}
359 udp: IL_UDP
{ new_udpheader
(); }
363 '{' udpheader
'}' ';' { end_udp
(); }
374 IL_SPORT token
{ set_tcpsport
(&$2); }
375 | IL_DPORT token
{ set_tcpdport
(&$2); }
376 | IL_UDPLEN token
{ set_udplen
(&$2); }
377 | IL_UDPSUM token
{ set_udpsum
(&$2); }
380 icmp: IL_ICMP
{ new_icmpheader
(); }
384 '{' icmpbody
'}' ';' { end_icmp
(); }
389 | icmpheader bodyline
394 | IL_ICMPTYPE icmptype icmpcode
398 IL_ICMPCODE token
{ set_icmpcodetok
(&$2); }
402 IL_ICMP_ECHOREPLY
';' { set_icmptype
(ICMP_ECHOREPLY
); }
403 | IL_ICMP_ECHOREPLY
'{' icmpechoopts
'}' ';'
405 | IL_ICMP_SOURCEQUENCH
';' { set_icmptype
(ICMP_SOURCEQUENCH
); }
407 | IL_ICMP_ROUTERADVERT
';' { set_icmptype
(ICMP_ROUTERADVERT
); }
408 | IL_ICMP_ROUTERSOLICIT
';' { set_icmptype
(ICMP_ROUTERSOLICIT
); }
409 | IL_ICMP_ECHO
';' { set_icmptype
(ICMP_ECHO
); }
410 | IL_ICMP_ECHO
'{' icmpechoopts
'}' ';'
411 | IL_ICMP_TIMXCEED
';' { set_icmptype
(ICMP_TIMXCEED
); }
412 | IL_ICMP_TIMXCEED
'{' exceed
'}' ';'
413 | IL_ICMP_TSTAMP
';' { set_icmptype
(ICMP_TSTAMP
); }
414 | IL_ICMP_TSTAMPREPLY
';' { set_icmptype
(ICMP_TSTAMPREPLY
); }
415 | IL_ICMP_TSTAMPREPLY
'{' icmptsopts
'}' ';'
416 | IL_ICMP_IREQ
';' { set_icmptype
(ICMP_IREQ
); }
417 | IL_ICMP_IREQREPLY
';' { set_icmptype
(ICMP_IREQREPLY
); }
418 | IL_ICMP_IREQREPLY
'{' data dataline
'}' ';'
419 | IL_ICMP_MASKREQ
';' { set_icmptype
(ICMP_MASKREQ
); }
420 | IL_ICMP_MASKREPLY
';' { set_icmptype
(ICMP_MASKREPLY
); }
421 | IL_ICMP_MASKREPLY
'{' token
'}' ';'
422 | IL_ICMP_PARAMPROB
';' { set_icmptype
(ICMP_PARAMPROB
); }
423 | IL_ICMP_PARAMPROB
'{' paramprob
'}' ';'
424 | IL_TOKEN
';' { set_icmptypetok
(&$1); }
428 | icmpechoopts icmpecho
432 IL_ICMP_SEQ number
{ set_icmpseq
($2); }
433 | IL_ICMP_ID number
{ set_icmpid
($2); }
437 | icmptsopts icmpts
';'
440 icmpts: IL_ICMP_OTIME number
{ set_icmpotime
($2); }
441 | IL_ICMP_RTIME number
{ set_icmprtime
($2); }
442 | IL_ICMP_TTIME number
{ set_icmpttime
($2); }
447 | IL_ICMP_UNREACH
'{' unreachopts
'}' ';'
451 IL_ICMP_UNREACH_NET line
452 | IL_ICMP_UNREACH_HOST line
453 | IL_ICMP_UNREACH_PROTOCOL line
454 | IL_ICMP_UNREACH_PORT line
455 | IL_ICMP_UNREACH_NEEDFRAG number
';' { set_icmpmtu
($2); }
456 | IL_ICMP_UNREACH_SRCFAIL line
457 | IL_ICMP_UNREACH_NET_UNKNOWN line
458 | IL_ICMP_UNREACH_HOST_UNKNOWN line
459 | IL_ICMP_UNREACH_ISOLATED line
460 | IL_ICMP_UNREACH_NET_PROHIB line
461 | IL_ICMP_UNREACH_HOST_PROHIB line
462 | IL_ICMP_UNREACH_TOSNET line
463 | IL_ICMP_UNREACH_TOSHOST line
464 | IL_ICMP_UNREACH_FILTER_PROHIB line
465 | IL_ICMP_UNREACH_HOST_PRECEDENCE line
466 | IL_ICMP_UNREACH_PRECEDENCE_CUTOFF line
471 | IL_ICMP_REDIRECT
'{' redirectopts
'}' ';'
475 | IL_ICMP_REDIRECT_NET token
{ set_redir
(0, &$2); }
476 | IL_ICMP_REDIRECT_HOST token
{ set_redir
(1, &$2); }
477 | IL_ICMP_REDIRECT_TOSNET token
{ set_redir
(2, &$2); }
478 | IL_ICMP_REDIRECT_TOSHOST token
{ set_redir
(3, &$2); }
482 IL_ICMP_TIMXCEED_INTRANS line
483 | IL_ICMP_TIMXCEED_REASS line
487 IL_ICMP_PARAMPROB_OPTABSENT
488 | IL_ICMP_PARAMPROB_OPTABSENT paraprobarg
491 '{' number
'}' ';' { set_icmppprob
($2); }
494 ipv4opt: IL_V4OPT
{ new_ipv4opt
(); }
498 | ipv4opts ipv4optlist
502 IL_IPO_NOP
';' { add_ipopt
(IL_IPO_NOP
, NULL
); }
503 | IL_IPO_RR optnumber
{ add_ipopt
(IL_IPO_RR
, &$2); }
504 | IL_IPO_ZSU
';' { add_ipopt
(IL_IPO_ZSU
, NULL
); }
505 | IL_IPO_MTUP
';' { add_ipopt
(IL_IPO_MTUP
, NULL
); }
506 | IL_IPO_MTUR
';' { add_ipopt
(IL_IPO_MTUR
, NULL
); }
507 | IL_IPO_ENCODE
';' { add_ipopt
(IL_IPO_ENCODE
, NULL
); }
508 | IL_IPO_TS
';' { add_ipopt
(IL_IPO_TS
, NULL
); }
509 | IL_IPO_TR
';' { add_ipopt
(IL_IPO_TR
, NULL
); }
510 | IL_IPO_SEC
';' { add_ipopt
(IL_IPO_SEC
, NULL
); }
511 | IL_IPO_SECCLASS secclass
{ add_ipopt
(IL_IPO_SECCLASS
, sclass
); }
512 | IL_IPO_LSRR token
{ add_ipopt
(IL_IPO_LSRR
,&$2); }
513 | IL_IPO_ESEC
';' { add_ipopt
(IL_IPO_ESEC
, NULL
); }
514 | IL_IPO_CIPSO
';' { add_ipopt
(IL_IPO_CIPSO
, NULL
); }
515 | IL_IPO_SATID optnumber
{ add_ipopt
(IL_IPO_SATID
,&$2);}
516 | IL_IPO_SSRR token
{ add_ipopt
(IL_IPO_SSRR
,&$2); }
517 | IL_IPO_ADDEXT
';' { add_ipopt
(IL_IPO_ADDEXT
, NULL
); }
518 | IL_IPO_VISA
';' { add_ipopt
(IL_IPO_VISA
, NULL
); }
519 | IL_IPO_IMITD
';' { add_ipopt
(IL_IPO_IMITD
, NULL
); }
520 | IL_IPO_EIP
';' { add_ipopt
(IL_IPO_EIP
, NULL
); }
521 | IL_IPO_FINN
';' { add_ipopt
(IL_IPO_FINN
, NULL
); }
525 IL_IPS_RESERV4
';' { set_secclass
(&$1); }
526 | IL_IPS_TOPSECRET
';' { set_secclass
(&$1); }
527 | IL_IPS_SECRET
';' { set_secclass
(&$1); }
528 | IL_IPS_RESERV3
';' { set_secclass
(&$1); }
529 | IL_IPS_CONFID
';' { set_secclass
(&$1); }
530 | IL_IPS_UNCLASS
';' { set_secclass
(&$1); }
531 | IL_IPS_RESERV2
';' { set_secclass
(&$1); }
532 | IL_IPS_RESERV1
';' { set_secclass
(&$1); }
535 data: IL_DATA
{ new_data
(); }
539 '{' databody
'}' ';' { end_data
(); }
547 IL_DLEN token
{ set_datalen
(&$2); }
548 | IL_DVALUE token
{ set_data
(&$2); }
549 | IL_DFILE token
{ set_datafile
(&$2); }
555 optoken: ';' { $$
= ""; }
562 optnumber: ';' { $$
= 0; }
571 struct statetoopt toipopts
[] = {
572 { IL_IPO_NOP
, IPOPT_NOP
},
573 { IL_IPO_RR
, IPOPT_RR
},
574 { IL_IPO_ZSU
, IPOPT_ZSU
},
575 { IL_IPO_MTUP
, IPOPT_MTUP
},
576 { IL_IPO_MTUR
, IPOPT_MTUR
},
577 { IL_IPO_ENCODE
, IPOPT_ENCODE
},
578 { IL_IPO_TS
, IPOPT_TS
},
579 { IL_IPO_TR
, IPOPT_TR
},
580 { IL_IPO_SEC
, IPOPT_SECURITY
},
581 { IL_IPO_SECCLASS
, IPOPT_SECURITY
},
582 { IL_IPO_LSRR
, IPOPT_LSRR
},
583 { IL_IPO_ESEC
, IPOPT_E_SEC
},
584 { IL_IPO_CIPSO
, IPOPT_CIPSO
},
585 { IL_IPO_SATID
, IPOPT_SATID
},
586 { IL_IPO_SSRR
, IPOPT_SSRR
},
587 { IL_IPO_ADDEXT
, IPOPT_ADDEXT
},
588 { IL_IPO_VISA
, IPOPT_VISA
},
589 { IL_IPO_IMITD
, IPOPT_IMITD
},
590 { IL_IPO_EIP
, IPOPT_EIP
},
591 { IL_IPO_FINN
, IPOPT_FINN
},
595 struct statetoopt tosecopts
[] = {
596 { IL_IPS_RESERV4
, IPSO_CLASS_RES4
},
597 { IL_IPS_TOPSECRET
, IPSO_CLASS_TOPS
},
598 { IL_IPS_SECRET
, IPSO_CLASS_SECR
},
599 { IL_IPS_RESERV3
, IPSO_CLASS_RES3
},
600 { IL_IPS_CONFID
, IPSO_CLASS_CONF
},
601 { IL_IPS_UNCLASS
, IPSO_CLASS_UNCL
},
602 { IL_IPS_RESERV2
, IPSO_CLASS_RES2
},
603 { IL_IPS_RESERV1
, IPSO_CLASS_RES1
},
612 static struct ether_addr n
;
615 if
(sscanf
(s
, " %x:%x:%x:%x:%x:%x ", &i
[0], &i
[1],
616 &i
[2], &i
[3], &i
[4], &i
[5]) == 6) {
617 n.ether_addr_octet
[0] = (u_char
)i
[0];
618 n.ether_addr_octet
[1] = (u_char
)i
[1];
619 n.ether_addr_octet
[2] = (u_char
)i
[2];
620 n.ether_addr_octet
[3] = (u_char
)i
[3];
621 n.ether_addr_octet
[4] = (u_char
)i
[4];
622 n.ether_addr_octet
[5] = (u_char
)i
[5];
630 struct in_addr getipv4addr
(arg
)
636 in.s_addr
= 0xffffffff;
638 if
((hp
= gethostbyname
(arg
)))
639 bcopy
(hp
->h_addr
, &in.s_addr
, sizeof
(struct in_addr
));
641 in.s_addr
= inet_addr
(arg
);
646 u_short getportnum
(pr
, name
)
651 if
(!(sp
= getservbyname
(name
, pr
)))
652 return htons
(atoi
(name
));
657 struct ether_addr
*geteaddr
(arg
, buf
)
659 struct ether_addr
*buf
;
661 struct ether_addr
*e
;
663 #if !defined(hpux) && !defined(linux)
666 fprintf
(stderr
, "Invalid ethernet address: %s\n", arg
);
669 bcopy
(e
->octet
, buf
->octet
, sizeof
(e
->octet
));
671 bcopy
(e
->ether_addr_octet
, buf
->ether_addr_octet
,
672 sizeof
(e
->ether_addr_octet
));
681 void *new_header
(type
)
684 aniphdr_t
*aip
, *oip
= canip
;
687 aip
= (aniphdr_t
*)calloc
(1, sizeof
(*aip
));
689 aniptail
= &aip
->ah_next
;
694 if
(type
== IPPROTO_UDP
)
695 sz
= sizeof
(udphdr_t
);
696 else if
(type
== IPPROTO_TCP
)
697 sz
= sizeof
(tcphdr_t
);
698 else if
(type
== IPPROTO_ICMP
)
699 sz
= sizeof
(icmphdr_t
);
700 else if
(type
== IPPROTO_IP
)
704 canip
->ah_data
= oip
->ah_data
+ oip
->ah_len
;
706 canip
->ah_data
= (char *)ipbuffer
;
709 * Increase the size fields in all wrapping headers.
711 for
(aip
= aniphead
; aip
; aip
= aip
->ah_next
) {
713 if
(aip
->ah_p
== IPPROTO_IP
)
714 aip
->ah_ip
->ip_len
+= sz
;
715 else if
(aip
->ah_p
== IPPROTO_UDP
)
716 aip
->ah_udp
->uh_ulen
+= sz
;
718 return
(void *)canip
->ah_data
;
724 aniphdr_t
*aip
, **aipp
= &aniphead
;
726 while
((aip
= *aipp
)) {
727 *aipp
= aip
->ah_next
;
730 aniptail
= &aniphead
;
734 void inc_anipheaders
(inc
)
739 for
(aip
= aniphead
; aip
; aip
= aip
->ah_next
) {
741 if
(aip
->ah_p
== IPPROTO_IP
)
742 aip
->ah_ip
->ip_len
+= inc
;
743 else if
(aip
->ah_p
== IPPROTO_UDP
)
744 aip
->ah_udp
->uh_ulen
+= inc
;
751 (void) new_header
(-1);
756 void set_datalen
(arg
)
761 len
= strtol
(*arg
, NULL
, 0);
762 inc_anipheaders
(len
);
771 u_char
*s
= (u_char
*)*arg
, *t
= (u_char
*)canip
->ah_data
, c
;
772 int len
= 0, todo
= 0, quote
= 0, val
= 0;
779 fprintf
(stderr
, "octal with %c!\n", c
);
785 if
(!isdigit
(c
) ||
!todo
) {
786 *t
++ = (u_char
)(val
& 0xff);
796 fprintf
(stderr
, "octal with %c!\n", c
);
830 *t
++ = (u_char
)(val
& 0xff);
833 len
= t
- (u_char
*)canip
->ah_data
;
834 inc_anipheaders
(len
- canip
->ah_len
);
839 void set_datafile
(arg
)
846 if
((fd
= open
(file
, O_RDONLY
)) == -1) {
851 if
(fstat
(fd
, &sb
) == -1) {
856 if
((sb.st_size
+ aniphead
->ah_len
) > 65535) {
857 fprintf
(stderr
, "data file %s too big to include.\n", file
);
861 if
((len
= read
(fd
, canip
->ah_data
, sb.st_size
)) == -1) {
866 inc_anipheaders
(len
);
867 canip
->ah_len
+= len
;
874 static u_short id
= 0;
877 bzero
((char *)ipbuffer
, sizeof
(ipbuffer
));
879 ip
= (ip_t
*)new_header
(IPPROTO_IP
);
880 ip
->ip_v
= IPVERSION
;
881 ip
->ip_hl
= sizeof
(ip_t
) >> 2;
882 ip
->ip_len
= sizeof
(ip_t
);
884 ip
->ip_id
= htons
(id
++);
888 void set_ipv4proto
(arg
)
893 if
((pr
= getprotobyname
(*arg
)))
894 ip
->ip_p
= pr
->p_proto
;
896 if
(!(ip
->ip_p
= atoi
(*arg
)))
897 fprintf
(stderr
, "unknown protocol %s\n", *arg
);
903 void set_ipv4src
(arg
)
906 ip
->ip_src
= getipv4addr
(*arg
);
912 void set_ipv4dst
(arg
)
915 ip
->ip_dst
= getipv4addr
(*arg
);
921 void set_ipv4off
(arg
)
924 ip
->ip_off
= htons
(strtol
(*arg
, NULL
, 0));
933 ip
->ip_v
= strtol
(*arg
, NULL
, 0);
944 newhl
= strtol
(*arg
, NULL
, 0);
945 inc
= (newhl
- ip
->ip_hl
) << 2;
948 canip
->ah_len
+= inc
;
954 void set_ipv4ttl
(arg
)
957 ip
->ip_ttl
= strtol
(*arg
, NULL
, 0);
963 void set_ipv4tos
(arg
)
966 ip
->ip_tos
= strtol
(*arg
, NULL
, 0);
975 ip
->ip_id
= htons
(strtol
(*arg
, NULL
, 0));
981 void set_ipv4sum
(arg
)
984 ip
->ip_sum
= strtol
(*arg
, NULL
, 0);
990 void set_ipv4len
(arg
)
995 len
= strtol
(*arg
, NULL
, 0);
996 inc_anipheaders
(len
- ip
->ip_len
);
1003 void new_tcpheader
()
1006 if
((ip
->ip_p
) && (ip
->ip_p
!= IPPROTO_TCP
)) {
1007 fprintf
(stderr
, "protocol %d specified with TCP!\n", ip
->ip_p
);
1010 ip
->ip_p
= IPPROTO_TCP
;
1012 tcp
= (tcphdr_t
*)new_header
(IPPROTO_TCP
);
1013 tcp
->th_win
= htons
(4096);
1014 tcp
->th_off
= sizeof
(*tcp
) >> 2;
1018 void set_tcpsport
(arg
)
1024 if
(ip
->ip_p
== IPPROTO_UDP
) {
1025 port
= &udp
->uh_sport
;
1028 port
= &tcp
->th_sport
;
1032 *port
= getportnum
(pr
, *arg
);
1038 void set_tcpdport
(arg
)
1044 if
(ip
->ip_p
== IPPROTO_UDP
) {
1045 port
= &udp
->uh_dport
;
1048 port
= &tcp
->th_dport
;
1052 *port
= getportnum
(pr
, *arg
);
1058 void set_tcpseq
(arg
)
1061 tcp
->th_seq
= htonl
(strtol
(*arg
, NULL
, 0));
1067 void set_tcpack
(arg
)
1070 tcp
->th_ack
= htonl
(strtol
(*arg
, NULL
, 0));
1076 void set_tcpoff
(arg
)
1081 off
= strtol
(*arg
, NULL
, 0);
1082 inc_anipheaders
((off
- tcp
->th_off
) << 2);
1089 void set_tcpurp
(arg
)
1092 tcp
->th_urp
= htons
(strtol
(*arg
, NULL
, 0));
1098 void set_tcpwin
(arg
)
1101 tcp
->th_win
= htons
(strtol
(*arg
, NULL
, 0));
1107 void set_tcpsum
(arg
)
1110 tcp
->th_sum
= strtol
(*arg
, NULL
, 0);
1116 void set_tcpflags
(arg
)
1119 static char flags
[] = "ASURPF";
1120 static int flagv
[] = { TH_ACK
, TH_SYN
, TH_URG
, TH_RST
, TH_PUSH
,
1124 for
(s
= *arg
; *s
; s
++)
1125 if
(!(t
= strchr
(flags
, *s
))) {
1127 fprintf
(stderr
, "unknown TCP flag %c\n", *s
);
1130 tcp
->th_flags
= strtol
(*arg
, NULL
, 0);
1133 tcp
->th_flags |
= flagv
[t
- flags
];
1139 void set_tcpopt
(state
, arg
)
1144 int val
, len
, val2
, pad
, optval
;
1151 s
= (u_char
*)tcp
+ sizeof
(*tcp
) + canip
->ah_optlen
;
1166 case IL_TCPO_WSCALE
:
1182 * prepend padding - if required.
1185 for
(pad
= 4 - (len
& 3); pad
; pad
--) {
1192 *s
++ = (u_char
)optval
;
1195 if
(len
== 3) { /* 1 byte - char */
1197 } else if
(len
== 4) { /* 2 bytes - short */
1198 *s
++ = (u_char
)((val
>> 8) & 0xff);
1199 *s
++ = (u_char
)(val
& 0xff);
1200 } else if
(len
>= 6) { /* 4 bytes - long */
1202 bcopy
((char *)&val2
, s
, 4);
1207 *s
++ = (u_char
)optval
;
1209 canip
->ah_lastopt
= optval
;
1210 canip
->ah_optlen
+= len
;
1222 char *s
= (char *)tcp
;
1224 s
+= sizeof
(*tcp
) + canip
->ah_optlen
;
1226 * pad out so that we have a multiple of 4 bytes in size fo the
1227 * options. make sure last byte is EOL.
1229 if
(canip
->ah_optlen
& 3) {
1230 if
(canip
->ah_lastopt
!= 1) {
1231 for
(pad
= 3 - (canip
->ah_optlen
& 3); pad
; pad
--) {
1239 for
(pad
= 3 - (canip
->ah_optlen
& 3); pad
; pad
--) {
1246 tcp
->th_off
= (sizeof
(*tcp
) + canip
->ah_optlen
) >> 2;
1247 inc_anipheaders
(canip
->ah_optlen
);
1251 void new_udpheader
()
1253 if
((ip
->ip_p
) && (ip
->ip_p
!= IPPROTO_UDP
)) {
1254 fprintf
(stderr
, "protocol %d specified with UDP!\n", ip
->ip_p
);
1257 ip
->ip_p
= IPPROTO_UDP
;
1259 udp
= (udphdr_t
*)new_header
(IPPROTO_UDP
);
1260 udp
->uh_ulen
= sizeof
(*udp
);
1264 void set_udplen
(arg
)
1269 len
= strtol
(*arg
, NULL
, 0);
1270 inc_anipheaders
(len
- udp
->uh_ulen
);
1277 void set_udpsum
(arg
)
1280 udp
->uh_sum
= strtol
(*arg
, NULL
, 0);
1289 struct in_addr gwip
;
1291 ifp
= sending.snd_if
;
1293 fprintf
(stderr
, "no interface defined for sending!\n");
1296 if
(ifp
->if_fd
== -1)
1297 ifp
->if_fd
= initdevice
(ifp
->if_name
, 0, 5);
1298 gwip
= sending.snd_gw
;
1300 gwip
= aniphead
->ah_ip
->ip_dst
;
1301 (void) send_ip
(ifp
->if_fd
, ifp
->if_MTU
, (ip_t
*)ipbuffer
, gwip
, 2);
1309 u_char
*s
= (u_char
*)ipbuffer
, *t
= (u_char
*)outline
;
1311 if
(opts
& OPT_VERBOSE
) {
1312 ip
->ip_len
= htons
(ip
->ip_len
);
1313 for
(i
= ntohs
(ip
->ip_len
), j
= 0; i
; i
--, j
++, s
++) {
1314 if
(j
&& !(j
& 0xf)) {
1317 fputs
(outline
, stdout
);
1319 t
= (u_char
*)outline
;
1322 sprintf
((char *)t
, "%02x", *s
& 0xff);
1324 if
(!((j
+ 1) & 0xf)) {
1326 sprintf
((char *)t
, " ");
1328 for
(k
= 16; k
; k
--, s
++)
1329 *t
++ = (isprint
(*s
) ?
*s
: '.');
1338 for
(k
= 16 - (j
& 0xf); k
; k
--) {
1343 sprintf
((char *)t
, " ");
1346 for
(k
= j
& 0xf; k
; k
--, s
++)
1347 *t
++ = (isprint
(*s
) ?
*s
: '.');
1351 fputs
(outline
, stdout
);
1353 ip
->ip_len
= ntohs
(ip
->ip_len
);
1361 void new_interface
()
1363 cifp
= (iface_t
*)calloc
(1, sizeof
(iface_t
));
1365 iftail
= &cifp
->if_next
;
1370 void check_interface
()
1372 if
(!cifp
->if_name ||
!*cifp
->if_name
)
1373 fprintf
(stderr
, "No interface name given!\n");
1374 if
(!cifp
->if_MTU ||
!*cifp
->if_name
)
1375 fprintf
(stderr
, "Interface %s has an MTU of 0!\n",
1380 void set_ifname
(arg
)
1383 cifp
->if_name
= *arg
;
1395 void set_ifv4addr
(arg
)
1398 cifp
->if_addr
= getipv4addr
(*arg
);
1404 void set_ifeaddr
(arg
)
1407 (void) geteaddr
(*arg
, &cifp
->if_eaddr
);
1415 carp
= (arp_t
*)calloc
(1, sizeof
(arp_t
));
1417 arptail
= &carp
->arp_next
;
1421 void set_arpeaddr
(arg
)
1424 (void) geteaddr
(*arg
, &carp
->arp_eaddr
);
1430 void set_arpv4addr
(arg
)
1433 carp
->arp_addr
= getipv4addr
(*arg
);
1439 int arp_getipv4
(ip
, addr
)
1445 for
(a
= arplist
; a
; a
= a
->arp_next
)
1446 if
(!bcmp
(ip
, (char *)&a
->arp_addr
, 4)) {
1447 bcopy
((char *)&a
->arp_eaddr
, addr
, 6);
1456 sending.snd_if
= iflist
;
1457 sending.snd_gw
= defrouter
;
1461 void set_sendif
(arg
)
1466 for
(ifp
= iflist
; ifp
; ifp
= ifp
->if_next
)
1467 if
(ifp
->if_name
&& !strcmp
(ifp
->if_name
, *arg
))
1469 sending.snd_if
= ifp
;
1471 fprintf
(stderr
, "couldn't find interface %s\n", *arg
);
1477 void set_sendvia
(arg
)
1480 sending.snd_gw
= getipv4addr
(*arg
);
1486 void set_defaultrouter
(arg
)
1489 defrouter
= getipv4addr
(*arg
);
1495 void new_icmpheader
()
1497 if
((ip
->ip_p
) && (ip
->ip_p
!= IPPROTO_ICMP
)) {
1498 fprintf
(stderr
, "protocol %d specified with ICMP!\n",
1502 ip
->ip_p
= IPPROTO_ICMP
;
1503 icmp
= (icmphdr_t
*)new_header
(IPPROTO_ICMP
);
1507 void set_icmpcode
(code
)
1510 icmp
->icmp_code
= code
;
1514 void set_icmptype
(type
)
1517 icmp
->icmp_type
= type
;
1521 static char *icmpcodes
[] = {
1522 "net-unr", "host-unr", "proto-unr", "port-unr", "needfrag", "srcfail",
1523 "net-unk", "host-unk", "isolate", "net-prohib", "host-prohib",
1524 "net-tos", "host-tos", NULL
};
1526 void set_icmpcodetok
(code
)
1532 for
(i
= 0; (s
= icmpcodes
[i
]); i
++)
1533 if
(!strcmp
(s
, *code
)) {
1534 icmp
->icmp_code
= i
;
1538 fprintf
(stderr
, "unknown ICMP code %s\n", *code
);
1544 static char *icmptypes
[] = {
1545 "echorep", (char *)NULL
, (char *)NULL
, "unreach", "squench",
1546 "redir", (char *)NULL
, (char *)NULL
, "echo", (char *)NULL
,
1547 (char *)NULL
, "timex", "paramprob", "timest", "timestrep",
1548 "inforeq", "inforep", "maskreq", "maskrep", "END"
1551 void set_icmptypetok
(type
)
1557 for
(i
= 0; !(s
= icmptypes
[i
]) || strcmp
(s
, "END"); i
++)
1558 if
(s
&& !strcmp
(s
, *type
)) {
1559 icmp
->icmp_type
= i
;
1564 fprintf
(stderr
, "unknown ICMP type %s\n", *type
);
1570 void set_icmpid
(arg
)
1573 icmp
->icmp_id
= htons
(arg
);
1577 void set_icmpseq
(arg
)
1580 icmp
->icmp_seq
= htons
(arg
);
1584 void set_icmpotime
(arg
)
1587 icmp
->icmp_otime
= htonl
(arg
);
1591 void set_icmprtime
(arg
)
1594 icmp
->icmp_rtime
= htonl
(arg
);
1598 void set_icmpttime
(arg
)
1601 icmp
->icmp_ttime
= htonl
(arg
);
1605 void set_icmpmtu
(arg
)
1609 icmp
->icmp_nextmtu
= htons
(arg
);
1614 void set_redir
(redir
, arg
)
1618 icmp
->icmp_code
= redir
;
1619 icmp
->icmp_gwaddr
= getipv4addr
(*arg
);
1625 void set_icmppprob
(num
)
1628 icmp
->icmp_pptr
= num
;
1638 void add_ipopt
(state
, ptr
)
1642 struct ipopt_names
*io
;
1643 struct statetoopt
*sto
;
1644 char numbuf
[16], *arg
, **param
= ptr
;
1647 if
(state
== IL_IPO_RR || state
== IL_IPO_SATID
) {
1649 sprintf
(numbuf
, "%d", *(int *)param
);
1651 strcpy
(numbuf
, "0");
1654 arg
= param ?
*param
: NULL
;
1656 if
(canip
->ah_next
) {
1657 fprintf
(stderr
, "cannot specify options after data body\n");
1660 for
(sto
= toipopts
; sto
->sto_st
; sto
++)
1661 if
(sto
->sto_st
== state
)
1663 if
(!sto ||
!sto
->sto_st
) {
1664 fprintf
(stderr
, "No mapping for state %d to IP option\n",
1669 hlen
= sizeof
(ip_t
) + canip
->ah_optlen
;
1670 for
(io
= ionames
; io
->on_name
; io
++)
1671 if
(io
->on_value
== sto
->sto_op
)
1673 canip
->ah_lastopt
= io
->on_value
;
1676 inc
= addipopt
((char *)ip
+ hlen
, io
, hlen
- sizeof
(ip_t
),arg
);
1679 ((char *)ip
)[sizeof
(*ip
) + inc
] = IPOPT_NOP
;
1680 canip
->ah_lastopt
= IPOPT_NOP
;
1687 canip
->ah_optlen
= hlen
- sizeof
(ip_t
);
1689 if
(state
!= IL_IPO_RR
&& state
!= IL_IPO_SATID
)
1690 if
(param
&& *param
) {
1701 char *s
, *buf
= (char *)ip
;
1704 * pad out so that we have a multiple of 4 bytes in size fo the
1705 * options. make sure last byte is EOL.
1707 if
(canip
->ah_lastopt
== IPOPT_NOP
) {
1708 buf
[sizeof
(*ip
) + canip
->ah_optlen
- 1] = IPOPT_EOL
;
1709 } else if
(canip
->ah_lastopt
!= IPOPT_EOL
) {
1710 s
= buf
+ sizeof
(*ip
) + canip
->ah_optlen
;
1712 for
(pad
= 3 - (canip
->ah_optlen
& 3); pad
; pad
--) {
1719 s
= buf
+ sizeof
(*ip
) + canip
->ah_optlen
- 1;
1721 for
(pad
= 3 - (canip
->ah_optlen
& 3); pad
; pad
--) {
1727 ip
->ip_hl
= (sizeof
(*ip
) + canip
->ah_optlen
) >> 2;
1728 inc_anipheaders
(canip
->ah_optlen
);
1733 void set_secclass
(arg
)
1741 void free_anipheader
()
1746 if
((canip
= aip
->ah_prev
)) {
1747 canip
->ah_next
= NULL
;
1748 aniptail
= &canip
->ah_next
;
1761 ip
->ip_len
= htons
(ip
->ip_len
);
1762 ip
->ip_sum
= chksum
((u_short
*)ip
, ip
->ip_hl
<< 2);
1763 ip
->ip_len
= ntohs
(ip
->ip_len
);
1765 for
(aip
= aniphead
, ip
= NULL
; aip
; aip
= aip
->ah_next
)
1766 if
(aip
->ah_p
== IPPROTO_IP
)
1775 icmp
->icmp_cksum
= 0;
1776 icmp
->icmp_cksum
= chksum
((u_short
*)icmp
, canip
->ah_len
);
1778 for
(aip
= aniphead
, icmp
= NULL
; aip
; aip
= aip
->ah_next
)
1779 if
(aip
->ah_p
== IPPROTO_ICMP
)
1780 icmp
= aip
->ah_icmp
;
1790 bzero
((char *)&iptmp
, sizeof
(iptmp
));
1791 iptmp.ip_p
= ip
->ip_p
;
1792 iptmp.ip_src
= ip
->ip_src
;
1793 iptmp.ip_dst
= ip
->ip_dst
;
1794 iptmp.ip_len
= htons
(ip
->ip_len
- (ip
->ip_hl
<< 2));
1795 sum
= p_chksum
((u_short
*)&iptmp
, (u_int
)sizeof
(iptmp
));
1796 udp
->uh_ulen
= htons
(udp
->uh_ulen
);
1797 udp
->uh_sum
= c_chksum
((u_short
*)udp
, (u_int
)ntohs
(iptmp.ip_len
), sum
);
1799 for
(aip
= aniphead
, udp
= NULL
; aip
; aip
= aip
->ah_next
)
1800 if
(aip
->ah_p
== IPPROTO_UDP
)
1811 bzero
((char *)&iptmp
, sizeof
(iptmp
));
1812 iptmp.ip_p
= ip
->ip_p
;
1813 iptmp.ip_src
= ip
->ip_src
;
1814 iptmp.ip_dst
= ip
->ip_dst
;
1815 iptmp.ip_len
= htons
(ip
->ip_len
- (ip
->ip_hl
<< 2));
1816 sum
= p_chksum
((u_short
*)&iptmp
, (u_int
)sizeof
(iptmp
));
1818 tcp
->th_sum
= c_chksum
((u_short
*)tcp
, (u_int
)ntohs
(iptmp.ip_len
), sum
);
1820 for
(aip
= aniphead
, tcp
= NULL
; aip
; aip
= aip
->ah_next
)
1821 if
(aip
->ah_p
== IPPROTO_TCP
)
1837 yydebug = (opts
& OPT_DEBUG
) ?
1 : 0;
1844 u_short c_chksum
(buf
, len
, init
)
1850 int nwords
= len
>> 1;
1852 for
(; nwords
> 0; nwords
--)
1854 sum
= (sum
>>16) + (sum
& 0xffff);
1860 u_long p_chksum
(buf
,len
)
1865 int nwords
= len
>> 1;
1867 for
(; nwords
> 0; nwords
--)