2 * netsniff-ng - the packet sniffing beast
3 * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
4 * Subject to the GPL, version 2.
16 /* invariant: head <= data <= tail */
22 struct protocol
*proto
;
25 static inline struct pkt_buff
*pkt_alloc(uint8_t *packet
, unsigned int len
)
27 struct pkt_buff
*pkt
= xmalloc(sizeof(*pkt
));
31 pkt
->tail
= packet
+ len
;
38 static inline void pkt_free(struct pkt_buff
*pkt
)
43 static inline unsigned int pkt_len(struct pkt_buff
*pkt
)
45 bug_on(!pkt
|| pkt
->data
> pkt
->tail
);
47 return pkt
->tail
- pkt
->data
;
50 static inline uint8_t *pkt_pull(struct pkt_buff
*pkt
, unsigned int len
)
54 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
56 if (len
<= pkt_len(pkt
)) {
61 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
66 static inline uint8_t *pkt_peek(struct pkt_buff
*pkt
)
68 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
73 static inline unsigned int pkt_trim(struct pkt_buff
*pkt
, unsigned int len
)
77 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
79 if (len
<= pkt_len(pkt
))
83 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
88 static inline uint8_t *pkt_pull_tail(struct pkt_buff
*pkt
, unsigned int len
)
92 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
94 if (len
<= pkt_len(pkt
)) {
102 static inline void pkt_set_proto(struct pkt_buff
*pkt
, struct hash_table
*table
,
105 bug_on(!pkt
|| !table
);
107 pkt
->proto
= (struct protocol
*) lookup_hash(key
, table
);
108 while (pkt
->proto
&& key
!= pkt
->proto
->key
)
109 pkt
->proto
= pkt
->proto
->next
;
112 #endif /* PKT_BUFF_H */