chenqiyang
2021-08-20 7b95fb4d4549d3452ee17165236186afc1f2b393
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
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * Copyright (c) 2010-2019 Belledonne Communications SARL.
 *
 * This file is part of oRTP.
 *
 * 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
 * (at your option) 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/>.
 */
 
#ifndef STR_UTILS_H
#define STR_UTILS_H
 
 
#include <ortp/port.h>
#if defined(ORTP_TIMESTAMP)
#include <time.h>
#endif
 
 
#ifndef MIN
#define MIN(a,b) (((a)>(b)) ? (b) : (a))
#endif
#ifndef MAX
#define MAX(a,b) (((a)>(b)) ? (a) : (b))
#endif
 
#define return_if_fail(expr) if (!(expr)) {printf("%s:%i- assertion"#expr "failed\n",__FILE__,__LINE__); return;}
#define return_val_if_fail(expr,ret) if (!(expr)) {printf("%s:%i- assertion" #expr "failed\n",__FILE__,__LINE__); return (ret);}
 
 
typedef struct ortp_recv_addr {
    int family;
    union {
        struct in_addr ipi_addr;
        struct in6_addr ipi6_addr;
    } addr;
    unsigned short port;
} ortp_recv_addr_t;
 
typedef struct ortp_recv_addr_map {
    struct sockaddr_storage ss;
    ortp_recv_addr_t recv_addr;
    uint64_t ts;
} ortp_recv_addr_map_t;
 
typedef struct msgb
{
    struct msgb *b_prev;
    struct msgb *b_next;
    struct msgb *b_cont;
    struct datab *b_datap;
    unsigned char *b_rptr;
    unsigned char *b_wptr;
    uint32_t reserved1;
    uint32_t reserved2;
    struct timeval timestamp;
    ortp_recv_addr_t recv_addr; /*contains the destination address of incoming packets, used for ICE processing*/
    struct sockaddr_storage net_addr; /*source address of incoming packet, or dest address of outgoing packet, used only by simulator and modifiers*/
    socklen_t net_addrlen; /*source (dest) address of incoming (outgoing) packet length used by simulator and modifiers*/
    uint8_t ttl_or_hl;
} mblk_t;
 
 
 
typedef struct datab dblk_t;
 
typedef struct _queue
{
    mblk_t _q_stopper;
    int q_mcount;    /*number of packet in the q */
} queue_t;
 
#ifdef __cplusplus
extern "C" {
#endif
 
ORTP_PUBLIC void dblk_ref(dblk_t *d);
ORTP_PUBLIC void dblk_unref(dblk_t *d);
ORTP_PUBLIC unsigned char * dblk_base(dblk_t *db);
ORTP_PUBLIC unsigned char * dblk_lim(dblk_t *db);
ORTP_PUBLIC int dblk_ref_value(dblk_t *db);
 
ORTP_PUBLIC void qinit(queue_t *q);
 
ORTP_PUBLIC void putq(queue_t *q, mblk_t *m);
 
ORTP_PUBLIC mblk_t * getq(queue_t *q);
 
ORTP_PUBLIC void insq(queue_t *q,mblk_t *emp, mblk_t *mp);
 
ORTP_PUBLIC void remq(queue_t *q, mblk_t *mp);
 
ORTP_PUBLIC mblk_t * peekq(queue_t *q);
 
/* remove and free all messages in the q */
#define FLUSHALL 0
ORTP_PUBLIC void flushq(queue_t *q, int how);
 
ORTP_PUBLIC void mblk_init(mblk_t *mp);
 
ORTP_PUBLIC void mblk_meta_copy(const mblk_t *source, mblk_t *dest);
 
/* allocates a mblk_t, that points to a datab_t, that points to a buffer of size size. */
ORTP_PUBLIC mblk_t *allocb(size_t size, int unused);
#define BPRI_MED 0
 
/* allocates a mblk_t, that points to a datab_t, that points to buf; buf will be freed using freefn */
ORTP_PUBLIC mblk_t *esballoc(uint8_t *buf, size_t size, int pri, void (*freefn)(void*) );
 
/* frees a mblk_t, and if the datab ref_count is 0, frees it and the buffer too */
ORTP_PUBLIC void freeb(mblk_t *m);
 
/* frees recursively (follow b_cont) a mblk_t, and if the datab
ref_count is 0, frees it and the buffer too */
ORTP_PUBLIC void freemsg(mblk_t *mp);
 
/* duplicates a mblk_t , buffer is not duplicated*/
ORTP_PUBLIC mblk_t *dupb(mblk_t *m);
 
/* duplicates a complex mblk_t, buffer is not duplicated */
ORTP_PUBLIC mblk_t    *dupmsg(mblk_t* m);
 
/* returns the size of data of a message */
ORTP_PUBLIC size_t msgdsize(const mblk_t *mp);
 
/* concatenates all fragment of a complex message*/
ORTP_PUBLIC void msgpullup(mblk_t *mp,size_t len);
 
/* duplicates a single message, but with buffer included */
ORTP_PUBLIC mblk_t *copyb(const mblk_t *mp);
 
/* duplicates a complex message with buffer included */
ORTP_PUBLIC mblk_t *copymsg(const mblk_t *mp);
 
ORTP_PUBLIC mblk_t * appendb(mblk_t *mp, const char *data, size_t size, bool_t pad);
ORTP_PUBLIC void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad);
 
ORTP_PUBLIC mblk_t *concatb(mblk_t *mp, mblk_t *newm);
 
/*Make sure the message has a unique owner, if not duplicate the underlying data buffer so that it can be changed without impacting others.
 Note that in case of copy, the message will be un-fragmented, exactly the way msgpullup() does. Always returns mp.*/
ORTP_PUBLIC mblk_t * msgown(mblk_t *mp);
 
#define qempty(q) (&(q)->_q_stopper==(q)->_q_stopper.b_next)
#define qfirst(q) ((q)->_q_stopper.b_next!=&(q)->_q_stopper ? (q)->_q_stopper.b_next : NULL)
#define qbegin(q) ((q)->_q_stopper.b_next)
#define qlast(q) ((q)->_q_stopper.b_prev!=&(q)->_q_stopper ? (q)->_q_stopper.b_prev : NULL)
#define qend(q,mp)    ((mp)==&(q)->_q_stopper)
#define qnext(q,mp) ((mp)->b_next)
 
typedef struct _msgb_allocator{
    queue_t q;
    int max_blocks;
}msgb_allocator_t;
 
ORTP_PUBLIC void msgb_allocator_init(msgb_allocator_t *pa);
/* Set a maximum number of blocks that can be managed by the allocator.
   Only blocks satisfying the "size" argument of msgb_allocator_alloc() are counted.*/
ORTP_PUBLIC void msgb_allocator_set_max_blocks(msgb_allocator_t *pa, int max_blocks);
ORTP_PUBLIC mblk_t *msgb_allocator_alloc(msgb_allocator_t *pa, size_t size);
ORTP_PUBLIC void msgb_allocator_uninit(msgb_allocator_t *pa);
 
ORTP_PUBLIC void ortp_recvaddr_to_sockaddr(ortp_recv_addr_t *recvaddr, struct sockaddr *addr, socklen_t *socklen);
ORTP_PUBLIC void ortp_sockaddr_to_recvaddr(const struct sockaddr * addr, ortp_recv_addr_t * recvaddr);
 
#ifdef __cplusplus
}
#endif
 
#endif