Commit a4d37b10 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/home/davem/BK/net-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 63f29ea2 bc5359b2
...@@ -141,7 +141,7 @@ DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o ...@@ -141,7 +141,7 @@ DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o
DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o
DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a
DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o
DRIVERS-$(CONFIG_APPLETALK) += drivers/net/appletalk/appletalk.o DRIVERS-$(CONFIG_DEV_APPLETALK) += drivers/net/appletalk/appletalk.o
DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o
DRIVERS-$(CONFIG_WAN) += drivers/net/wan/wan.o DRIVERS-$(CONFIG_WAN) += drivers/net/wan/wan.o
DRIVERS-$(CONFIG_ARCNET) += drivers/net/arcnet/arcnetdrv.o DRIVERS-$(CONFIG_ARCNET) += drivers/net/arcnet/arcnetdrv.o
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
# #
source drivers/net/arcnet/Config.in source drivers/net/arcnet/Config.in
source drivers/net/appletalk/Config.in
tristate 'Dummy net driver support' CONFIG_DUMMY tristate 'Dummy net driver support' CONFIG_DUMMY
tristate 'Bonding driver support' CONFIG_BONDING tristate 'Bonding driver support' CONFIG_BONDING
......
...@@ -41,7 +41,7 @@ subdir-$(CONFIG_TR) += tokenring ...@@ -41,7 +41,7 @@ subdir-$(CONFIG_TR) += tokenring
subdir-$(CONFIG_WAN) += wan subdir-$(CONFIG_WAN) += wan
subdir-$(CONFIG_NET_FC) += fc subdir-$(CONFIG_NET_FC) += fc
subdir-$(CONFIG_ARCNET) += arcnet subdir-$(CONFIG_ARCNET) += arcnet
subdir-$(CONFIG_APPLETALK) += appletalk subdir-$(CONFIG_DEV_APPLETALK) += appletalk
subdir-$(CONFIG_SK98LIN) += sk98lin subdir-$(CONFIG_SK98LIN) += sk98lin
subdir-$(CONFIG_SKFP) += skfp subdir-$(CONFIG_SKFP) += skfp
......
CONFIG_APPLETALK CONFIG_DEV_APPLETALK
AppleTalk is the way Apple computers speak to each other on a AppleTalk is the protocol that Apple computers can use to communicate
network. If your Linux box is connected to such a network and you on a network. If your Linux box is connected to such a network, and wish
want to join the conversation, say Y. to do IP over it, or you have a LocalTalk card and wish to use it to
connect to the AppleTalk network, say Y.
CONFIG_IPDDP CONFIG_IPDDP
This allows IP networking for users who only have AppleTalk This allows IP networking for users who only have AppleTalk
networking available. This feature is experimental. With this networking available. This feature is experimental. With this
......
...@@ -2,22 +2,20 @@ ...@@ -2,22 +2,20 @@
# Appletalk driver configuration # Appletalk driver configuration
# #
if [ "$CONFIG_ATALK" != "n" ]; then mainmenu_option next_comment
mainmenu_option next_comment comment 'Appletalk devices'
comment 'Appletalk devices' dep_mbool 'Appletalk interfaces support' CONFIG_DEV_APPLETALK $CONFIG_ATALK
bool 'Appletalk interfaces support' CONFIG_APPLETALK if [ "$CONFIG_DEV_APPLETALK" = "y" ]; then
if [ "$CONFIG_ATALK" != "n" ]; then tristate ' Apple/Farallon LocalTalk PC support' CONFIG_LTPC
dep_tristate ' Apple/Farallon LocalTalk PC support' CONFIG_LTPC $CONFIG_DEV_APPLETALK tristate ' COPS LocalTalk PC support' CONFIG_COPS
dep_tristate ' COPS LocalTalk PC support' CONFIG_COPS $CONFIG_DEV_APPLETALK if [ "$CONFIG_COPS" != "n" ]; then
if [ "$CONFIG_COPS" != "n" ]; then bool ' Dayna firmware support' CONFIG_COPS_DAYNA $CONFIG_COPS
bool ' Dayna firmware support' CONFIG_COPS_DAYNA bool ' Tangent firmware support' CONFIG_COPS_TANGENT $CONFIG_COPS
bool ' Tangent firmware support' CONFIG_COPS_TANGENT fi
fi dep_tristate ' Appletalk-IP driver support' CONFIG_IPDDP $CONFIG_ATALK
dep_tristate ' Appletalk-IP driver support' CONFIG_IPDDP $CONFIG_DEV_APPLETALK if [ "$CONFIG_IPDDP" != "n" ]; then
if [ "$CONFIG_IPDDP" != "n" ]; then bool ' IP to Appletalk-IP Encapsulation support' CONFIG_IPDDP_ENCAP $CONFIG_IPDDP
bool ' IP to Appletalk-IP Encapsulation support' CONFIG_IPDDP_ENCAP bool ' Appletalk-IP to IP Decapsulation support' CONFIG_IPDDP_DECAP $CONFIG_IPDDP
bool ' Appletalk-IP to IP Decapsulation support' CONFIG_IPDDP_DECAP
fi
fi fi
endmenu
fi fi
endmenu
...@@ -52,8 +52,8 @@ ...@@ -52,8 +52,8 @@
#define DRV_MODULE_NAME "tg3" #define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": " #define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "0.96" #define DRV_MODULE_VERSION "0.98"
#define DRV_MODULE_RELDATE "Mar 6, 2002" #define DRV_MODULE_RELDATE "Mar 28, 2002"
#define TG3_DEF_MAC_MODE 0 #define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0 #define TG3_DEF_RX_MODE 0
...@@ -3206,12 +3206,19 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) ...@@ -3206,12 +3206,19 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
/* Now startup only the RX cpu. */ /* Now startup only the RX cpu. */
tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
tw32(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR); tw32(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
/* Flush posted writes. */
tr32(RX_CPU_BASE + CPU_PC);
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR) if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR)
break; break;
tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
tw32(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR); tw32(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
/* Flush posted writes. */
tr32(RX_CPU_BASE + CPU_PC);
udelay(1000); udelay(1000);
} }
if (i >= 5) { if (i >= 5) {
...@@ -3224,6 +3231,9 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) ...@@ -3224,6 +3231,9 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
tw32(RX_CPU_BASE + CPU_MODE, 0x00000000); tw32(RX_CPU_BASE + CPU_MODE, 0x00000000);
/* Flush posted writes. */
tr32(RX_CPU_BASE + CPU_MODE);
return 0; return 0;
} }
......
...@@ -2680,18 +2680,20 @@ static void process_route (sdla_t *card) ...@@ -2680,18 +2680,20 @@ static void process_route (sdla_t *card)
printk(KERN_INFO "%s: Dynamic route failure.\n",card->devname); printk(KERN_INFO "%s: Dynamic route failure.\n",card->devname);
if(card->u.c.slarp_timer) { if(card->u.c.slarp_timer) {
u32 addr_net = htonl(chdlc_priv_area->IP_address);
printk(KERN_INFO "%s: Bad IP address %s received\n", printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u received\n",
card->devname, card->devname,
in_ntoa(ntohl(chdlc_priv_area->IP_address))); NIPQUAD(addr_net));
printk(KERN_INFO "%s: from remote station.\n", printk(KERN_INFO "%s: from remote station.\n",
card->devname); card->devname);
}else{ }else{
u32 addr_net = htonl(chdlc_priv_area->IP_address);
printk(KERN_INFO "%s: Bad IP address %s issued\n", printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u issued\n",
card->devname, card->devname,
in_ntoa(ntohl(chdlc_priv_area->IP_address))); NIPQUAD(addr_net));
printk(KERN_INFO "%s: to remote station. Local\n", printk(KERN_INFO "%s: to remote station. Local\n",
card->devname); card->devname);
printk(KERN_INFO "%s: IP address must be A.B.C.1\n", printk(KERN_INFO "%s: IP address must be A.B.C.1\n",
...@@ -2810,16 +2812,16 @@ static void process_route (sdla_t *card) ...@@ -2810,16 +2812,16 @@ static void process_route (sdla_t *card)
} }
if(err) { if(err) {
printk(KERN_INFO "%s: Add route %s failed (%d)\n", printk(KERN_INFO "%s: Add route %u.%u.%u.%u failed (%d)\n",
card->devname, in_ntoa(remote_IP_addr), err); card->devname, NIPQUAD(remote_IP_addr), err);
} else { } else {
((chdlc_private_area_t *)dev->priv)->route_status = ROUTE_ADDED; ((chdlc_private_area_t *)dev->priv)->route_status = ROUTE_ADDED;
printk(KERN_INFO "%s: Dynamic route added.\n", printk(KERN_INFO "%s: Dynamic route added.\n",
card->devname); card->devname);
printk(KERN_INFO "%s: Local IP addr : %s\n", printk(KERN_INFO "%s: Local IP addr : %u.%u.%u.%u\n",
card->devname, in_ntoa(local_IP_addr)); card->devname, NIPQUAD(local_IP_addr));
printk(KERN_INFO "%s: Remote IP addr: %s\n", printk(KERN_INFO "%s: Remote IP addr: %u.%u.%u.%u\n",
card->devname, in_ntoa(remote_IP_addr)); card->devname, NIPQUAD(remote_IP_addr));
chdlc_priv_area->route_removed = 0; chdlc_priv_area->route_removed = 0;
} }
break; break;
...@@ -2851,13 +2853,13 @@ static void process_route (sdla_t *card) ...@@ -2851,13 +2853,13 @@ static void process_route (sdla_t *card)
if(err) { if(err) {
printk(KERN_INFO printk(KERN_INFO
"%s: Remove route %s failed, (err %d)\n", "%s: Remove route %s failed, (err %d)\n",
card->devname, in_ntoa(remote_IP_addr), card->devname, NIPQUAD(remote_IP_addr),
err); err);
} else { } else {
((chdlc_private_area_t *)dev->priv)->route_status = ((chdlc_private_area_t *)dev->priv)->route_status =
NO_ROUTE; NO_ROUTE;
printk(KERN_INFO "%s: Dynamic route removed: %s\n", printk(KERN_INFO "%s: Dynamic route removed: %u.%u.%u.%u\n",
card->devname, in_ntoa(local_IP_addr)); card->devname, NIPQUAD(local_IP_addr));
chdlc_priv_area->route_removed = 1; chdlc_priv_area->route_removed = 1;
} }
break; break;
......
...@@ -152,7 +152,6 @@ ...@@ -152,7 +152,6 @@
#include <asm/io.h> /* for inb(), outb(), etc. */ #include <asm/io.h> /* for inb(), outb(), etc. */
#include <linux/time.h> /* for do_gettimeofday */ #include <linux/time.h> /* for do_gettimeofday */
#include <linux/in.h> /* sockaddr_in */ #include <linux/in.h> /* sockaddr_in */
#include <linux/inet.h> /* in_ntoa(), etc... */
#include <asm/errno.h> #include <asm/errno.h>
#include <linux/ip.h> #include <linux/ip.h>
...@@ -2809,16 +2808,15 @@ static void process_route (netdevice_t *dev) ...@@ -2809,16 +2808,15 @@ static void process_route (netdevice_t *dev)
set_fs(fs); /* restore old block */ set_fs(fs); /* restore old block */
if (err) { if (err) {
printk(KERN_INFO printk(KERN_INFO
"%s: Route Add failed. Error: %d\n", "%s: Route Add failed. Error: %d\n",
card->devname,err); card->devname,err);
printk(KERN_INFO "%s: Address: %s\n", printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
chan->name, in_ntoa(chan->ip_remote)); chan->name, NIPQUAD(chan->ip_remote));
}else { }else {
printk(KERN_INFO "%s: Route Added Successfully: %s\n", printk(KERN_INFO "%s: Route Added Successfully: %u.%u.%u.%U\n",
card->devname,in_ntoa(chan->ip_remote)); card->devname,NIPQUAD(chan->ip_remote));
chan->route_flag = ROUTE_ADDED; chan->route_flag = ROUTE_ADDED;
} }
break; break;
...@@ -2841,17 +2839,15 @@ static void process_route (netdevice_t *dev) ...@@ -2841,17 +2839,15 @@ static void process_route (netdevice_t *dev)
set_fs(fs); set_fs(fs);
if (err) { if (err) {
printk(KERN_INFO printk(KERN_INFO
"%s: Deleting of route failed. Error: %d\n", "%s: Deleting of route failed. Error: %d\n",
card->devname,err); card->devname,err);
printk(KERN_INFO "%s: Address: %s\n", printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
dev->name,in_ntoa(chan->ip_remote) ); dev->name,NIPQUAD(chan->ip_remote) );
} else { } else {
printk(KERN_INFO "%s: Route Removed Sucessfuly: %u.%u.%u.%u\n",
printk(KERN_INFO "%s: Route Removed Sucessfuly: %s\n", card->devname,NIPQUAD(ip_tmp));
card->devname,in_ntoa(ip_tmp));
chan->route_flag = NO_ROUTE; chan->route_flag = NO_ROUTE;
} }
break; break;
...@@ -2887,8 +2883,8 @@ static void process_route (netdevice_t *dev) ...@@ -2887,8 +2883,8 @@ static void process_route (netdevice_t *dev)
if (err) { if (err) {
printk(KERN_INFO "%s: Adding of route failed. Error: %d\n", printk(KERN_INFO "%s: Adding of route failed. Error: %d\n",
card->devname,err); card->devname,err);
printk(KERN_INFO "%s: Address: %s\n", printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
chan->name, in_ntoa(dev->pa_dstaddr) ); chan->name, NIPQUAD(dev->pa_dstaddr) );
} }
else { else {
chan->route_flag = ROUTE_ADDED; chan->route_flag = ROUTE_ADDED;
...@@ -2902,11 +2898,10 @@ static void process_route (netdevice_t *dev) ...@@ -2902,11 +2898,10 @@ static void process_route (netdevice_t *dev)
set_fs(fs); /* restore old block */ set_fs(fs); /* restore old block */
if (err) { if (err) {
printk(KERN_INFO "%s: Deleting of route failed. Error: %d\n", printk(KERN_INFO "%s: Deleting of route failed. Error: %d\n",
card->devname,err); card->devname,err);
printk(KERN_INFO "%s: Address: %s\n", printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
dev->name,in_ntoa(dev->pa_dstaddr) ); dev->name,NIPQUAD(dev->pa_dstaddr) );
} else { } else {
printk(KERN_INFO "%s: Removed route.\n", printk(KERN_INFO "%s: Removed route.\n",
...@@ -4337,8 +4332,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev) ...@@ -4337,8 +4332,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
case 0x08: // Inverse ARP request -- Send Reply, add route. case 0x08: // Inverse ARP request -- Send Reply, add route.
/* Check for valid Address */ /* Check for valid Address */
printk(KERN_INFO "%s: Recvd PtP addr -InArp Req: %s\n", printk(KERN_INFO "%s: Recvd PtP addr -InArp Req: %u.%u.%u.%u\n",
card->devname, in_ntoa(arphdr->ar_sip)); card->devname, NIPQUAD(arphdr->ar_sip));
/* Check that the network address is the same as ours, only /* Check that the network address is the same as ours, only
...@@ -4348,15 +4343,14 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev) ...@@ -4348,15 +4343,14 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
if (in_dev->ifa_list->ifa_mask != 0xFFFFFFFF && if (in_dev->ifa_list->ifa_mask != 0xFFFFFFFF &&
(in_dev->ifa_list->ifa_mask & arphdr->ar_sip) != (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) !=
(in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)){ (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)){
printk(KERN_INFO printk(KERN_INFO
"%s: Invalid PtP address. %s InARP ignored.\n", "%s: Invalid PtP address. %u.%u.%u.%u InARP ignored.\n",
card->devname,in_ntoa(arphdr->ar_sip)); card->devname,NIPQUAD(arphdr->ar_sip));
printk(KERN_INFO "%s: mask %s\n", printk(KERN_INFO "%s: mask %u.%u.%u.%u\n",
card->devname, in_ntoa(in_dev->ifa_list->ifa_mask)); card->devname, NIPQUAD(in_dev->ida_list->ifa_mask));
printk(KERN_INFO "%s: local %s\n", printk(KERN_INFO "%s: local %u.%u.%u.%u\n",
card->devname,in_ntoa(in_dev->ifa_list->ifa_local)); card->devname,NIPQUAD(in_dev->ida_list->ifa_local));
return -1; return -1;
} }
...@@ -4401,8 +4395,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev) ...@@ -4401,8 +4395,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
case 0x09: // Inverse ARP reply case 0x09: // Inverse ARP reply
/* Check for valid Address */ /* Check for valid Address */
printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Reply\n", printk(KERN_INFO "%s: Recvd PtP addr %u.%u.%u.%u -InArp Reply\n",
card->devname, in_ntoa(arphdr->ar_sip)); card->devname, NIPQUAD(arphdr->ar_sip));
/* Compare network addresses, only if network mask /* Compare network addresses, only if network mask
...@@ -4450,8 +4444,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev) ...@@ -4450,8 +4444,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
case 0x08: // Inverse ARP request -- Send Reply, add route. case 0x08: // Inverse ARP request -- Send Reply, add route.
/* Check for valid Address */ /* Check for valid Address */
printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Req\n", printk(KERN_INFO "%s: Recvd PtP addr %u.%u.%u.%u -InArp Req\n",
((fr_channel_t *)dev->priv)->name, in_ntoa(arphdr->ar_sip)); ((fr_channel_t *)dev->priv)->name, NIPQUAD(arphdr->ar_sip));
if (dev->pa_mask != 0xFFFFFFFF){ if (dev->pa_mask != 0xFFFFFFFF){
...@@ -4492,8 +4486,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev) ...@@ -4492,8 +4486,8 @@ int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
case 0x09: // Inverse ARP reply case 0x09: // Inverse ARP reply
/* Check for valid Address */ /* Check for valid Address */
printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Reply\n", printk(KERN_INFO "%s: Recvd PtP addr %u.%u.%u.%u -InArp Reply\n",
((fr_channel_t *)dev->priv)->name, in_ntoa(arphdr->ar_sip)); ((fr_channel_t *)dev->priv)->name, NIPQUAD(arphdr->ar_sip));
if ((dev->pa_mask & arphdr->ar_sip) != (dev->pa_mask & dev->pa_addr)) { if ((dev->pa_mask & arphdr->ar_sip) != (dev->pa_mask & dev->pa_addr)) {
printk(KERN_INFO "%s: Invalid PtP address. InARP ignored.\n", printk(KERN_INFO "%s: Invalid PtP address. InARP ignored.\n",
......
...@@ -102,7 +102,6 @@ ...@@ -102,7 +102,6 @@
#include <linux/if_arp.h> /* ARPHRD_* defines */ #include <linux/if_arp.h> /* ARPHRD_* defines */
#include <asm/byteorder.h> /* htons(), etc. */ #include <asm/byteorder.h> /* htons(), etc. */
#include <linux/in.h> /* sockaddr_in */ #include <linux/in.h> /* sockaddr_in */
#include <linux/inet.h> /* in_aton(), in_ntoa() prototypes */
/* ---- 2.4.X KERNEL SUPPORT -----------------------*/ /* ---- 2.4.X KERNEL SUPPORT -----------------------*/
...@@ -2269,10 +2268,11 @@ static void process_route (sdla_t *card) ...@@ -2269,10 +2268,11 @@ static void process_route (sdla_t *card)
struct in_device *in_dev = dev->ip_ptr; struct in_device *in_dev = dev->ip_ptr;
if (in_dev != NULL ) { if (in_dev != NULL ) {
struct in_ifaddr *ifa = in_dev->ifa_list; struct in_ifaddr *ifa = in_dev->ifa_list;
printk(KERN_INFO "%s: Assigned Lcl. Addr: %s\n",
card->devname, in_ntoa(ifa->ifa_local)); printk(KERN_INFO "%s: Assigned Lcl. Addr: %u.%u.%u.%u\n",
printk(KERN_INFO "%s: Assigned Rmt. Addr: %s\n", card->devname, NIPQUAD(ifa->ifa_local));
card->devname, in_ntoa(ifa->ifa_address)); printk(KERN_INFO "%s: Assigned Rmt. Addr: %u.%u.%u.%u\n",
card->devname, NIPQUAD(ifa->ifa_address));
}else{ }else{
printk(KERN_INFO printk(KERN_INFO
"%s: Error: Failed to add a route for PPP interface %s\n", "%s: Error: Failed to add a route for PPP interface %s\n",
...@@ -2294,10 +2294,10 @@ static void process_route (sdla_t *card) ...@@ -2294,10 +2294,10 @@ static void process_route (sdla_t *card)
"%s: An error occurred in IP assignment.\n", "%s: An error occurred in IP assignment.\n",
card->devname); card->devname);
} else { } else {
printk(KERN_INFO "%s: Assigned Lcl. Addr: %s\n", printk(KERN_INFO "%s: Assigned Lcl. Addr: %u.%u.%u.%u\n",
card->devname, in_ntoa(dev->pa_addr)); card->devname, NIPQUAD(dev->pa_addr));
printk(KERN_INFO "%s: Assigned Rmt. Addr: %s\n", printk(KERN_INFO "%s: Assigned Rmt. Addr: %u.%u.%u.%U\n",
card->devname, in_ntoa(dev->pa_dstaddr)); card->devname, NIPQUAD(dev->pa_dstaddr));
} }
} }
...@@ -2408,16 +2408,8 @@ static int config508(netdevice_t *dev, sdla_t *card) ...@@ -2408,16 +2408,8 @@ static int config508(netdevice_t *dev, sdla_t *card)
/* Debugging code used to check that IP addresses /* Debugging code used to check that IP addresses
* obtained from the kernel are correct */ * obtained from the kernel are correct */
{ NEX_PRINTK(KERN_INFO "Local %u.%u.%u.%u Remote %u.%u.%u.%u Name %s\n",
char laddr[20]; NIPQUAD(ip_local),NIPQUAD(ip_remote), dev->name);
char raddr[20];
strcpy(laddr,in_ntoa(cfg.ip_local));
strcpy(raddr,in_ntoa(cfg.ip_remote));
NEX_PRINTK(KERN_INFO "Local %s Remote %s Name %s\n",
laddr,raddr, dev->name);
}
break; break;
case WANOPT_PPP_HOST: case WANOPT_PPP_HOST:
...@@ -2436,18 +2428,9 @@ static int config508(netdevice_t *dev, sdla_t *card) ...@@ -2436,18 +2428,9 @@ static int config508(netdevice_t *dev, sdla_t *card)
/* Debugging code used to check that IP addresses /* Debugging code used to check that IP addresses
* obtained from the kernel are correct */ * obtained from the kernel are correct */
{ NEX_PRINTK (KERN_INFO "Local %u.%u.%u.%u Remote %u.%u.%u.%u Name %s\n",
char laddr[20]; NIPQUAD(ip_local),NIPQUAD(ip_remote), dev->name);
char raddr[20];
strcpy(laddr,in_ntoa(cfg.ip_local));
strcpy(raddr,in_ntoa(cfg.ip_remote));
NEX_PRINTK (KERN_INFO "Local %s Remote %s Name %s\n",
laddr,raddr, dev->name);
}
break; break;
case WANOPT_PPP_PEER: case WANOPT_PPP_PEER:
...@@ -3130,10 +3113,10 @@ static int read_info( sdla_t *card ) ...@@ -3130,10 +3113,10 @@ static int read_info( sdla_t *card )
if (err) { if (err) {
printk (KERN_INFO "%s: Adding of route failed: %i\n", printk (KERN_INFO "%s: Adding of route failed: %i\n",
card->devname,err); card->devname,err);
printk (KERN_INFO "%s: Local : %s\n", printk (KERN_INFO "%s: Local : %u.%u.%u.%u\n",
card->devname,in_ntoa(ppp_priv_area->ip_local)); card->devname,NIPQUAD(ppp_priv_area->ip_local));
printk (KERN_INFO "%s: Remote: %s\n", printk (KERN_INFO "%s: Remote: %u.%u.%u.%u\n",
card->devname,in_ntoa(ppp_priv_area->ip_remote)); card->devname,NIPQUAD(ppp_priv_area->ip_remote));
} }
return err; return err;
} }
...@@ -3212,8 +3195,8 @@ static void remove_route( sdla_t *card ) ...@@ -3212,8 +3195,8 @@ static void remove_route( sdla_t *card )
card->devname, err); card->devname, err);
return; return;
}else{ }else{
printk (KERN_INFO "%s: PPP Deleting dynamic route %s successfuly\n", printk (KERN_INFO "%s: PPP Deleting dynamic route %u.%u.%u.%u successfuly\n",
card->devname, in_ntoa(ip_addr)); card->devname, NIPQUAD(ip_addr));
} }
return; return;
} }
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/net.h> #include <linux/net.h>
#include <linux/in.h> #include <linux/in.h>
#include <linux/inet.h>
#include <linux/sunrpc/clnt.h> #include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/xprt.h> #include <linux/sunrpc/xprt.h>
#include <linux/sunrpc/sched.h> #include <linux/sunrpc/sched.h>
...@@ -69,7 +68,7 @@ nfs_gen_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh, int versi ...@@ -69,7 +68,7 @@ nfs_gen_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh, int versi
dprintk("NFS: nfs_mount(%08x:%s)\n", dprintk("NFS: nfs_mount(%08x:%s)\n",
(unsigned)ntohl(addr->sin_addr.s_addr), path); (unsigned)ntohl(addr->sin_addr.s_addr), path);
strcpy(hostname, in_ntoa(addr->sin_addr.s_addr)); sprintf(hostname, "%u.%u.%u.%u", NIPQUAD(addr->sin_addr.s_addr));
if (!(mnt_clnt = mnt_create(hostname, addr, version))) if (!(mnt_clnt = mnt_create(hostname, addr, version)))
return -EACCES; return -EACCES;
......
...@@ -78,7 +78,6 @@ ...@@ -78,7 +78,6 @@
#include <linux/nfs_fs.h> #include <linux/nfs_fs.h>
#include <linux/nfs_mount.h> #include <linux/nfs_mount.h>
#include <linux/in.h> #include <linux/in.h>
#include <linux/inet.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/utsname.h> #include <linux/utsname.h>
#include <net/ipconfig.h> #include <net/ipconfig.h>
...@@ -281,7 +280,8 @@ static int __init root_nfs_addr(void) ...@@ -281,7 +280,8 @@ static int __init root_nfs_addr(void)
return -1; return -1;
} }
strncpy(nfs_data.hostname, in_ntoa(servaddr), sizeof(nfs_data.hostname)-1); snprintf(nfs_data.hostname, sizeof(nfs_data.hostname),
"%u.%u.%u.%u", NIPQUAD(servaddr));
return 0; return 0;
} }
......
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
#include <linux/net.h> #include <linux/net.h>
extern void inet_proto_init(struct net_proto *pro); extern void inet_proto_init(struct net_proto *pro);
extern char *in_ntoa(__u32 in);
extern __u32 in_aton(const char *str); extern __u32 in_aton(const char *str);
#endif #endif
......
...@@ -29,9 +29,6 @@ struct kernel_stat { ...@@ -29,9 +29,6 @@ struct kernel_stat {
#if !defined(CONFIG_ARCH_S390) #if !defined(CONFIG_ARCH_S390)
unsigned int irqs[NR_CPUS][NR_IRQS]; unsigned int irqs[NR_CPUS][NR_IRQS];
#endif #endif
unsigned int ipackets, opackets;
unsigned int ierrors, oerrors;
unsigned int collisions;
}; };
extern struct kernel_stat kstat; extern struct kernel_stat kstat;
......
...@@ -231,9 +231,9 @@ struct tcp_opt { ...@@ -231,9 +231,9 @@ struct tcp_opt {
/* Data for direct copy to user */ /* Data for direct copy to user */
struct { struct {
struct sk_buff_head prequeue; struct sk_buff_head prequeue;
int memory;
struct task_struct *task; struct task_struct *task;
struct iovec *iov; struct iovec *iov;
int memory;
int len; int len;
} ucopy; } ucopy;
......
...@@ -475,7 +475,6 @@ typedef struct wanif_conf ...@@ -475,7 +475,6 @@ typedef struct wanif_conf
#include <linux/fs.h> /* support for device drivers */ #include <linux/fs.h> /* support for device drivers */
#include <linux/proc_fs.h> /* proc filesystem pragmatics */ #include <linux/proc_fs.h> /* proc filesystem pragmatics */
#include <linux/inet.h> /* in_aton(), in_ntoa() prototypes */
#include <linux/netdevice.h> /* support for network drivers */ #include <linux/netdevice.h> /* support for network drivers */
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
* WAN device data space. * WAN device data space.
......
...@@ -828,6 +828,11 @@ extern int tcp_sync_mss(struct sock *sk, u32 pmtu); ...@@ -828,6 +828,11 @@ extern int tcp_sync_mss(struct sock *sk, u32 pmtu);
extern const char timer_bug_msg[]; extern const char timer_bug_msg[];
/* Read 'sendfile()'-style from a TCP socket */
typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
unsigned int, size_t);
extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
sk_read_actor_t recv_actor);
static inline void tcp_clear_xmit_timer(struct sock *sk, int what) static inline void tcp_clear_xmit_timer(struct sock *sk, int what)
{ {
......
...@@ -190,11 +190,11 @@ CONFIG_DECNET ...@@ -190,11 +190,11 @@ CONFIG_DECNET
The module is called decnet.o. The module is called decnet.o.
CONFIG_ATALK CONFIG_ATALK
AppleTalk is the way Apple computers speak to each other on a AppleTalk is the protocol that Apple computers can use to communicate
network. If your Linux box is connected to such a network and you on a network. If your Linux box is connected to such a network and you
want to join the conversation, say Y. You will need to use the wish to connect to it, say Y. You will need to use the netatalk package
netatalk package so that your Linux box can act as a print and file so that your Linux box can act as a print and file server for Macs as
server for Macs as well as access AppleTalk printers. Check out well as access AppleTalk printers. Check out
<http://www.zettabyte.net/netatalk/> on the WWW for details. <http://www.zettabyte.net/netatalk/> on the WWW for details.
EtherTalk is the name used for AppleTalk over Ethernet and the EtherTalk is the name used for AppleTalk over Ethernet and the
cheaper and slower LocalTalk is AppleTalk over a proprietary Apple cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
......
...@@ -52,7 +52,10 @@ tristate 'The IPX protocol' CONFIG_IPX ...@@ -52,7 +52,10 @@ tristate 'The IPX protocol' CONFIG_IPX
if [ "$CONFIG_IPX" != "n" ]; then if [ "$CONFIG_IPX" != "n" ]; then
source net/ipx/Config.in source net/ipx/Config.in
fi fi
tristate 'Appletalk protocol support' CONFIG_ATALK tristate 'Appletalk protocol support' CONFIG_ATALK
source drivers/net/appletalk/Config.in
tristate 'DECnet Support' CONFIG_DECNET tristate 'DECnet Support' CONFIG_DECNET
if [ "$CONFIG_DECNET" != "n" ]; then if [ "$CONFIG_DECNET" != "n" ]; then
source net/decnet/Config.in source net/decnet/Config.in
...@@ -68,10 +71,10 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then ...@@ -68,10 +71,10 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
# fi # fi
if [ "$CONFIG_INET" = "y" ]; then if [ "$CONFIG_INET" = "y" ]; then
tristate 'Acorn Econet/AUN protocols (EXPERIMENTAL)' CONFIG_ECONET tristate 'Acorn Econet/AUN protocols (EXPERIMENTAL)' CONFIG_ECONET
fi if [ "$CONFIG_ECONET" != "n" ]; then
if [ "$CONFIG_ECONET" != "n" ]; then bool ' AUN over UDP' CONFIG_ECONET_AUNUDP
bool ' AUN over UDP' CONFIG_ECONET_AUNUDP bool ' Native Econet' CONFIG_ECONET_NATIVE
bool ' Native Econet' CONFIG_ECONET_NATIVE fi
fi fi
tristate 'WAN router' CONFIG_WAN_ROUTER tristate 'WAN router' CONFIG_WAN_ROUTER
bool 'Fast switching (read help!)' CONFIG_NET_FASTROUTE bool 'Fast switching (read help!)' CONFIG_NET_FASTROUTE
......
...@@ -48,12 +48,8 @@ static int __br_forward_finish(struct sk_buff *skb) ...@@ -48,12 +48,8 @@ static int __br_forward_finish(struct sk_buff *skb)
static void __br_deliver(struct net_bridge_port *to, struct sk_buff *skb) static void __br_deliver(struct net_bridge_port *to, struct sk_buff *skb)
{ {
struct net_device *indev;
indev = skb->dev;
skb->dev = to->dev; skb->dev = to->dev;
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, indev, skb->dev,
__br_forward_finish); __br_forward_finish);
} }
......
...@@ -161,8 +161,10 @@ void br_handle_frame(struct sk_buff *skb) ...@@ -161,8 +161,10 @@ void br_handle_frame(struct sk_buff *skb)
handle_special_frame: handle_special_frame:
if (!dest[5]) { if (!dest[5]) {
br_stp_handle_bpdu(skb); br_stp_handle_bpdu(skb);
read_unlock(&br->lock);
return; return;
} }
kfree_skb(skb); kfree_skb(skb);
read_unlock(&br->lock);
} }
...@@ -83,8 +83,7 @@ void nf_unregister_hook(struct nf_hook_ops *reg) ...@@ -83,8 +83,7 @@ void nf_unregister_hook(struct nf_hook_ops *reg)
/* Do exclusive ranges overlap? */ /* Do exclusive ranges overlap? */
static inline int overlap(int min1, int max1, int min2, int max2) static inline int overlap(int min1, int max1, int min2, int max2)
{ {
return (min1 >= min2 && min1 < max2) return max1 > min2 && min1 < max2;
|| (max1 > min2 && max1 <= max2);
} }
/* Functions to register sockopt ranges (exclusive). */ /* Functions to register sockopt ranges (exclusive). */
......
...@@ -1158,8 +1158,8 @@ static int __init inet_init(void) ...@@ -1158,8 +1158,8 @@ static int __init inet_init(void)
sizeof(struct raw_sock), 0, sizeof(struct raw_sock), 0,
SLAB_HWCACHE_ALIGN, 0, 0); SLAB_HWCACHE_ALIGN, 0, 0);
if (!tcp_sk_cachep || !udp_sk_cachep || !raw4_sk_cachep) if (!tcp_sk_cachep || !udp_sk_cachep || !raw4_sk_cachep)
printk(KERN_CRIT __FUNCTION__ printk(KERN_CRIT
": Can't create protocol sock SLAB caches!\n"); "inet_init: Can't create protocol sock SLAB caches!\n");
/* /*
* Tell SOCKET that we are alive... * Tell SOCKET that we are alive...
*/ */
......
...@@ -604,6 +604,11 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo ...@@ -604,6 +604,11 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
struct net_device *dev = ptr; struct net_device *dev = ptr;
struct in_device *in_dev = __in_dev_get(dev); struct in_device *in_dev = __in_dev_get(dev);
if (event == NETDEV_UNREGISTER) {
fib_disable_ip(dev, 2);
return NOTIFY_DONE;
}
if (!in_dev) if (!in_dev)
return NOTIFY_DONE; return NOTIFY_DONE;
...@@ -620,9 +625,6 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo ...@@ -620,9 +625,6 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
case NETDEV_DOWN: case NETDEV_DOWN:
fib_disable_ip(dev, 0); fib_disable_ip(dev, 0);
break; break;
case NETDEV_UNREGISTER:
fib_disable_ip(dev, 1);
break;
case NETDEV_CHANGEMTU: case NETDEV_CHANGEMTU:
case NETDEV_CHANGE: case NETDEV_CHANGE:
rt_cache_flush(0); rt_cache_flush(0);
......
...@@ -185,6 +185,7 @@ int ip_fib_check_default(u32 gw, struct net_device *dev) ...@@ -185,6 +185,7 @@ int ip_fib_check_default(u32 gw, struct net_device *dev)
continue; continue;
for_nexthops(fi) { for_nexthops(fi) {
if (nh->nh_dev == dev && nh->nh_gw == gw && if (nh->nh_dev == dev && nh->nh_gw == gw &&
nh->nh_scope == RT_SCOPE_LINK &&
!(nh->nh_flags&RTNH_F_DEAD)) { !(nh->nh_flags&RTNH_F_DEAD)) {
read_unlock(&fib_info_lock); read_unlock(&fib_info_lock);
return 0; return 0;
...@@ -379,15 +380,23 @@ static int fib_check_nh(const struct rtmsg *r, struct fib_info *fi, struct fib_n ...@@ -379,15 +380,23 @@ static int fib_check_nh(const struct rtmsg *r, struct fib_info *fi, struct fib_n
/* It is not necessary, but requires a bit of thinking */ /* It is not necessary, but requires a bit of thinking */
if (key.scope < RT_SCOPE_LINK) if (key.scope < RT_SCOPE_LINK)
key.scope = RT_SCOPE_LINK; key.scope = RT_SCOPE_LINK;
if ((err = fib_lookup(&key, &res)) != 0) if ((err = fib_lookup(&key, &res)) != 0)
return err; return err;
err = -EINVAL;
if (res.type != RTN_UNICAST && res.type != RTN_LOCAL)
goto out;
nh->nh_scope = res.scope; nh->nh_scope = res.scope;
nh->nh_oif = FIB_RES_OIF(res); nh->nh_oif = FIB_RES_OIF(res);
nh->nh_dev = FIB_RES_DEV(res); if ((nh->nh_dev = FIB_RES_DEV(res)) == NULL)
if (nh->nh_dev) goto out;
atomic_inc(&nh->nh_dev->refcnt); atomic_inc(&nh->nh_dev->refcnt);
err = -ENETDOWN;
if (!(nh->nh_dev->flags & IFF_UP))
goto out;
err = 0;
out:
fib_res_put(&res); fib_res_put(&res);
return err;
} else { } else {
struct in_device *in_dev; struct in_device *in_dev;
...@@ -875,13 +884,15 @@ int fib_sync_down(u32 local, struct net_device *dev, int force) ...@@ -875,13 +884,15 @@ int fib_sync_down(u32 local, struct net_device *dev, int force)
fi->fib_power -= nh->nh_power; fi->fib_power -= nh->nh_power;
nh->nh_power = 0; nh->nh_power = 0;
spin_unlock_bh(&fib_multipath_lock); spin_unlock_bh(&fib_multipath_lock);
if (force && nh->nh_dev) {
dev_put(nh->nh_dev);
nh->nh_dev = NULL;
}
#endif #endif
dead++; dead++;
} }
#ifdef CONFIG_IP_ROUTE_MULTIPATH
if (force > 1 && nh->nh_dev == dev) {
dead = fi->fib_nhs;
break;
}
#endif
} endfor_nexthops(fi) } endfor_nexthops(fi)
if (dead == fi->fib_nhs) { if (dead == fi->fib_nhs) {
fi->fib_flags |= RTNH_F_DEAD; fi->fib_flags |= RTNH_F_DEAD;
...@@ -914,10 +925,6 @@ int fib_sync_up(struct net_device *dev) ...@@ -914,10 +925,6 @@ int fib_sync_up(struct net_device *dev)
alive++; alive++;
continue; continue;
} }
if (nh->nh_dev == NULL && nh->nh_oif == dev->ifindex) {
dev_hold(dev);
nh->nh_dev = dev;
}
if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP)) if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP))
continue; continue;
if (nh->nh_dev != dev || __in_dev_get(dev) == NULL) if (nh->nh_dev != dev || __in_dev_get(dev) == NULL)
......
...@@ -251,6 +251,7 @@ ...@@ -251,6 +251,7 @@
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/fs.h>
#include <net/icmp.h> #include <net/icmp.h>
#include <net/tcp.h> #include <net/tcp.h>
...@@ -1377,6 +1378,84 @@ static void tcp_prequeue_process(struct sock *sk) ...@@ -1377,6 +1378,84 @@ static void tcp_prequeue_process(struct sock *sk)
tp->ucopy.memory = 0; tp->ucopy.memory = 0;
} }
static inline
struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
{
struct sk_buff *skb;
u32 offset;
skb_queue_walk(&sk->receive_queue, skb) {
offset = seq - TCP_SKB_CB(skb)->seq;
if (skb->h.th->syn)
offset--;
if (offset < skb->len || skb->h.th->fin) {
*off = offset;
return skb;
}
}
return NULL;
}
/*
* This routine provides an alternative to tcp_recvmsg() for routines
* that would like to handle copying from skbuffs directly in 'sendfile'
* fashion.
* Note:
* - It is assumed that the socket was locked by the caller.
* - The routine does not block.
* - At present, there is no support for reading OOB data
* or for 'peeking' the socket using this routine
* (although both would be easy to implement).
*/
int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
sk_read_actor_t recv_actor)
{
struct sk_buff *skb;
struct tcp_opt *tp = tcp_sk(sk);
u32 seq = tp->copied_seq;
u32 offset;
int copied = 0;
if (sk->state == TCP_LISTEN)
return -ENOTCONN;
while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) {
if (offset < skb->len) {
size_t used, len;
len = skb->len - offset;
/* Stop reading if we hit a patch of urgent data */
if (tp->urg_data) {
u32 urg_offset = tp->urg_seq - seq;
if (urg_offset < len)
len = urg_offset;
if (!len)
break;
}
used = recv_actor(desc, skb, offset, len);
if (used <= len) {
seq += used;
copied += used;
offset += used;
}
if (offset != skb->len)
break;
}
if (skb->h.th->fin) {
tcp_eat_skb(sk, skb);
++seq;
break;
}
tcp_eat_skb(sk, skb);
if (!desc->count)
break;
}
tp->copied_seq = seq;
/* Clean up data we have read: This will do ACK frames. */
if (copied)
cleanup_rbuf(sk, copied);
return copied;
}
/* /*
* This routine copies from a sock struct into the user buffer. * This routine copies from a sock struct into the user buffer.
* *
......
...@@ -42,21 +42,6 @@ ...@@ -42,21 +42,6 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
/*
* Display an IP address in readable format.
*/
char *in_ntoa(__u32 in)
{
static char buff[18];
char *p;
p = (char *) &in;
sprintf(buff, "%d.%d.%d.%d",
(p[0] & 255), (p[1] & 255), (p[2] & 255), (p[3] & 255));
return(buff);
}
/* /*
* Convert an ASCII string to binary IP. * Convert an ASCII string to binary IP.
*/ */
......
...@@ -1833,7 +1833,7 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) ...@@ -1833,7 +1833,7 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
break; break;
case RTM_DELADDR: case RTM_DELADDR:
addrconf_leave_solict(ifp->idev->dev, &ifp->addr); addrconf_leave_solict(ifp->idev->dev, &ifp->addr);
if (!ipv6_chk_addr(&ifp->addr, ifp->idev->dev)) if (!ipv6_chk_addr(&ifp->addr, NULL))
ip6_rt_addr_del(&ifp->addr, ifp->idev->dev); ip6_rt_addr_del(&ifp->addr, ifp->idev->dev);
break; break;
} }
......
...@@ -110,7 +110,7 @@ static LIST_HEAD(ip6t_tables); ...@@ -110,7 +110,7 @@ static LIST_HEAD(ip6t_tables);
#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
#define TABLE_OFFSET(t,p) (SMP_ALIGN((t)->size)*cpu_number_map(p)) #define TABLE_OFFSET(t,p) (SMP_ALIGN((t)->size)*(p))
#else #else
#define TABLE_OFFSET(t,p) 0 #define TABLE_OFFSET(t,p) 0
#endif #endif
...@@ -336,7 +336,8 @@ ip6t_do_table(struct sk_buff **pskb, ...@@ -336,7 +336,8 @@ ip6t_do_table(struct sk_buff **pskb,
read_lock_bh(&table->lock); read_lock_bh(&table->lock);
IP_NF_ASSERT(table->valid_hooks & (1 << hook)); IP_NF_ASSERT(table->valid_hooks & (1 << hook));
table_base = (void *)table->private->entries table_base = (void *)table->private->entries
+ TABLE_OFFSET(table->private, smp_processor_id()); + TABLE_OFFSET(table->private,
cpu_number_map(smp_processor_id()));
e = get_entry(table_base, table->private->hook_entry[hook]); e = get_entry(table_base, table->private->hook_entry[hook]);
#ifdef CONFIG_NETFILTER_DEBUG #ifdef CONFIG_NETFILTER_DEBUG
...@@ -426,7 +427,7 @@ ip6t_do_table(struct sk_buff **pskb, ...@@ -426,7 +427,7 @@ ip6t_do_table(struct sk_buff **pskb,
#endif #endif
/* Target might have changed stuff. */ /* Target might have changed stuff. */
ipv6 = (*pskb)->nh.ipv6h; ipv6 = (*pskb)->nh.ipv6h;
protohdr = (u_int32_t *)ipv6 + IPV6_HDR_LEN; protohdr = (u_int32_t *)((void *)ipv6 + IPV6_HDR_LEN);
datalen = (*pskb)->len - IPV6_HDR_LEN; datalen = (*pskb)->len - IPV6_HDR_LEN;
if (verdict == IP6T_CONTINUE) if (verdict == IP6T_CONTINUE)
...@@ -913,7 +914,7 @@ translate_table(const char *name, ...@@ -913,7 +914,7 @@ translate_table(const char *name,
/* And one copy for every other CPU */ /* And one copy for every other CPU */
for (i = 1; i < smp_num_cpus; i++) { for (i = 1; i < smp_num_cpus; i++) {
memcpy(newinfo->entries + SMP_ALIGN(newinfo->size*i), memcpy(newinfo->entries + SMP_ALIGN(newinfo->size)*i,
newinfo->entries, newinfo->entries,
SMP_ALIGN(newinfo->size)); SMP_ALIGN(newinfo->size));
} }
...@@ -1795,9 +1796,15 @@ static int __init init(void) ...@@ -1795,9 +1796,15 @@ static int __init init(void)
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
if (!proc_net_create("ip6_tables_names", 0, ip6t_get_tables)) { {
nf_unregister_sockopt(&ip6t_sockopts); struct proc_dir_entry *proc;
return -ENOMEM; proc = proc_net_create("ip6_tables_names", 0,
ip6t_get_tables);
if (!proc) {
nf_unregister_sockopt(&ip6t_sockopts);
return -ENOMEM;
}
proc->owner = THIS_MODULE;
} }
#endif #endif
......
...@@ -34,8 +34,10 @@ ip6t_mac_checkentry(const char *tablename, ...@@ -34,8 +34,10 @@ ip6t_mac_checkentry(const char *tablename,
unsigned int hook_mask) unsigned int hook_mask)
{ {
if (hook_mask if (hook_mask
& ~((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_IN))) { & ~((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_IN)
printk("ip6t_mac: only valid for PRE_ROUTING or LOCAL_IN.\n"); | (1 << NF_IP6_FORWARD))) {
printk("ip6t_mac: only valid for PRE_ROUTING, LOCAL_IN or"
" FORWARD\n");
return 0; return 0;
} }
...@@ -60,3 +62,5 @@ static void __exit fini(void) ...@@ -60,3 +62,5 @@ static void __exit fini(void)
module_init(init); module_init(init);
module_exit(fini); module_exit(fini);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MAC address matching module for IPv6");
...@@ -281,6 +281,16 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb, ...@@ -281,6 +281,16 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
{ {
#if defined(CONFIG_FILTER)
if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
IP6_INC_STATS_BH(Ip6InDiscards);
kfree_skb(skb);
return 0;
}
skb->ip_summed = CHECKSUM_UNNECESSARY;
}
#endif
/* Charge it to the socket. */ /* Charge it to the socket. */
if (sock_queue_rcv_skb(sk,skb)<0) { if (sock_queue_rcv_skb(sk,skb)<0) {
IP6_INC_STATS_BH(Ip6InDiscards); IP6_INC_STATS_BH(Ip6InDiscards);
...@@ -302,10 +312,35 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) ...@@ -302,10 +312,35 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
int rawv6_rcv(struct sock *sk, struct sk_buff *skb) int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
{ {
struct inet_opt *inet = inet_sk(sk); struct inet_opt *inet = inet_sk(sk);
struct raw6_opt *raw_opt = raw6_sk(sk);
if (!raw_opt->checksum)
skb->ip_summed = CHECKSUM_UNNECESSARY;
if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
if (skb->ip_summed == CHECKSUM_HW) {
skb->ip_summed = CHECKSUM_UNNECESSARY;
if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
&skb->nh.ipv6h->daddr,
skb->len, inet->num, skb->csum)) {
NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "raw v6 hw csum failure.\n"));
skb->ip_summed = CHECKSUM_NONE;
}
}
if (skb->ip_summed == CHECKSUM_NONE)
skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
&skb->nh.ipv6h->daddr,
skb->len, inet->num, 0);
}
if (inet->hdrincl) { if (inet->hdrincl) {
__skb_push(skb, skb->nh.raw - skb->data); if (skb->ip_summed != CHECKSUM_UNNECESSARY &&
skb->h.raw = skb->nh.raw; (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
IP6_INC_STATS_BH(Ip6InDiscards);
kfree_skb(skb);
return 0;
}
skb->ip_summed = CHECKSUM_UNNECESSARY;
} }
rawv6_rcv_skb(sk, skb); rawv6_rcv_skb(sk, skb);
...@@ -345,7 +380,17 @@ int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, int len, ...@@ -345,7 +380,17 @@ int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, int len,
msg->msg_flags |= MSG_TRUNC; msg->msg_flags |= MSG_TRUNC;
} }
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
} else if (msg->msg_flags&MSG_TRUNC) {
if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))
goto csum_copy_err;
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
} else {
err = skb_copy_and_csum_datagram_iovec(skb, 0, msg->msg_iov);
if (err == -EINVAL)
goto csum_copy_err;
}
if (err) if (err)
goto out_free; goto out_free;
...@@ -372,6 +417,27 @@ int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, int len, ...@@ -372,6 +417,27 @@ int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, int len,
skb_free_datagram(sk, skb); skb_free_datagram(sk, skb);
out: out:
return err; return err;
csum_copy_err:
/* Clear queue. */
if (flags&MSG_PEEK) {
int clear = 0;
spin_lock_irq(&sk->receive_queue.lock);
if (skb == skb_peek(&sk->receive_queue)) {
__skb_unlink(skb, &sk->receive_queue);
clear = 1;
}
spin_unlock_irq(&sk->receive_queue.lock);
if (clear)
kfree_skb(skb);
}
/* Error for blocking case is chosen to masquerade
as some normal condition.
*/
err = (flags&MSG_DONTWAIT) ? -EAGAIN : -EHOSTUNREACH;
IP6_INC_STATS_USER(Ip6InDiscards);
goto out_free;
} }
/* /*
......
...@@ -64,7 +64,8 @@ static int ipip6_fb_tunnel_init(struct net_device *dev); ...@@ -64,7 +64,8 @@ static int ipip6_fb_tunnel_init(struct net_device *dev);
static int ipip6_tunnel_init(struct net_device *dev); static int ipip6_tunnel_init(struct net_device *dev);
static struct net_device ipip6_fb_tunnel_dev = { static struct net_device ipip6_fb_tunnel_dev = {
"sit0", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, NULL, ipip6_fb_tunnel_init, name: "sit0",
init: ipip6_fb_tunnel_init
}; };
static struct ip_tunnel ipip6_fb_tunnel = { static struct ip_tunnel ipip6_fb_tunnel = {
......
...@@ -508,7 +508,7 @@ static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) ...@@ -508,7 +508,7 @@ static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
{ {
#if defined(CONFIG_FILTER) #if defined(CONFIG_FILTER)
if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
if ((unsigned short)csum_fold(csum_partial(skb->h.raw, skb->len, skb->csum))) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
UDP6_INC_STATS_BH(UdpInErrors); UDP6_INC_STATS_BH(UdpInErrors);
IP6_INC_STATS_BH(Ip6InDiscards); IP6_INC_STATS_BH(Ip6InDiscards);
kfree_skb(skb); kfree_skb(skb);
......
...@@ -408,6 +408,8 @@ EXPORT_SYMBOL(secure_ipv6_id); ...@@ -408,6 +408,8 @@ EXPORT_SYMBOL(secure_ipv6_id);
#endif #endif
EXPORT_SYMBOL(tcp_read_sock);
EXPORT_SYMBOL(netlink_set_err); EXPORT_SYMBOL(netlink_set_err);
EXPORT_SYMBOL(netlink_broadcast); EXPORT_SYMBOL(netlink_broadcast);
EXPORT_SYMBOL(netlink_unicast); EXPORT_SYMBOL(netlink_unicast);
...@@ -446,7 +448,6 @@ EXPORT_SYMBOL(ipv4_config); ...@@ -446,7 +448,6 @@ EXPORT_SYMBOL(ipv4_config);
EXPORT_SYMBOL(dev_open); EXPORT_SYMBOL(dev_open);
/* Used by other modules */ /* Used by other modules */
EXPORT_SYMBOL(in_ntoa);
EXPORT_SYMBOL(xrlim_allow); EXPORT_SYMBOL(xrlim_allow);
EXPORT_SYMBOL(ip_rcv); EXPORT_SYMBOL(ip_rcv);
......
...@@ -280,7 +280,7 @@ pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) ...@@ -280,7 +280,7 @@ pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
list = ((struct sk_buff_head*)qdisc->data) + list = ((struct sk_buff_head*)qdisc->data) +
prio2band[skb->priority&TC_PRIO_MAX]; prio2band[skb->priority&TC_PRIO_MAX];
if (list->qlen <= skb->dev->tx_queue_len) { if (list->qlen <= qdisc->dev->tx_queue_len) {
__skb_queue_tail(list, skb); __skb_queue_tail(list, skb);
qdisc->q.qlen++; qdisc->q.qlen++;
return 0; return 0;
......
...@@ -43,6 +43,9 @@ ...@@ -43,6 +43,9 @@
#define PRIV(sch) ((struct ingress_qdisc_data *) (sch)->data) #define PRIV(sch) ((struct ingress_qdisc_data *) (sch)->data)
/* Thanks to Doron Oz for this hack
*/
static int nf_registered = 0;
struct ingress_qdisc_data { struct ingress_qdisc_data {
struct Qdisc *q; struct Qdisc *q;
...@@ -147,15 +150,21 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch) ...@@ -147,15 +150,21 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch)
#ifdef CONFIG_NET_CLS_POLICE #ifdef CONFIG_NET_CLS_POLICE
case TC_POLICE_SHOT: case TC_POLICE_SHOT:
result = NF_DROP; result = NF_DROP;
sch->stats.drops++;
break; break;
case TC_POLICE_RECLASSIFY: /* DSCP remarking here ? */ case TC_POLICE_RECLASSIFY: /* DSCP remarking here ? */
case TC_POLICE_OK: case TC_POLICE_OK:
case TC_POLICE_UNSPEC: case TC_POLICE_UNSPEC:
default: default:
sch->stats.packets++;
sch->stats.bytes += skb->len;
result = NF_ACCEPT; result = NF_ACCEPT;
break; break;
}
#else
sch->stats.packets++;
sch->stats.bytes += skb->len;
#endif #endif
};
skb->tc_index = TC_H_MIN(res.classid); skb->tc_index = TC_H_MIN(res.classid);
return result; return result;
...@@ -236,22 +245,21 @@ int ingress_init(struct Qdisc *sch,struct rtattr *opt) ...@@ -236,22 +245,21 @@ int ingress_init(struct Qdisc *sch,struct rtattr *opt)
{ {
struct ingress_qdisc_data *p = PRIV(sch); struct ingress_qdisc_data *p = PRIV(sch);
if (!nf_registered) {
if (nf_register_hook(&ing_ops) < 0) {
printk("ingress qdisc registration error \n");
goto error;
}
nf_registered++;
}
DPRINTK("ingress_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt); DPRINTK("ingress_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->filter_list = NULL; p->filter_list = NULL;
p->q = &noop_qdisc; p->q = &noop_qdisc;
#ifndef MODULE
if (nf_register_hook(&ing_ops) < 0) {
printk("Unable to register ingress \n");
goto error;
}
#endif
DPRINTK("ingress_init: qdisc %p\n", sch);
MOD_INC_USE_COUNT; MOD_INC_USE_COUNT;
return 0; return 0;
#ifndef MODULE
error: error:
#endif
return -EINVAL; return -EINVAL;
} }
...@@ -295,12 +303,9 @@ static void ingress_destroy(struct Qdisc *sch) ...@@ -295,12 +303,9 @@ static void ingress_destroy(struct Qdisc *sch)
/* for future use */ /* for future use */
qdisc_destroy(p->q); qdisc_destroy(p->q);
#endif #endif
#ifndef MODULE
nf_unregister_hook(&ing_ops);
#endif
MOD_DEC_USE_COUNT; MOD_DEC_USE_COUNT;
} }
...@@ -356,6 +361,7 @@ struct Qdisc_ops ingress_qdisc_ops = ...@@ -356,6 +361,7 @@ struct Qdisc_ops ingress_qdisc_ops =
ingress_dump, /* dump */ ingress_dump, /* dump */
}; };
#ifdef MODULE #ifdef MODULE
int init_module(void) int init_module(void)
{ {
...@@ -366,20 +372,15 @@ int init_module(void) ...@@ -366,20 +372,15 @@ int init_module(void)
return ret; return ret;
} }
if (nf_register_hook(&ing_ops) < 0) {
printk("Unable to register ingress on hook \n");
unregister_qdisc(&ingress_qdisc_ops);
return 0;
}
return ret; return ret;
} }
void cleanup_module(void) void cleanup_module(void)
{ {
nf_unregister_hook(&ing_ops);
unregister_qdisc(&ingress_qdisc_ops); unregister_qdisc(&ingress_qdisc_ops);
if (nf_registered)
nf_unregister_hook(&ing_ops);
} }
#endif #endif
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -87,8 +87,6 @@ rpc_getport(struct rpc_task *task, struct rpc_clnt *clnt) ...@@ -87,8 +87,6 @@ rpc_getport(struct rpc_task *task, struct rpc_clnt *clnt)
} }
#ifdef CONFIG_ROOT_NFS #ifdef CONFIG_ROOT_NFS
char *in_ntoa(__u32 in);
int int
rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot) rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
{ {
...@@ -100,7 +98,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot) ...@@ -100,7 +98,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
dprintk("RPC: rpc_getport_external(%u.%u.%u.%u, %d, %d, %d)\n", dprintk("RPC: rpc_getport_external(%u.%u.%u.%u, %d, %d, %d)\n",
NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot); NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot);
strcpy(hostname, in_ntoa(sin->sin_addr.s_addr)); sprintf(hostname, "%u.%u.%u.%u", NIPQUAD(sin->sin_addr.s_addr));
if (!(pmap_clnt = pmap_create(hostname, sin, prot))) if (!(pmap_clnt = pmap_create(hostname, sin, prot)))
return -EACCES; return -EACCES;
......
...@@ -1886,8 +1886,8 @@ static int __init af_unix_init(void) ...@@ -1886,8 +1886,8 @@ static int __init af_unix_init(void)
sizeof(struct unix_sock), 0, sizeof(struct unix_sock), 0,
SLAB_HWCACHE_ALIGN, 0, 0); SLAB_HWCACHE_ALIGN, 0, 0);
if (!unix_sk_cachep) if (!unix_sk_cachep)
printk(KERN_CRIT __FUNCTION__ printk(KERN_CRIT
": Cannot create unix_sock SLAB cache!\n"); "af_unix_init: Cannot create unix_sock SLAB cache!\n");
sock_register(&unix_family_ops); sock_register(&unix_family_ops);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment