File: pbuf.h

package info (click to toggle)
aprx 2.9.0+dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 2,352 kB
  • sloc: ansic: 15,809; sh: 598; makefile: 160
file content (135 lines) | stat: -rw-r--r-- 5,231 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
/********************************************************************
 *  APRX -- 2nd generation APRS-i-gate with                         *
 *          minimal requirement of esoteric facilities or           *
 *          libraries of any kind beyond UNIX system libc.          *
 *                                                                  *
 * (c) Matti Aarnio - OH2MQK,  2007-2014                            *
 *                                                                  *
 ********************************************************************/
/*
 *	Some parts of this code are copied from:
 *
 *	aprsc
 *
 *	(c) Heikki Hannikainen, OH7LZB <hessu@hes.iki.fi>
 *
 *     This program is licensed under the BSD license, which can be found
 *     in the file LICENSE.
 *	
 */

/* Modified for  APRX by Matti Aarnio, OH2MQK
 * Altered name from  worker.h  to pbuf.h, and
 * dropped about 70% of worker.h stuff...
 */

#ifndef PBUF_H
#define PBUF_H

/* minimum and maximum length of a callsign on APRS-IS */
#define CALLSIGNLEN_MIN 3
#define CALLSIGNLEN_MAX 9

/* packet length limiters and buffer sizes */
#define PACKETLEN_MIN 10	/* minimum length for a valid APRS-IS packet: "A1A>B1B:\r\n" */
#define PACKETLEN_MAX 512	/* maximum length for a valid APRS-IS packet (incl. CRLF) */

/*
 *  Packet length statistics:
 *
 *   <=  80:  about  25%
 *   <=  90:  about  36%
 *   <= 100:  about  73%
 *   <= 110:  about  89%
 *   <= 120:  about  94%
 *   <= 130:  about  97%
 *   <= 140:  about  98.7%
 *   <= 150:  about  99.4%
 */

#define PACKETLEN_MAX_SMALL  100 
#define PACKETLEN_MAX_MEDIUM 180 /* about 99.5% are smaller than this */
#define PACKETLEN_MAX_LARGE  PACKETLEN_MAX

/* number of pbuf_t structures to allocate at a time */
#define PBUF_ALLOCATE_BUNCH_SMALL  2000 /* grow to 2000 in production use */
#define PBUF_ALLOCATE_BUNCH_MEDIUM 2000 /* grow to 2000 in production use */
#define PBUF_ALLOCATE_BUNCH_LARGE    50 /* grow to 50 in production use */

/* a packet buffer */
/* Type flags -- some can happen in combinations: T_CWOP + T_WX / T_CWOP + T_POSITION ... */
#define T_POSITION   (1 << 0) // Packet is of position type
#define T_OBJECT     (1 << 1) // packet is an object
#define T_ITEM       (1 << 2) // packet is an item
#define T_MESSAGE    (1 << 3) // packet is a message
#define T_NWS        (1 << 4) // packet is a NWS message
#define T_WX         (1 << 5) // packet is WX data
#define T_TELEMETRY  (1 << 6) // packet is telemetry
#define T_QUERY      (1 << 7) // packet is a query
#define T_STATUS     (1 << 8) // packet is status 
#define T_USERDEF    (1 << 9) // packet is userdefined
#define T_CWOP       (1 << 10) // packet is recognized as CWOP
#define T_STATCAPA   (1 << 11) // packet is station capability response
#define T_THIRDPARTY (1 << 12)
#define T_ALL	     (1 << 15) // set on _all_ packets

#define F_DUPE    	(1 << 0) // Duplicate of a previously seen packet
#define F_HASPOS  	(1 << 1) // This packet has valid parsed position
#define F_HAS_TCPIP	(1 << 2) // There is a TCPIP* in the path

struct pbuf_t {
	struct pbuf_t *next;

	int16_t	 is_aprs;	// If not, then just digipeated frame..
	int16_t	 digi_like_aprs;
	int16_t  source_if_group;

	int16_t  refcount;

	int16_t	 reqcount;      // How many digipeat hops are requested?
	int16_t	 donecount;	// How many digipeat hops are already done?

	time_t   t;		/* when the packet was received */
	uint32_t seqnum;	/* ever increasing counter, dupecheck sets */
	uint16_t packettype;	/* bitmask: one or more of T_* */
	uint16_t flags;		/* bitmask: one or more of F_* */
	uint16_t srcname_len;	/* parsed length of source (object, item, srcall) name 3..9 */
	uint16_t dstcall_len;	/* parsed length of destination callsign *including* SSID */
	uint16_t dstname_len;   /* parsed length of message destination including SSID */
	uint16_t entrycall_len;
	
	int packet_len;		/* the actual length of the TNC2 packet */
	int buf_len;		/* the length of this buffer */
	
	const char *srccall_end;   /* source callsign with SSID */
	const char *dstcall_end_or_ssid;   /* end of dest callsign (without SSID) */
	const char *dstcall_end;   /* end of dest callsign with SSID */
	const char *qconst_start;  /* "qAX,incomingSSID:"	-- for q and e filters  */
	const char *info_start;    /* pointer to start of info field */
	const char *srcname;       /* source's name (either srccall or object/item name) */
	const char *dstname;       /* message destination callsign */
	
	float lat;	/* if the packet is PT_POSITION, latitude and longitude go here */
	float lng;	/* .. in RADIAN */
	float cos_lat;	/* cache of COS of LATitude for radial distance filter    */

	char symbol[3]; /* 2(+1) chars of symbol, if any, NUL for not found */

	uint8_t *ax25addr;	// Start of AX.25 address
	int      ax25addrlen;	// length of AX.25 address

	uint8_t *ax25data;	// Start of AX.25 data after addresses
	int      ax25datalen;	// length of that data

	char data[1];
};

/* global packet buffer */
extern struct pbuf_t  *pbuf_global;
extern struct pbuf_t  *pbuf_global_last;
extern struct pbuf_t **pbuf_global_prevp;
extern struct pbuf_t  *pbuf_global_dupe;
extern struct pbuf_t  *pbuf_global_dupe_last;
extern struct pbuf_t **pbuf_global_dupe_prevp;

#endif