Skip to content

Commit

Permalink
ax25: Refactor to use private neighbour operations.
Browse files Browse the repository at this point in the history
AX25 already has it's own private arp cache operations to isolate
it's abuse of dev_rebuild_header to transmit packets.  Add a function
ax25_neigh_construct that will allow all of the ax25 devices to
force using these operations, so that the generic arp code does
not need to.

Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-hams@vger.kernel.org
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric W. Biederman authored and David S. Miller committed Mar 2, 2015
1 parent 46d4e47 commit 3b6a94b
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/net/hamradio/6pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ static const struct net_device_ops sp_netdev_ops = {
.ndo_stop = sp_close,
.ndo_start_xmit = sp_xmit,
.ndo_set_mac_address = sp_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

static void sp_setup(struct net_device *dev)
Expand All @@ -315,6 +316,7 @@ static void sp_setup(struct net_device *dev)

dev->addr_len = AX25_ADDR_LEN;
dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->tx_queue_len = 10;

/* Only activated in AX.25 mode */
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/baycom_epp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,7 @@ static const struct net_device_ops baycom_netdev_ops = {
.ndo_do_ioctl = baycom_ioctl,
.ndo_start_xmit = baycom_send_packet,
.ndo_set_mac_address = baycom_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

/*
Expand Down Expand Up @@ -1146,6 +1147,7 @@ static void baycom_probe(struct net_device *dev)
dev->header_ops = &ax25_header_ops;

dev->type = ARPHRD_AX25; /* AF_AX25 device */
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN;
dev->mtu = AX25_DEF_PACLEN; /* eth_mtu is the default */
dev->addr_len = AX25_ADDR_LEN; /* sizeof an ax.25 address */
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/bpqether.c
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ static const struct net_device_ops bpq_netdev_ops = {
.ndo_start_xmit = bpq_xmit,
.ndo_set_mac_address = bpq_set_mac_address,
.ndo_do_ioctl = bpq_ioctl,
.ndo_neigh_construct = ax25_neigh_construct,
};

static void bpq_setup(struct net_device *dev)
Expand All @@ -486,6 +487,7 @@ static void bpq_setup(struct net_device *dev)
#endif

dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN;
dev->mtu = AX25_DEF_PACLEN;
dev->addr_len = AX25_ADDR_LEN;
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/dmascc.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ module_exit(dmascc_exit);
static void __init dev_setup(struct net_device *dev)
{
dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN;
dev->mtu = 1500;
dev->addr_len = AX25_ADDR_LEN;
Expand All @@ -447,6 +448,7 @@ static const struct net_device_ops scc_netdev_ops = {
.ndo_start_xmit = scc_send_packet,
.ndo_do_ioctl = scc_ioctl,
.ndo_set_mac_address = scc_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

static int __init setup_adapter(int card_base, int type, int n)
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/hdlcdrv.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,7 @@ static const struct net_device_ops hdlcdrv_netdev = {
.ndo_start_xmit = hdlcdrv_send_packet,
.ndo_do_ioctl = hdlcdrv_ioctl,
.ndo_set_mac_address = hdlcdrv_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

/*
Expand Down Expand Up @@ -676,6 +677,7 @@ static void hdlcdrv_setup(struct net_device *dev)
dev->header_ops = &ax25_header_ops;

dev->type = ARPHRD_AX25; /* AF_AX25 device */
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN;
dev->mtu = AX25_DEF_PACLEN; /* eth_mtu is the default */
dev->addr_len = AX25_ADDR_LEN; /* sizeof an ax.25 address */
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/mkiss.c
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,7 @@ static const struct net_device_ops ax_netdev_ops = {
.ndo_stop = ax_close,
.ndo_start_xmit = ax_xmit,
.ndo_set_mac_address = ax_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

static void ax_setup(struct net_device *dev)
Expand All @@ -650,6 +651,7 @@ static void ax_setup(struct net_device *dev)
dev->hard_header_len = 0;
dev->addr_len = 0;
dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->tx_queue_len = 10;
dev->header_ops = &ax25_header_ops;
dev->netdev_ops = &ax_netdev_ops;
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/scc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1550,6 +1550,7 @@ static const struct net_device_ops scc_netdev_ops = {
.ndo_set_mac_address = scc_net_set_mac_address,
.ndo_get_stats = scc_net_get_stats,
.ndo_do_ioctl = scc_net_ioctl,
.ndo_neigh_construct = ax25_neigh_construct,
};

/* ----> Initialize device <----- */
Expand All @@ -1567,6 +1568,7 @@ static void scc_net_setup(struct net_device *dev)
dev->flags = 0;

dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN;
dev->mtu = AX25_DEF_PACLEN;
dev->addr_len = AX25_ADDR_LEN;
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/hamradio/yam.c
Original file line number Diff line number Diff line change
Expand Up @@ -1100,6 +1100,7 @@ static const struct net_device_ops yam_netdev_ops = {
.ndo_start_xmit = yam_send_packet,
.ndo_do_ioctl = yam_ioctl,
.ndo_set_mac_address = yam_set_mac_address,
.ndo_neigh_construct = ax25_neigh_construct,
};

static void yam_setup(struct net_device *dev)
Expand Down Expand Up @@ -1128,6 +1129,7 @@ static void yam_setup(struct net_device *dev)
dev->header_ops = &ax25_header_ops;

dev->type = ARPHRD_AX25;
dev->neigh_priv_len = sizeof(struct ax25_neigh_priv);
dev->hard_header_len = AX25_MAX_HEADER_LEN;
dev->mtu = AX25_MTU;
dev->addr_len = AX25_ADDR_LEN;
Expand Down
5 changes: 5 additions & 0 deletions include/net/ax25.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/atomic.h>
#include <net/neighbour.h>

#define AX25_T1CLAMPLO 1
#define AX25_T1CLAMPHI (30 * HZ)
Expand Down Expand Up @@ -366,7 +367,11 @@ int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *,
struct net_device *);

/* ax25_ip.c */
int ax25_neigh_construct(struct neighbour *neigh);
extern const struct header_ops ax25_header_ops;
struct ax25_neigh_priv {
struct neigh_ops ops;
};

/* ax25_out.c */
ax25_cb *ax25_send_frame(struct sk_buff *, int, ax25_address *, ax25_address *,
Expand Down
21 changes: 21 additions & 0 deletions net/ax25/ax25_ip.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,22 @@ static int ax25_rebuild_header(struct sk_buff *skb)
return 1;
}

int ax25_neigh_construct(struct neighbour *neigh)
{
/* This trouble could be saved if ax25 would right a proper
* dev_queue_xmit function.
*/
struct ax25_neigh_priv *priv = neighbour_priv(neigh);

if (neigh->tbl->family != AF_INET)
return -EINVAL;

priv->ops = *neigh->ops;
priv->ops.output = neigh_compat_output;
priv->ops.connected_output = neigh_compat_output;
return 0;
}

#else /* INET */

static int ax25_hard_header(struct sk_buff *skb, struct net_device *dev,
Expand All @@ -230,6 +246,10 @@ static int ax25_rebuild_header(struct sk_buff *skb)
return 1;
}

int ax25_neigh_construct(struct neighbour *neigh)
{
return 0;
}
#endif

const struct header_ops ax25_header_ops = {
Expand All @@ -238,4 +258,5 @@ const struct header_ops ax25_header_ops = {
};

EXPORT_SYMBOL(ax25_header_ops);
EXPORT_SYMBOL(ax25_neigh_construct);

0 comments on commit 3b6a94b

Please sign in to comment.