10 #define UIP_LOG(m) uip_log(__FILE__,__LINE__,m)
13 #endif /* UIP_LOGGING == 1 */
17 #define UIP_ERROR(m) uip_log(__FILE__,__LINE__,m)
20 #endif /* UIP_ERRORING == 1 */
22 #if UIP_STATISTICS == 1
23 struct uip_stats uip_stat
;
27 #endif /* UIP_STATISTICS == 1 */
29 MEMB(uip_pool_pbufs
,sizeof(struct uip_pbuf
)+UIP_PBUF_POOL_BUFSIZE
,UIP_PBUF_POOL_NUM
);
30 MEMB(uip_rom_pbufs
,sizeof(struct uip_pbuf
),UIP_PBUF_ROM_NUM
);
34 memb_init(&uip_pool_pbufs
);
35 memb_init(&uip_rom_pbufs
);
38 struct uip_pbuf
* uip_pbuf_alloc(uip_pbuf_layer layer
,u16_t len
,uip_pbuf_flag flag
)
42 struct uip_pbuf
*p
,*q
,*r
;
46 case UIP_PBUF_TRANSPORT
:
47 offset
+= UIP_TRANSPORT_HLEN
;
49 offset
+= UIP_IP_HLEN
;
51 offset
+= UIP_LL_HLEN
;
56 UIP_ERROR("uip_pbuf_alloc: bad pbuf layer.\n");
62 p
= memb_alloc(&uip_pool_pbufs
);
64 UIP_ERROR("uip_pbuf_alloc: couldn't allocate pbuf(p) from pool\n");
69 p
->payload
= MEM_ALIGN((void*)((u8_t
*)p
+(sizeof(struct uip_pbuf
)+offset
)));
71 p
->len
= (len
>(UIP_PBUF_POOL_BUFSIZE
-offset
)?(UIP_PBUF_POOL_BUFSIZE
-offset
):len
);
72 p
->flags
= UIP_PBUF_FLAG_POOL
;
76 rem_len
= len
- p
->len
;
78 q
= memb_alloc(&uip_pool_pbufs
);
80 UIP_ERROR("uip_pbuf_alloc: couldn't allocate pbuf(q) from pool\n");
88 q
->len
= (rem_len
>UIP_PBUF_POOL_BUFSIZE
?UIP_PBUF_POOL_BUFSIZE
:rem_len
);
89 q
->payload
= (void*)((u8_t
*)q
+sizeof(struct uip_pbuf
));
90 q
->flags
= UIP_PBUF_FLAG_POOL
;
98 p
= memr_malloc(MEM_ALIGN_SIZE(sizeof(struct uip_pbuf
)+offset
)+MEM_ALIGN_SIZE(len
));
100 UIP_ERROR("uip_pbuf_alloc: couldn't allocate pbuf from ram\n");
103 p
->payload
= MEM_ALIGN((u8_t
*)p
+sizeof(struct uip_pbuf
)+offset
);
104 p
->len
= p
->tot_len
= len
;
106 p
->flags
= UIP_PBUF_FLAG_RAM
;
110 p
= memb_alloc(&uip_rom_pbufs
);
112 UIP_ERROR("uip_pbuf_alloc: couldn't allocate pbuf from rom/ref\n");
117 p
->len
= p
->tot_len
= len
;
118 p
->flags
= (flag
==UIP_PBUF_ROM
?UIP_PBUF_FLAG_ROM
:UIP_PBUF_FLAG_REF
);
121 UIP_ERROR("uip_pbuf_alloc: bad flag value.\n");
129 u8_t
uip_pbuf_free(struct uip_pbuf
*p
)
134 if(p
==NULL
) return 0;
141 if(p
->flags
==UIP_PBUF_FLAG_POOL
) {
142 memb_free(&uip_pool_pbufs
,p
);
143 } else if(p
->flags
==UIP_PBUF_FLAG_ROM
|| p
->flags
==UIP_PBUF_FLAG_REF
) {
144 memb_free(&uip_rom_pbufs
,p
);
156 void uip_pbuf_realloc(struct uip_pbuf
*p
,u16_t new_len
)
162 if(new_len
>=p
->tot_len
) return;
164 grow
= new_len
- p
->tot_len
;
167 while(rem_len
>q
->len
) {
173 if(q
->flags
==UIP_PBUF_FLAG_RAM
&& rem_len
!=q
->len
)
174 memr_realloc(q
,(u8_t
*)q
->payload
-(u8_t
*)q
+rem_len
);
179 if(q
->next
!=NULL
) uip_pbuf_free(q
->next
);
183 u8_t
uip_pbuf_header(struct uip_pbuf
*p
,s16_t hdr_size_inc
)
187 if(hdr_size_inc
==0 || p
==NULL
) return 0;
190 payload
= p
->payload
;
191 if(p
->flags
==UIP_PBUF_FLAG_POOL
|| p
->flags
==UIP_PBUF_FLAG_RAM
) {
192 p
->payload
= (u8_t
*)p
->payload
-hdr_size_inc
;
193 if((u8_t
*)p
->payload
<(u8_t
*)p
+sizeof(struct uip_pbuf
)) {
194 p
->payload
= payload
;
197 } else if(p
->flags
==UIP_PBUF_FLAG_ROM
|| p
->flags
==UIP_PBUF_FLAG_REF
) {
198 if(hdr_size_inc
<0 && hdr_size_inc
-p
->len
<=0) p
->payload
= (u8_t
*)p
->payload
-hdr_size_inc
;
201 p
->tot_len
+= hdr_size_inc
;
202 p
->len
+= hdr_size_inc
;
207 u8_t
uip_pbuf_clen(struct uip_pbuf
*p
)
219 void uip_pbuf_ref(struct uip_pbuf
*p
)
226 void uip_pbuf_cat(struct uip_pbuf
*h
,struct uip_pbuf
*t
)
230 if(h
==NULL
|| t
==NULL
) return;
232 for(p
=h
;p
->next
!=NULL
;p
=p
->next
) {
233 p
->tot_len
+= t
->tot_len
;
235 p
->tot_len
+= t
->tot_len
;
239 void uip_pbuf_queue(struct uip_pbuf
*p
,struct uip_pbuf
*n
)
241 if(p
==NULL
|| n
==NULL
|| p
==n
) return;
243 while(p
->next
!=NULL
) p
= p
->next
;
249 struct uip_pbuf
* uip_pbuf_dequeue(struct uip_pbuf
*p
)
254 if(p
==NULL
) return NULL
;
256 while(p
->tot_len
!=p
->len
) p
= p
->next
;
261 tail_gone
= uip_pbuf_free(q
);
263 return (tail_gone
>0?NULL
:q
);
266 void uip_pbuf_chain(struct uip_pbuf
*h
,struct uip_pbuf
*t
)
272 struct uip_pbuf
* uip_pbuf_dechain(struct uip_pbuf
*p
)
279 q
->tot_len
= p
->tot_len
- p
->len
;
283 tail_gone
= uip_pbuf_free(q
);
286 return (tail_gone
>0?NULL
:q
);