]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/capture/cap_debug/libpal.h
cbd239fc3d7bbf2baab4a500d738b536602f609a
[stg.git] / projects / stargazer / plugins / capture / cap_debug / libpal.h
1 /* $Id: libpal.h,v 1.1 2005/12/12 18:14:22 nobunaga Exp $
2
3 Copyright (C) 2002 Marc Kirchner <kirchner@stud.fh-heilbronn.de>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20 #ifndef _LIBPAL_H_
21 #define _LIBPAL_H_
22
23 #include <sys/types.h>
24 #include <sys/socket.h>
25 #include <sys/time.h>
26 #include <netinet/in.h>
27 #include <netinet/ip.h>
28 #include <netinet/ip_icmp.h>
29 #include <netinet/tcp.h>
30 #include <netinet/udp.h>
31 #include <arpa/inet.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <unistd.h>
35 #include "checksum.h"
36 #include "constants.h"
37
38 /*
39 * generic packet structure
40 *
41 * we maintain a so called "active ptr" inside the packet. Most operations
42 * on the packet will take place at the position the pointer points at.
43 * The pointer should never be moved directly, instead the functions
44 * pkt_set_actpr() and pkt_move_actptr() are provided.
45 * Using this approach we can perform bounds checking and make sure our
46 * library functions won't segfault.
47 * pkt_type is not really being used at the moment. I don't know if it
48 * ever will be. It might just be left out one day, so keep your fingers
49 * off. Use pkt_init() to set it. And dont even think of messing with the
50 * packet payload pointer pkt. You do NOT want to do that. Use the provided
51 * library functions.
52 * To be clear: don't do _anything_ with this struct. Just pass it as a
53 * parameter, be happy and your programs will (hopefully) work. 
54 */
55 struct packet {
56         unsigned long   pkt_type;
57         unsigned char   *pkt;
58         unsigned int    pkt_size;
59         unsigned char   *pkt_ptr; /* active ptr inside packet */
60         unsigned int    pkt_pos; /* pkt_ptr position, starting at 0 */
61 };
62
63 /*
64 * our socket structure
65 *
66 * same as above. Use the provided library fuctions to change its values.
67 * Do not do it on your own. Live and let die. You have been warned.
68 */
69 struct pkt_socket {
70         int rawfd;
71         struct sockaddr_in *sckad;
72         /*struct sockaddr_ll *sckll;*/
73         socklen_t sckad_len;    
74 };
75
76 /* memory management */
77 int pkt_init(struct packet *pkt, unsigned long type, unsigned int size);
78 int pkt_free(struct packet *pkt);
79
80 /* pointer movement */
81 int pkt_set_actptr(struct packet *pkt, unsigned int bytepos);   
82 int pkt_move_actptr(struct packet *pkt, int relmov);
83
84 /* raw data */
85 int pkt_add_systimestamp(struct packet *pkt);
86 int pkt_add_data(struct packet *pkt, char *data, size_t data_len);
87 int pkt_resize(struct packet *pkt, unsigned int newsize);
88
89 /* socket operations */
90 int pkt_socket_open(struct pkt_socket *sck, int type);
91 int pkt_socket_close(struct pkt_socket *sck);
92 int pkt_socket_prepare(struct pkt_socket *sck, char *daddr);
93 int pkt_socket_setopt(struct pkt_socket *sck, int level, int optname, void *optval, socklen_t optlen);
94
95 /* sending */
96 int pkt_send(struct packet *pkt, struct pkt_socket *sck);
97
98 /* IP */
99 int pkt_ip_header(struct packet *pkt, unsigned int iphdr_len, unsigned int version, unsigned char tos, unsigned short int total_len, unsigned short int id, unsigned short int frag_off /* 3bit flag, 13bit offset */, unsigned char ttl, unsigned char protocol, unsigned short int cksum, unsigned int saddr, unsigned int daddr);
100 int pkt_ip_cksum(struct packet *pkt);
101 int pkt_ip_option_header(struct packet *pkt, unsigned char type, unsigned char len, unsigned char ptr, unsigned char oflw_flg, void *optval, size_t optlen);
102
103 /* TCP */
104 int pkt_tcp_header(struct packet *pkt, unsigned short int sport, unsigned short int dport, unsigned int seq, unsigned int ackseq, unsigned char headerlen, unsigned char reserved, unsigned char flags, unsigned short window, unsigned short int checksum, unsigned short int urgent);
105 int pkt_tcp_cksum(struct packet *pkt, char *saddr, char *daddr, unsigned int tcp_pkt_size);
106 int pkt_tcp_option(struct packet *pkt, unsigned char kind, unsigned char len, void *optval, size_t optlen);
107
108 /* UDP */
109 int pkt_udp_header(struct packet *pkt, unsigned short int sport, unsigned short int dport, unsigned short int udp_total_len, unsigned short int checksum);
110 int pkt_udp_cksum(struct packet *pkt, char *saddr, char *daddr, unsigned int udp_total_len);
111
112 /* ICMP */
113 int pkt_icmp_header(struct packet *pkt, unsigned char type, unsigned char code, unsigned short int checksum);
114 int pkt_icmp_cksum(struct packet *pkt, unsigned int len);
115 int pkt_icmp_addr_mask(struct packet *pkt, unsigned short int id, unsigned short int seqno, unsigned int mask, char *cmask);
116 int pkt_icmp_dest_unreach(struct packet *pkt, unsigned int unused);
117 int pkt_icmp_source_quench(struct packet *pkt, unsigned int unused);
118 int pkt_icmp_redirect(struct packet *pkt, unsigned int routerip, char *crouterip);
119 int pkt_icmp_echo(struct packet *pkt, unsigned short int id, unsigned short int seqno, void *data, size_t data_len);
120 int pkt_icmp_timestamp(struct packet *pkt, unsigned short int id, unsigned short int seqno, unsigned int ts_otime, unsigned int ts_rtime, unsigned int ts_ttime);
121
122 /* functions that might be useful and might be added some day ... 
123 int pkt_shift_data(struct packet *pkt, unsigned int from, unsigned int to, unsigned int len);
124 int pkt_tcp_change_seqno(int rel_seq, int rel_ackseq);
125 int pkt_tcp_set_seqno(unsigned int seq, unsigned int ackseq);
126 int pkt_ip_option(struct packet *pkt, unsigned char code, unsigned char len, unsigned char ptr);
127 int pkt_ip_option_addval(struct *pkt, unsigned char posptr, unsigned int optval);
128 */
129
130 #endif