16 #include <netinet/if_ether.h>
17 #include <netinet/ip.h>
18 #include <netinet/tcp.h>
44 pktb_alloc(
int family,
void *data,
size_t len,
size_t extra)
46 struct pkt_buff *pktb;
49 pktb = calloc(1,
sizeof(
struct pkt_buff) + len + extra);
54 pkt_data = (uint8_t *)pktb +
sizeof(
struct pkt_buff);
55 memcpy(pkt_data, data, len);
58 pktb->data_len = len + extra;
60 pktb->head = pkt_data;
61 pktb->data = pkt_data;
62 pktb->tail = pktb->head + len;
66 pktb->network_header = pktb->data;
69 struct ethhdr *ethhdr = (
struct ethhdr *)pktb->data;
71 pktb->mac_header = pktb->data;
73 switch(ethhdr->h_proto) {
75 pktb->network_header = pktb->data + ETH_HLEN;
145 void pktb_put(
struct pkt_buff *pktb,
unsigned int len)
168 return pktb->data_len - pktb->len;
178 return pktb->mac_header;
188 return pktb->network_header;
198 return pktb->transport_header;
202 static int pktb_expand_tail(
struct pkt_buff *pkt,
int extra)
208 if (pkt->len + extra > pkt->data_len)
212 pkt->tail = pkt->tail + extra;
216 static int enlarge_pkt(
struct pkt_buff *pkt,
unsigned int extra)
218 if (pkt->len + extra > 65535)
227 int pktb_mangle(
struct pkt_buff *pkt,
228 unsigned int dataoff,
229 unsigned int match_offset,
230 unsigned int match_len,
231 const char *rep_buffer,
232 unsigned int rep_len)
236 if (rep_len > match_len &&
238 !enlarge_pkt(pkt, rep_len - match_len))
241 data = pkt->network_header + dataoff;
244 memmove(data + match_offset + rep_len,
245 data + match_offset + match_len,
246 pkt->tail - (pkt->network_header + dataoff +
247 match_offset + match_len));
250 memcpy(data + match_offset, rep_buffer, rep_len);
253 if (rep_len > match_len)
256 pktb_trim(pkt, pkt->len + rep_len - match_len);
261 EXPORT_SYMBOL(pktb_mangle);
void pktb_pull(struct pkt_buff *pktb, unsigned int len)
uint8_t * pktb_network_header(struct pkt_buff *pktb)
uint8_t * pktb_data(struct pkt_buff *pktb)
bool pktb_mangled(const struct pkt_buff *pkt)
unsigned int pktb_tailroom(struct pkt_buff *pktb)
struct pkt_buff * pktb_alloc(int family, void *data, size_t len, size_t extra)
void pktb_put(struct pkt_buff *pktb, unsigned int len)
uint8_t * pktb_mac_header(struct pkt_buff *pktb)
void pktb_trim(struct pkt_buff *pktb, unsigned int len)
void pktb_push(struct pkt_buff *pktb, unsigned int len)
void pktb_free(struct pkt_buff *pktb)
uint32_t pktb_len(struct pkt_buff *pktb)
uint8_t * pktb_transport_header(struct pkt_buff *pktb)