File: plt.h

package info (click to toggle)
python-libtrace 1.6%2Bgit20161027-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,124 kB
  • ctags: 1,357
  • sloc: ansic: 6,890; python: 3,228; makefile: 70; sh: 49
file content (168 lines) | stat: -rw-r--r-- 5,529 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* 1509, Fri 21 Nov 14 (NZDT)
   1011, Tue  6 May 14 (NZST)
   1452, Fri 14 Mar 14 (PDT)
   1421, Fri  2 Aug 13 (CEST)

   plt.h: defines etc, and global declarations
                 for the python-libtrace libraries.

   python-libtrace: a Python module to make it easy to use libtrace
   Copyright (C) 2015 by Nevil Brownlee, U Auckland | WAND

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <arpa/inet.h>

#define PLTversion     "1.6"

#define RLT_KIND_PKT       1  /* data points to a libtrace_packet_t */
#define RLT_KIND_STR       2  /* data points to a C byte array */
#define RLT_KIND_CPY       3  /* data points to another (MOM) rlt_obj */
#define BAD_RLT_KIND(v)  (v < RLT_KIND_PKT || v > RLT_KIND_COPY)

#define RLT_TYPE_DATA      5  /* rlt_obj data types */
#define RLT_TYPE_PKT      10
#define RLT_TYPE_L2       20
#define RLT_TYPE_L3       30
#define RLT_TYPE_Internet 31
#define RLT_TYPE_IP       32
#define RLT_TYPE_IP6      33
#define RLT_TYPE_L4       40
#define RLT_TYPE_TCP      41
#define RLT_TYPE_UDP      42
#define RLT_TYPE_ICMP     43
#define RLT_TYPE_ICMP6    44
#define RLT_TYPE_L5       50

typedef struct {
   PyObject_HEAD
   int type;       /* Data type, RLT_TYPE values above */
   int kind;       /* Object kind, defined abve */
   void *data;     /* Pointer to the object's libtrace_packet_t or string */
   PyObject *mom;  /* Reference to original python object, used,
		        e.g., when we clone a libtrace pkt */
   void *l2p;      /* Pointer to link-layer header */
   int l2_rem;     /* Bytes remaining at layer 2 */
   int linktype;   /* link type from original pkt, so we
		        can use trace_get_payload_from_layer2() */
   int ethertype;  /* So we can see its network protocol */
   int vlan_tag;   /* 802.1Q tag, NULL if there isn't one */
   void *l3p;      /* Pointer to the object's Internet struct */
   int l3_rem;     /* Remaining bytes for encapsulating python object */
   int proto;      /* Transport protocol */
   void *dp;       /* Pointer to an object within a DataObject
                        e.g. to a libtrace_tcp_t in a packet */
   int rem;        /* Number of bytes in the object */
   } DataObject;

int pltData_set_fields(
   PyObject *object,
   int kind, void *data, PyObject *mom, // int linktype,
   int type, void *l3p, int l3_rem, void *dp, int rem);

DataObject *plt_new_object(  /* Make a new Data object */
   PyTypeObject *py_type,
   int type, int kind, void* data, PyObject *mom,
   void* l2p, int l2_rem, int linktype, int ethertype, int vlan_tag,
   void *l3p, int l3_rem, int proto,
   void *dp, int rem);

void pltData_dump(DataObject *self, const char *msg);

typedef struct {
   PyObject_HEAD
   int started;
   libtrace_t *tr;
   libtrace_packet_t *lt_pkt;
   DataObject *py_packet;
   } TraceObject;

typedef struct {
   PyObject_HEAD
   int started;
   libtrace_out_t *op;
   } OutputTraceObject;

typedef struct  {  /* In trace.c */
   PyObject_HEAD
   int used;
   libtrace_filter_t *flt;
   } FilterObject;

extern char plt_err_msg[120];  /* For building libtrace error messages */

#define set_err_msg(fmt, v1) \
   snprintf(plt_err_msg, sizeof(plt_err_msg), fmt, v1)
#define set_err_msg2(fmt, v1, v2) \
  snprintf(plt_err_msg, sizeof(plt_err_msg), fmt, v1, v2)

#define set_read_only(attrib) \
static int set_##attrib( \
      DataObject *self, PyObject *value, void *closure) { \
   PyErr_SetString(PyExc_TypeError, #attrib " is read_only"); \
   return -1; \
   }

#define fcs_decr(ltype) \
   ((ltype == TRACE_TYPE_ETH || ltype == TRACE_TYPE_80211) ? \
      4 : 0)

uint16_t checksum(void *buffer, uint16_t len);
int transport_checksum(DataObject *d, int reset_cks);

extern PyObject *plt_module;  /* PythonLibtrace module (i.e. this one!) */
extern PyObject *ipp_new;     /* IPprefix.IPprefix() function */
extern PyObject *datetime_datetime_obj;

extern PyObject *plt_exc_libtrace;  /* Error detected by libtrace */

extern PyTypeObject Neighbour6Type;
extern PyTypeObject Param6Type;
extern PyTypeObject Toobig6Type;
extern PyTypeObject Echo6Type;
extern PyTypeObject Icmp6Type;
extern PyTypeObject RedirectType;
extern PyTypeObject EchoType;
extern PyTypeObject IcmpType;
extern PyTypeObject TcpType;
extern PyTypeObject UdpType;
extern PyTypeObject Ip6Type;
extern PyTypeObject IpType;
extern PyTypeObject InternetType;
extern PyTypeObject TransportType;
extern PyTypeObject Layer3Type;
extern PyTypeObject Layer2Type;
extern PyTypeObject DataType;
extern PyTypeObject PacketType;
extern PyTypeObject TraceType;
extern PyTypeObject FilterType;
extern PyTypeObject OutputTraceType;
extern PyTypeObject IPflowType;

void inittrace(void);
void initoutputtrace(void);
void initpacket(void);
void initlayers(void);
void inittransport(void);
void initinternet(void);
void initip(void);
void initip6(void);
void inittcp(void);
void initudp(void);
void initicmp(void);
void initicmp6(void);
void initipflow(void);

void quack(int which);