基于内核2.6.29
dst_output函数调用skb-.dst->output,这个函数指针实际初始化为ip_output函数
dst->hh发送数据包是判断arp缓存是否存在如果存在就调用hh->hh_ouput,这个实际就是dev_queue_xmit。如果arp缓存不存在那么就调用negh_resolve_output,这个函数里面会调用neigh_event_send发送arp请求获取mac,然后调用函数dev_hard_header填充mac地址,然后嗲用neigh->opt->queue_xmit,这个函数指针实际定义为dev_queue_xmit函数。
hh_ouput初始化:
neigh_resolve_output
static struct neigh_ops arp_hh_ops = {
.family = AF_INET,
.solicit = arp_solicit,
.error_report = arp_error_report,
.output = neigh_resolve_output,
.connected_output = neigh_resolve_output,
.hh_output = dev_queue_xmit,
.queue_xmit = dev_queue_xmit,
};
neigh->opt->queue_xmit初始化:
static struct neigh_ops arp_hh_ops = {
.family = AF_INET,
.solicit = arp_solicit,
.error_report = arp_error_report,
.output = neigh_resolve_output,
.connected_output = neigh_resolve_output,
.hh_output = dev_queue_xmit,
.queue_xmit = dev_queue_xmit,
};