Getting ethernet dest hw_addr

From: Weber Matthias
Date: Thu Mar 17 2005 - 12:17:23 EST


Hi,

i want to write a packet handler for redirecting ethernet packets from an input device to an output device. actually my problem is to get the dest hw addr from the computer physically connected to mine.
the only way seems to restrict on ip packets since it seems that routing and arp needs to be used. so i tried to use ip_route_output_key which fills skb->dst. Unfortunately i don't have any idea how to get the needed addr from there. Below is a piece of code showing what i want to do.

Can anyone help me, please?
The favorite way would be to get the addr without limiting to ip...

Thanks and bye
Matthias

static int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) {
struct sk_buff *o_skb = skb_clone(skb, GFP_ATOMIC);
struct iphdr *iph = o_skb->nh.iph;
struct tcphdr *th = (struct tcphdr *) ((char *) o_skb->h.th + (iph->ihl << 2));

//prevent OS for handling packet
skb->pkt_type = PACKET_OTHERHOST;

if (iph->saddr == ext_addr) { //out->in
//modify header
iph->saddr = gw_int_addr;
iph->daddr = int_addr;
o_skb->dev = devs[2];
} else if (iph->saddr == int_addr) { //in->out
//modify header
iph->saddr = gw_ext_addr;
iph->daddr = ext_addr;
o_skb->dev = devs[1];
} else {
return 0;
}

//route packet
struct flowi flow = {
.nl_u = {
.ip4_u = {
.saddr = iph->saddr,
.daddr = iph->daddr,
.tos = RT_TOS(iph->tos)
}
},
.proto = iph->protocol
};
struct rtable *rt;
ip_route_output_key(&rt, &flow);
o_skb->dst = &(rt->u.dst);

//ip checksum
...works

//broadcast paket to dev -> no dest ethernet addr needed
o_skb->dev->hard_header(
o_skb,
o_skb->dev,
ntohs(o_skb->protocol),
o_skb->dst->neighbour->ha, //destination hw addr needed - seems to be wrong!
o_skb->dev->dev_addr,
o_skb->len
);

//send packet
o_skb->pkt_type = PACKET_OUTGOING;
dev_queue_xmit(o_skb);

kfree_skb(o_skb);

return 0;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/