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
;
26 static inline struct pkt_buff
*pkt_alloc(uint8_t *packet
, unsigned int len
)
28 struct pkt_buff
*pkt
= xmalloc(sizeof(*pkt
));
32 pkt
->tail
= packet
+ len
;
39 static inline void pkt_free(struct pkt_buff
*pkt
)
44 static inline unsigned int pkt_len(struct pkt_buff
*pkt
)
46 bug_on(!pkt
|| pkt
->data
> pkt
->tail
);
48 return pkt
->tail
- pkt
->data
;
51 static inline uint8_t *pkt_pull(struct pkt_buff
*pkt
, unsigned int len
)
55 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
57 if (len
<= pkt_len(pkt
)) {
62 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
67 static inline uint8_t *pkt_peek(struct pkt_buff
*pkt
)
69 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
74 static inline unsigned int pkt_trim(struct pkt_buff
*pkt
, unsigned int len
)
78 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
80 if (len
<= pkt_len(pkt
))
84 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
89 static inline uint8_t *pkt_pull_tail(struct pkt_buff
*pkt
, unsigned int len
)
93 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
95 if (len
<= pkt_len(pkt
)) {
103 static inline void pkt_set_proto(struct pkt_buff
*pkt
, struct hash_table
*table
,
106 bug_on(!pkt
|| !table
);
108 pkt
->proto
= lookup_hash(key
, table
);
109 while (pkt
->proto
&& key
!= pkt
->proto
->key
)
110 pkt
->proto
= pkt
->proto
->next
;
113 #endif /* PKT_BUFF_H */