BSD网络协议簇中若干重要结构。



struct ifnet{ //网络接口
//实现信息
struct infnet *if_next; //指向下一个ifnet结构的指针
struct ifaddr *if_addrlist; //指向本结构ifaddr列表的指针
char *if_name; //标示接口类型
short if_unit; //标示相同借口类型的不同实例
u_short if_index; //内核内ifnet唯一标示
short if_flags; //接口的操作状态和属性 卷2P57
short if_timer; //定时内核为此借口调用函数if_watchdog
int if_pcount;
caddr_t if_bpf; //支持BSD分组过滤器
//if_date 硬件信息
u_char if_type; //接口支持的硬件地址类型(以太网、令牌环,回环,SLIP)
u_long if_mtu; //接口传输单元的最大值(以太网为1500字节)
u_char if_addrlen; //数据链路地址的长度(以太网为6字节)
u_char if_hdrlen; //硬件附加给分组首部的长度(以太网为14字节)
u_long if_metric;
u_long if_baudrate; //接口传输速率(只有SLIP才设置)
//if_date 接口统计
u_long if_ipackets; //收到的分组数
u_long if_ierrors; //收到分组里面的错误数
u_long if_opackets; //发送的分组数
u_long if_oerrors; //发送分组里面的错误数
u_long if_collisions; //发生冲突次数
u_long if_ibytes; //收到的byte数
u_long if_obytes; //发送的byte数
u_long if_imcasts; //通过广播收到的分组数
u_long if_omcasts; //通过广播发送的分组数
u_long if_iqdrops; //丢弃的分组数(仅供SLIP使用)
u_long if_noproto; //协议不支持分组数
struct timecal if_lastchange; //纪录任何统计数据改变的最近时间
……………… 以及一些其他统计信息(略)
//接口层函数指针
int (*if_init)(int); //接口初始化
int (*if_output)(struct ifnet *,struct mbuf *,struct addr *,struct rtentry *);
//将mbuf排入输出队列
int (*if_start)(struct ifnet *); //初始化输出队列
int (*if_done)(struct ifnet *); //输出全部队列
int (*if_ioctl)(struct ifnet *,int,caddr_t);
//接口I/O控制命令
int (*if_reset)(int); //重新复位接口
int (*if_watchdog)(int); //周期性接口例程
//if_snd 输出队列
struct ifqueue{
struct mbuf *ifq_head; //mbuf链表头
struct mbuf *ifq_tail; //mbuf链表尾
int ifq_len; //输出队列当前长度
int ifq_maxlen; //输出队列最大长度
int ifq_drops; //由于输出队列满而丢弃的分组数
}if_snd;
}





struct ifaddr{ //接口地址结构
struct ifaddr *ifa_next; //接口的下一个地址
struct ifnet *ifa_ifp; //该地址所属接口(双向链表)
struct sockaddr *ifa_addr; //接口地址
struct sockaddr *ifa_dstaddr; //点对点链路另一端地址
#define ifa_broadaddr ifa_dstaddr //或者为广播地址
struct sockaddr *ifa_netmask; //子网号
void (*ifa_rtrequest)(); //检查路由
u_short ifa_flags; //地址标志
short ifa_refcnt; //统计对ifaddr的引用总数(为0时此地址才能释放)
int ifa_metric;
}





struct sockaddr{ //地址存储结构
u_char sa_len; //地址长度16字节
u_char sa_family; //地址所属协议
char sa_data[14]; //地址值
}





struct arpcom{
struct ifnet ac_if; //ifnet结构
u_char ac_enaddr[6]; //以太网硬件地址
struct in_addr ac_ipaddr; //ip地址的拷贝
struct ether_multi *ac_multiaddrs; //多播地址列表
int ac_multicnt; //多播地址列表长度
}





struct le_softc{ //以太网专用化ifnet结构
struct arpcom sc_ac; //arpcom结构
#define sc_if sc_ac.ac_if
#define sc_addr sc_ac.ac_enaddr
}





struct sl_softc{
struct ifnet sc_if; //ifnet结构
struct ifqueue sc_fastq; //快速输出队列
struct tty *sc_ttyp; //tty结构指针
u_char *sc_mp; //下一个可用buf的头指针
u_char *sc_ep; //最后一个可用buf指针
u_char *sc_buf; //当前buf指针
u_int sc_flags; //SLIP接口特性
u_int sc_escape; //上一个字符是否是转义字符
struct slcompress sc_comp; //TCP头部压缩信息
caddr_t sc_bpf; //bpf信息
}





struct sockaddr_dl{
u_char sdl_len; //地址总长度
u_char sdl_family; //地址所属族类
u_short sdl_index; //内核中标示接口
u_char sdl_type; //根据ifnet中if_type初始化
u_char sdl_nlen; //sdl_data里面名字的长度(如sl0,sl1)
u_char sdl_alen; //硬件地址长度(在sdl_data里面名字部分后)
u_char sdl_slen; //不使用
char sdl_data[12]; //数据部分
}




########## IP专用结构 ##########

struct in_addr{
u_long s_addr; //存放32位ip地址的整数形式
}

struct sockaddr_in{ //IP专用sockaddr结构,长度与sockaddr相同!
u_char sin_len; //地址长度16字节
u_char sin_family; //地址族类AF_INET
u_short sin_port; //端口号
struct in_addr sin_addr;
char sin_zero[8]; //未用,全0
}





struct in_ifaddr{ //IP专用ifaddr结构
struct ifaddr ia_ifa;
#define ia_ifp ia_ifa.ifa_ifp //所属ifnet结构
#define ia_flags ia_ifa.ifa_flags //地址标志
struct in_ifaddr *ia_next; //指向下一个in_ifaddr
u_long ia_net; //网络号(严格按照A,B,C类划分)
u_long ia_netmark; //网络掩码
u_long ia_subnet; //子网号(自定义划分)
u_long ia_subnetmaskt; //子网的掩码
struct in_addr ia_netboradcast; //广播网
struct sockaddr_in ia_addr; //接口名
struct sockaddr_in ia_dstaddr; //对点地址SLIP,回环专用
#define ia_broadaddr ia_dstaddr //子网内广播地址
struct sockaddr_in ia_sockmask; //同ia_subnetmaskt,但不是使用整形表示,而是使用网络字节序表示
struct in_multi *ia_multiaddrs; //多播网地址指针
}





########## 接口信息结构(查询用) ##########

struct ifreq{
#define IFNAMSIZ 16
char ifr_name[IFNAMSIZ]; //接口名(如sl0,sl1,en0)
union{
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
}ifr_ifru; //接口信息(只能取其一项,见union)
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
#define ifr_flags ifr_ifru.ifru_flag
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_data ifr_ifru.ifru_data
}





struct ifconf{
int ifc_len;
union{
caddr_t ifcu_buf;
struct ifreq *ifcu_req; //指向一个ifreq结构
}ifc_ifcu;
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值