diff options
Diffstat (limited to 'net/ipv4/ipmr.c')
-rw-r--r-- | net/ipv4/ipmr.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 11700a4dcd95..438fab9c62a0 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -9,8 +9,6 @@ | |||
9 | * as published by the Free Software Foundation; either version | 9 | * as published by the Free Software Foundation; either version |
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * Version: $Id: ipmr.c,v 1.65 2001/10/31 21:55:54 davem Exp $ | ||
13 | * | ||
14 | * Fixes: | 12 | * Fixes: |
15 | * Michael Chastain : Incorrect size of copying. | 13 | * Michael Chastain : Incorrect size of copying. |
16 | * Alan Cox : Added the cache manager code | 14 | * Alan Cox : Added the cache manager code |
@@ -181,26 +179,20 @@ static int reg_vif_num = -1; | |||
181 | static int reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) | 179 | static int reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) |
182 | { | 180 | { |
183 | read_lock(&mrt_lock); | 181 | read_lock(&mrt_lock); |
184 | ((struct net_device_stats*)netdev_priv(dev))->tx_bytes += skb->len; | 182 | dev->stats.tx_bytes += skb->len; |
185 | ((struct net_device_stats*)netdev_priv(dev))->tx_packets++; | 183 | dev->stats.tx_packets++; |
186 | ipmr_cache_report(skb, reg_vif_num, IGMPMSG_WHOLEPKT); | 184 | ipmr_cache_report(skb, reg_vif_num, IGMPMSG_WHOLEPKT); |
187 | read_unlock(&mrt_lock); | 185 | read_unlock(&mrt_lock); |
188 | kfree_skb(skb); | 186 | kfree_skb(skb); |
189 | return 0; | 187 | return 0; |
190 | } | 188 | } |
191 | 189 | ||
192 | static struct net_device_stats *reg_vif_get_stats(struct net_device *dev) | ||
193 | { | ||
194 | return (struct net_device_stats*)netdev_priv(dev); | ||
195 | } | ||
196 | |||
197 | static void reg_vif_setup(struct net_device *dev) | 190 | static void reg_vif_setup(struct net_device *dev) |
198 | { | 191 | { |
199 | dev->type = ARPHRD_PIMREG; | 192 | dev->type = ARPHRD_PIMREG; |
200 | dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr) - 8; | 193 | dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr) - 8; |
201 | dev->flags = IFF_NOARP; | 194 | dev->flags = IFF_NOARP; |
202 | dev->hard_start_xmit = reg_vif_xmit; | 195 | dev->hard_start_xmit = reg_vif_xmit; |
203 | dev->get_stats = reg_vif_get_stats; | ||
204 | dev->destructor = free_netdev; | 196 | dev->destructor = free_netdev; |
205 | } | 197 | } |
206 | 198 | ||
@@ -209,8 +201,7 @@ static struct net_device *ipmr_reg_vif(void) | |||
209 | struct net_device *dev; | 201 | struct net_device *dev; |
210 | struct in_device *in_dev; | 202 | struct in_device *in_dev; |
211 | 203 | ||
212 | dev = alloc_netdev(sizeof(struct net_device_stats), "pimreg", | 204 | dev = alloc_netdev(0, "pimreg", reg_vif_setup); |
213 | reg_vif_setup); | ||
214 | 205 | ||
215 | if (dev == NULL) | 206 | if (dev == NULL) |
216 | return NULL; | 207 | return NULL; |
@@ -1170,8 +1161,8 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi) | |||
1170 | if (vif->flags & VIFF_REGISTER) { | 1161 | if (vif->flags & VIFF_REGISTER) { |
1171 | vif->pkt_out++; | 1162 | vif->pkt_out++; |
1172 | vif->bytes_out+=skb->len; | 1163 | vif->bytes_out+=skb->len; |
1173 | ((struct net_device_stats*)netdev_priv(vif->dev))->tx_bytes += skb->len; | 1164 | vif->dev->stats.tx_bytes += skb->len; |
1174 | ((struct net_device_stats*)netdev_priv(vif->dev))->tx_packets++; | 1165 | vif->dev->stats.tx_packets++; |
1175 | ipmr_cache_report(skb, vifi, IGMPMSG_WHOLEPKT); | 1166 | ipmr_cache_report(skb, vifi, IGMPMSG_WHOLEPKT); |
1176 | kfree_skb(skb); | 1167 | kfree_skb(skb); |
1177 | return; | 1168 | return; |
@@ -1230,8 +1221,8 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi) | |||
1230 | if (vif->flags & VIFF_TUNNEL) { | 1221 | if (vif->flags & VIFF_TUNNEL) { |
1231 | ip_encap(skb, vif->local, vif->remote); | 1222 | ip_encap(skb, vif->local, vif->remote); |
1232 | /* FIXME: extra output firewall step used to be here. --RR */ | 1223 | /* FIXME: extra output firewall step used to be here. --RR */ |
1233 | ((struct ip_tunnel *)netdev_priv(vif->dev))->stat.tx_packets++; | 1224 | vif->dev->stats.tx_packets++; |
1234 | ((struct ip_tunnel *)netdev_priv(vif->dev))->stat.tx_bytes+=skb->len; | 1225 | vif->dev->stats.tx_bytes += skb->len; |
1235 | } | 1226 | } |
1236 | 1227 | ||
1237 | IPCB(skb)->flags |= IPSKB_FORWARDED; | 1228 | IPCB(skb)->flags |= IPSKB_FORWARDED; |
@@ -1487,8 +1478,8 @@ int pim_rcv_v1(struct sk_buff * skb) | |||
1487 | skb->pkt_type = PACKET_HOST; | 1478 | skb->pkt_type = PACKET_HOST; |
1488 | dst_release(skb->dst); | 1479 | dst_release(skb->dst); |
1489 | skb->dst = NULL; | 1480 | skb->dst = NULL; |
1490 | ((struct net_device_stats*)netdev_priv(reg_dev))->rx_bytes += skb->len; | 1481 | reg_dev->stats.rx_bytes += skb->len; |
1491 | ((struct net_device_stats*)netdev_priv(reg_dev))->rx_packets++; | 1482 | reg_dev->stats.rx_packets++; |
1492 | nf_reset(skb); | 1483 | nf_reset(skb); |
1493 | netif_rx(skb); | 1484 | netif_rx(skb); |
1494 | dev_put(reg_dev); | 1485 | dev_put(reg_dev); |
@@ -1542,8 +1533,8 @@ static int pim_rcv(struct sk_buff * skb) | |||
1542 | skb->ip_summed = 0; | 1533 | skb->ip_summed = 0; |
1543 | skb->pkt_type = PACKET_HOST; | 1534 | skb->pkt_type = PACKET_HOST; |
1544 | dst_release(skb->dst); | 1535 | dst_release(skb->dst); |
1545 | ((struct net_device_stats*)netdev_priv(reg_dev))->rx_bytes += skb->len; | 1536 | reg_dev->stats.rx_bytes += skb->len; |
1546 | ((struct net_device_stats*)netdev_priv(reg_dev))->rx_packets++; | 1537 | reg_dev->stats.rx_packets++; |
1547 | skb->dst = NULL; | 1538 | skb->dst = NULL; |
1548 | nf_reset(skb); | 1539 | nf_reset(skb); |
1549 | netif_rx(skb); | 1540 | netif_rx(skb); |
@@ -1887,16 +1878,36 @@ static struct net_protocol pim_protocol = { | |||
1887 | * Setup for IP multicast routing | 1878 | * Setup for IP multicast routing |
1888 | */ | 1879 | */ |
1889 | 1880 | ||
1890 | void __init ip_mr_init(void) | 1881 | int __init ip_mr_init(void) |
1891 | { | 1882 | { |
1883 | int err; | ||
1884 | |||
1892 | mrt_cachep = kmem_cache_create("ip_mrt_cache", | 1885 | mrt_cachep = kmem_cache_create("ip_mrt_cache", |
1893 | sizeof(struct mfc_cache), | 1886 | sizeof(struct mfc_cache), |
1894 | 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, | 1887 | 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, |
1895 | NULL); | 1888 | NULL); |
1889 | if (!mrt_cachep) | ||
1890 | return -ENOMEM; | ||
1891 | |||
1896 | setup_timer(&ipmr_expire_timer, ipmr_expire_process, 0); | 1892 | setup_timer(&ipmr_expire_timer, ipmr_expire_process, 0); |
1897 | register_netdevice_notifier(&ip_mr_notifier); | 1893 | err = register_netdevice_notifier(&ip_mr_notifier); |
1894 | if (err) | ||
1895 | goto reg_notif_fail; | ||
1896 | #ifdef CONFIG_PROC_FS | ||
1897 | err = -ENOMEM; | ||
1898 | if (!proc_net_fops_create(&init_net, "ip_mr_vif", 0, &ipmr_vif_fops)) | ||
1899 | goto proc_vif_fail; | ||
1900 | if (!proc_net_fops_create(&init_net, "ip_mr_cache", 0, &ipmr_mfc_fops)) | ||
1901 | goto proc_cache_fail; | ||
1902 | #endif | ||
1903 | return 0; | ||
1904 | reg_notif_fail: | ||
1905 | kmem_cache_destroy(mrt_cachep); | ||
1898 | #ifdef CONFIG_PROC_FS | 1906 | #ifdef CONFIG_PROC_FS |
1899 | proc_net_fops_create(&init_net, "ip_mr_vif", 0, &ipmr_vif_fops); | 1907 | proc_vif_fail: |
1900 | proc_net_fops_create(&init_net, "ip_mr_cache", 0, &ipmr_mfc_fops); | 1908 | unregister_netdevice_notifier(&ip_mr_notifier); |
1909 | proc_cache_fail: | ||
1910 | proc_net_remove(&init_net, "ip_mr_vif"); | ||
1901 | #endif | 1911 | #endif |
1912 | return err; | ||
1902 | } | 1913 | } |