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
*dissector
;
24 struct sockaddr_ll
*sll
;
27 static inline struct pkt_buff
*pkt_alloc(uint8_t *packet
, unsigned int len
)
29 struct pkt_buff
*pkt
= xmalloc(sizeof(*pkt
));
33 pkt
->tail
= packet
+ len
;
35 pkt
->dissector
= NULL
;
40 static inline void pkt_free(struct pkt_buff
*pkt
)
45 static inline unsigned int pkt_len(struct pkt_buff
*pkt
)
47 bug_on(!pkt
|| pkt
->data
> pkt
->tail
);
49 return pkt
->tail
- pkt
->data
;
52 static inline uint8_t *pkt_pull(struct pkt_buff
*pkt
, unsigned int len
)
56 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
58 if (len
<= pkt_len(pkt
)) {
63 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
68 static inline uint8_t *pkt_peek(struct pkt_buff
*pkt
)
70 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
75 static inline unsigned int pkt_trim(struct pkt_buff
*pkt
, unsigned int len
)
79 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
81 if (len
<= pkt_len(pkt
))
85 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
90 static inline uint8_t *pkt_pull_tail(struct pkt_buff
*pkt
, unsigned int len
)
94 bug_on(!pkt
|| pkt
->head
> pkt
->data
|| pkt
->data
> pkt
->tail
);
96 if (len
<= pkt_len(pkt
)) {
104 static inline void pkt_set_dissector(struct pkt_buff
*pkt
, struct hash_table
*table
,
107 bug_on(!pkt
|| !table
);
109 pkt
->dissector
= lookup_hash(key
, table
);
110 while (pkt
->dissector
&& key
!= pkt
->dissector
->key
)
111 pkt
->dissector
= pkt
->dissector
->next
;
114 #endif /* PKT_BUFF_H */