skb_util.h

来自「xen虚拟机源代码安装包」· C头文件 代码 · 共 155 行

H
155
字号
/* * Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the  * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free software Foundation, Inc., * 59 Temple Place, suite 330, Boston, MA 02111-1307 USA * */#ifndef _VNET_SKB_UTIL_H_#define _VNET_SKB_UTIL_H_#ifdef __KERNEL__#include <net/route.h>#include <linux/skbuff.h>#else#include "skbuff.h"#endifstruct sk_buff;extern int skb_make_room(struct sk_buff **pskb, struct sk_buff *skb, int head_n, int tail_n);extern int skb_put_bits(const struct sk_buff *skb, int offset, void *src, int len);extern void skb_print_bits(const char *msg, struct sk_buff *skb, int offset, int n);extern void buf_print(char *buf, int n);extern void *skb_trim_tail(struct sk_buff *skb, int n);extern void print_skb_data(const char *msg, int count, struct sk_buff *skb, u8 *data, int len);extern void print_skb(const char *msg, int count, struct sk_buff *skb);extern void print_ethhdr(const char *msg, struct sk_buff *skb);extern void print_iphdr(const char *msg, struct sk_buff *skb);extern void print_udphdr(const char *msg, struct sk_buff *skb);/* The mac.ethernet field went away in 2.6 in favour of eth_hdr(). */#ifdef __KERNEL__#  if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)#    define NEED_ETH_HDR#  endif#else#  define NEED_ETH_HDR#endif#ifdef NEED_ETH_HDRstatic inline struct ethhdr *eth_hdr(const struct sk_buff *skb){	return (struct ethhdr *)skb->mac.raw;}#endif/* * It's a copy from {kernel}/include/linux/skbuff.h func '__skb_pull' and 'skb_pull' * to aviodthe BUG_ON when pulling into the data (getting forwarded ip-frames) */static inline unsigned char *__skb_pull_vn(struct sk_buff *skb, unsigned int len){        skb->len -= len;        //BUG_ON(skb->len < skb->data_len);        return skb->data += len;}static inline unsigned char *skb_pull_vn(struct sk_buff *skb, unsigned int len){        return unlikely(len > skb->len) ? NULL : __skb_pull_vn(skb, len);}#ifdef __KERNEL__struct scatterlist;extern int skb_scatterlist(struct sk_buff *skb, struct scatterlist *sg,                           int *sg_n, int offset, int len);#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)static inline int skb_route(struct sk_buff *skb, struct rtable **prt){    int err = 0;    struct flowi fl = {        .nl_u = {            .ip4_u = {                .daddr = skb->nh.iph->daddr,                .saddr = skb->nh.iph->saddr,                .tos   = skb->nh.iph->tos,            }        }    };        if(skb->dev){        fl.oif = skb->dev->ifindex;    }    err = ip_route_output_key(prt, &fl);    return err;}#elsestatic inline int skb_route(struct sk_buff *skb, struct rtable **prt){    int err = 0;    struct rt_key key = { };    key.dst = skb->nh.iph->daddr;    key.src = skb->nh.iph->saddr;    key.tos = skb->nh.iph->tos;    if(skb->dev){        key.oif = skb->dev->ifindex;    }    err = ip_route_output_key(prt, &key);    return err;}#endif#endif /* __KERNEL__ *//** Arp header struct with all the fields so we can access them. */struct arpheader{	unsigned short	ar_hrd;		/* format of hardware address	*/	unsigned short	ar_pro;		/* format of protocol address	*/	unsigned char	ar_hln;		/* length of hardware address	*/	unsigned char	ar_pln;		/* length of protocol address	*/	unsigned short	ar_op;		/* ARP opcode (command)		*/#if 1	 /*	  *	 Ethernet looks like this : This bit is variable sized however...	  */	unsigned char		ar_sha[ETH_ALEN];	/* sender hardware address	*/	unsigned char		ar_sip[4];		/* sender IP address		*/	unsigned char		ar_tha[ETH_ALEN];	/* target hardware address	*/	unsigned char		ar_tip[4];		/* target IP address		*/#endif};#endif /* ! _VNET_SKB_UTIL_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?