diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-24 00:12:35 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-24 00:12:35 +0000 |
commit | 482368b1a8e45430672c58c9a42e7d2004367126 (patch) | |
tree | ce2a1a567d4d62dee7c2e71a46a99cf72cf1d606 /net/core | |
parent | e4d0251c6f56ab2e191afb70f80f382793e23f74 (diff) |
Merge with 2.3.47. Guys, this is buggy as shit. You've been warned.
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 287 | ||||
-rw-r--r-- | net/core/dev_mcast.c | 81 | ||||
-rw-r--r-- | net/core/profile.c | 6 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 2 | ||||
-rw-r--r-- | net/core/skbuff.c | 4 |
5 files changed, 190 insertions, 190 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 00d5caa2a..d2ed4f523 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -81,7 +81,7 @@ #include <net/slhc.h> #include <linux/proc_fs.h> #include <linux/stat.h> -#include <net/br.h> +#include <linux/if_bridge.h> #include <net/dst.h> #include <net/pkt_sched.h> #include <net/profile.h> @@ -190,14 +190,11 @@ void dev_add_pack(struct packet_type *pt) dev_clear_fastroute(pt->dev); } #endif - if(pt->type==htons(ETH_P_ALL)) - { + if (pt->type == htons(ETH_P_ALL)) { netdev_nit++; pt->next=ptype_all; ptype_all=pt; - } - else - { + } else { hash=ntohs(pt->type)&15; pt->next = ptype_base[hash]; ptype_base[hash] = pt; @@ -216,19 +213,16 @@ void dev_remove_pack(struct packet_type *pt) write_lock_bh(&ptype_lock); - if(pt->type==htons(ETH_P_ALL)) - { + if (pt->type == htons(ETH_P_ALL)) { netdev_nit--; pt1=&ptype_all; - } - else + } else { pt1=&ptype_base[ntohs(pt->type)&15]; + } - for(; (*pt1)!=NULL; pt1=&((*pt1)->next)) - { - if(pt==(*pt1)) - { - *pt1=pt->next; + for (; (*pt1) != NULL; pt1 = &((*pt1)->next)) { + if (pt == (*pt1)) { + *pt1 = pt->next; #ifdef CONFIG_NET_FASTROUTE if (pt->data) netdev_fastroute_obstacles--; @@ -357,14 +351,13 @@ int dev_alloc_name(struct net_device *dev, const char *name) { int i; char buf[32]; + /* * If you need over 100 please also fix the algorithm... */ - for(i=0;i<100;i++) - { + for (i = 0; i < 100; i++) { sprintf(buf,name,i); - if(__dev_get_by_name(buf)==NULL) - { + if (__dev_get_by_name(buf) == NULL) { strcpy(dev->name, buf); return i; } @@ -375,16 +368,14 @@ int dev_alloc_name(struct net_device *dev, const char *name) struct net_device *dev_alloc(const char *name, int *err) { struct net_device *dev=kmalloc(sizeof(struct net_device)+16, GFP_KERNEL); - if(dev==NULL) - { - *err=-ENOBUFS; + if (dev == NULL) { + *err = -ENOBUFS; return NULL; } memset(dev, 0, sizeof(struct net_device)); - dev->name=(char *)(dev+1); /* Name string space */ - *err=dev_alloc_name(dev,name); - if(*err<0) - { + dev->name = (char *)(dev + 1); /* Name string space */ + *err = dev_alloc_name(dev, name); + if (*err < 0) { kfree(dev); return NULL; } @@ -408,7 +399,7 @@ void netdev_state_change(struct net_device *dev) void dev_load(const char *name) { - if(!__dev_get_by_name(name) && capable(CAP_SYS_MODULE)) + if (!__dev_get_by_name(name) && capable(CAP_SYS_MODULE)) request_module(name); } @@ -441,6 +432,12 @@ int dev_open(struct net_device *dev) return 0; /* + * Is it even present? + */ + if (!netif_device_present(dev)) + return -ENODEV; + + /* * Call device private open method */ @@ -458,7 +455,7 @@ int dev_open(struct net_device *dev) */ dev->flags |= IFF_UP; - set_bit(LINK_STATE_START, &dev->state); + set_bit(__LINK_STATE_START, &dev->state); /* * Initialize multicasting status @@ -528,11 +525,14 @@ int dev_close(struct net_device *dev) dev_deactivate(dev); - clear_bit(LINK_STATE_START, &dev->state); + clear_bit(__LINK_STATE_START, &dev->state); /* * Call the device specific close. This cannot fail. * Only if device is UP + * + * We allow it to be called even after a DETACH hot-plug + * event. */ if (dev->stop) @@ -673,7 +673,7 @@ int dev_queue_xmit(struct sk_buff *skb) spin_lock(&dev->xmit_lock); dev->xmit_lock_owner = cpu; - if (!test_bit(LINK_STATE_XOFF, &dev->state)) { + if (!netif_queue_stopped(dev)) { if (netdev_nit) dev_queue_xmit_nit(skb,dev); @@ -781,7 +781,7 @@ void netif_rx(struct sk_buff *skb) struct softnet_data *queue; unsigned long flags; - if(skb->stamp.tv_sec==0) + if (skb->stamp.tv_sec == 0) get_fast_time(&skb->stamp); /* The code is rearranged so that the path is the most @@ -833,37 +833,6 @@ drop: kfree_skb(skb); } -#ifdef CONFIG_BRIDGE -static inline void handle_bridge(struct sk_buff *skb, unsigned short type) -{ - /* - * The br_stats.flags is checked here to save the expense of a - * function call. - */ - if ((br_stats.flags & BR_UP) && br_call_bridge(skb, type)) - { - /* - * We pass the bridge a complete frame. This means - * recovering the MAC header first. - */ - - int offset; - - skb=skb_clone(skb, GFP_ATOMIC); - if(skb==NULL) - return; - - offset=skb->data-skb->mac.raw; - skb_push(skb,offset); /* Put header back on for bridge */ - - if(br_receive_frame(skb)) - return; - kfree_skb(skb); - } - return; -} -#endif - /* Deliver skb to an old protocol, which is not threaded well or which do not understand shared skbs. */ @@ -911,15 +880,14 @@ static __inline__ void skb_bond(struct sk_buff *skb) static void net_tx_action(struct softirq_action *h) { int cpu = smp_processor_id(); - unsigned long flags; if (softnet_data[cpu].completion_queue) { struct sk_buff *clist; - local_irq_save(flags); + local_irq_disable(); clist = softnet_data[cpu].completion_queue; softnet_data[cpu].completion_queue = NULL; - local_irq_restore(flags); + local_irq_enable(); while (clist != NULL) { struct sk_buff *skb = clist; @@ -933,16 +901,16 @@ static void net_tx_action(struct softirq_action *h) if (softnet_data[cpu].output_queue) { struct net_device *head; - local_irq_save(flags); + local_irq_disable(); head = softnet_data[cpu].output_queue; softnet_data[cpu].output_queue = NULL; - local_irq_restore(flags); + local_irq_enable(); while (head != NULL) { struct net_device *dev = head; head = head->next_sched; - clear_bit(LINK_STATE_SCHED, &dev->state); + clear_bit(__LINK_STATE_SCHED, &dev->state); if (spin_trylock(&dev->queue_lock)) { qdisc_run(dev); @@ -954,6 +922,32 @@ static void net_tx_action(struct softirq_action *h) } } +void net_call_rx_atomic(void (*fn)(void)) +{ + write_lock_bh(&ptype_lock); + fn(); + write_unlock_bh(&ptype_lock); +} + +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) +void (*br_handle_frame_hook)(struct sk_buff *skb) = NULL; +#endif + +#define HANDLE_BRIDGE(SKB, PT_PREV) \ +do { \ + if ((SKB)->dev->br_port != NULL && \ + br_handle_frame_hook != NULL) { \ + if (PT_PREV) \ + if (!(PT_PREV->data)) \ + deliver_to_old_ones(PT_PREV, SKB, 1); \ + else \ + pt_prev->func(SKB, SKB->dev, PT_PREV); \ + \ + br_handle_frame_hook(SKB); \ + continue; \ + } \ +} while(0) + static void net_rx_action(struct softirq_action *h) { int this_cpu = smp_processor_id(); @@ -986,9 +980,7 @@ static void net_rx_action(struct softirq_action *h) { struct packet_type *ptype, *pt_prev; unsigned short type = skb->protocol; -#ifdef CONFIG_BRIDGE - handle_bridge(skb, type); -#endif + pt_prev = NULL; for (ptype = ptype_all; ptype; ptype = ptype->next) { if (!ptype->dev || ptype->dev == skb->dev) { @@ -1005,6 +997,11 @@ static void net_rx_action(struct softirq_action *h) pt_prev = ptype; } } + +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) + HANDLE_BRIDGE(skb, pt_prev); +#endif + for (ptype=ptype_base[ntohs(type)&15];ptype;ptype=ptype->next) { if (ptype->type == type && (!ptype->dev || ptype->dev == skb->dev)) { @@ -1021,6 +1018,7 @@ static void net_rx_action(struct softirq_action *h) pt_prev = ptype; } } + if (pt_prev) { if (!pt_prev->data) deliver_to_old_ones(pt_prev, skb, 1); @@ -1213,11 +1211,10 @@ static int sprintf_stats(char *buffer, struct net_device *dev) static int dev_get_info(char *buffer, char **start, off_t offset, int length) { - int len=0; - off_t begin=0; - off_t pos=0; + int len = 0; + off_t begin = 0; + off_t pos = 0; int size; - struct net_device *dev; @@ -1225,31 +1222,31 @@ static int dev_get_info(char *buffer, char **start, off_t offset, int length) "Inter-| Receive | Transmit\n" " face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed\n"); - pos+=size; - len+=size; + pos += size; + len += size; read_lock(&dev_base_lock); for (dev = dev_base; dev != NULL; dev = dev->next) { size = sprintf_stats(buffer+len, dev); - len+=size; - pos=begin+len; + len += size; + pos = begin + len; - if(pos<offset) { - len=0; - begin=pos; + if (pos < offset) { + len = 0; + begin = pos; } - if(pos>offset+length) + if (pos > offset + length) break; } read_unlock(&dev_base_lock); - *start=buffer+(offset-begin); /* Start of wanted data */ - len-=(offset-begin); /* Start slop */ - if(len>length) - len=length; /* Ending slop */ - if (len<0) - len=0; + *start = buffer + (offset - begin); /* Start of wanted data */ + len -= (offset - begin); /* Start slop */ + if (len > length) + len = length; /* Ending slop */ + if (len < 0) + len = 0; return len; } @@ -1281,7 +1278,7 @@ static int dev_proc_stats(char *buffer, char **start, off_t offset, if (len > length) len = length; - if(len < 0) + if (len < 0) len = 0; *start = buffer + offset; @@ -1308,8 +1305,7 @@ static int sprintf_wireless_stats(char *buffer, struct net_device *dev) (struct iw_statistics *) NULL); int size; - if(stats != (struct iw_statistics *) NULL) - { + if (stats != (struct iw_statistics *) NULL) { size = sprintf(buffer, "%6s: %04x %3d%c %3d%c %3d%c %6d %6d %6d\n", dev->name, @@ -1350,30 +1346,30 @@ static int dev_get_wireless_info(char * buffer, char **start, off_t offset, " face | tus | link level noise | nwid crypt misc\n" ); - pos+=size; - len+=size; + pos += size; + len += size; read_lock(&dev_base_lock); - for(dev = dev_base; dev != NULL; dev = dev->next) { - size = sprintf_wireless_stats(buffer+len, dev); - len+=size; - pos=begin+len; - - if(pos < offset) { - len=0; - begin=pos; + for (dev = dev_base; dev != NULL; dev = dev->next) { + size = sprintf_wireless_stats(buffer + len, dev); + len += size; + pos = begin + len; + + if (pos < offset) { + len = 0; + begin = pos; } - if(pos > offset + length) + if (pos > offset + length) break; } read_unlock(&dev_base_lock); *start = buffer + (offset - begin); /* Start of wanted data */ len -= (offset - begin); /* Start slop */ - if(len > length) - len = length; /* Ending slop */ - if (len<0) - len=0; + if (len > length) + len = length; /* Ending slop */ + if (len < 0) + len = 0; return len; } @@ -1517,7 +1513,7 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = (dev->flags&~(IFF_PROMISC|IFF_ALLMULTI|IFF_RUNNING)) |(dev->gflags&(IFF_PROMISC|IFF_ALLMULTI)); - if (!test_bit(LINK_STATE_DOWN, &dev->state)) + if (netif_running(dev)) ifr->ifr_flags |= IFF_RUNNING; return 0; @@ -1546,6 +1542,9 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) if (ifr->ifr_mtu<0) return -EINVAL; + if (!netif_device_present(dev)) + return -ENODEV; + if (dev->change_mtu) err = dev->change_mtu(dev, ifr->ifr_mtu); else { @@ -1562,17 +1561,19 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) return 0; case SIOCSIFHWADDR: - if(dev->set_mac_address==NULL) + if (dev->set_mac_address == NULL) return -EOPNOTSUPP; - if(ifr->ifr_hwaddr.sa_family!=dev->type) + if (ifr->ifr_hwaddr.sa_family!=dev->type) return -EINVAL; - err=dev->set_mac_address(dev,&ifr->ifr_hwaddr); + if (!netif_device_present(dev)) + return -ENODEV; + err = dev->set_mac_address(dev, &ifr->ifr_hwaddr); if (!err) notifier_call_chain(&netdev_chain, NETDEV_CHANGEADDR, dev); return err; case SIOCSIFHWBROADCAST: - if(ifr->ifr_hwaddr.sa_family!=dev->type) + if (ifr->ifr_hwaddr.sa_family!=dev->type) return -EINVAL; memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data, MAX_ADDR_LEN); notifier_call_chain(&netdev_chain, NETDEV_CHANGEADDR, dev); @@ -1588,21 +1589,28 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) return 0; case SIOCSIFMAP: - if (dev->set_config) + if (dev->set_config) { + if (!netif_device_present(dev)) + return -ENODEV; return dev->set_config(dev,&ifr->ifr_map); + } return -EOPNOTSUPP; case SIOCADDMULTI: - if(dev->set_multicast_list==NULL || - ifr->ifr_hwaddr.sa_family!=AF_UNSPEC) + if (dev->set_multicast_list == NULL || + ifr->ifr_hwaddr.sa_family != AF_UNSPEC) return -EINVAL; + if (!netif_device_present(dev)) + return -ENODEV; dev_mc_add(dev,ifr->ifr_hwaddr.sa_data, dev->addr_len, 1); return 0; case SIOCDELMULTI: - if(dev->set_multicast_list==NULL || - ifr->ifr_hwaddr.sa_family!=AF_UNSPEC) + if (dev->set_multicast_list == NULL || + ifr->ifr_hwaddr.sa_family!=AF_UNSPEC) return -EINVAL; + if (!netif_device_present(dev)) + return -ENODEV; dev_mc_delete(dev,ifr->ifr_hwaddr.sa_data,dev->addr_len, 1); return 0; @@ -1615,7 +1623,7 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) return 0; case SIOCSIFTXQLEN: - if(ifr->ifr_qlen<0) + if (ifr->ifr_qlen<0) return -EINVAL; dev->tx_queue_len = ifr->ifr_qlen; return 0; @@ -1635,17 +1643,23 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd) */ default: - if(cmd >= SIOCDEVPRIVATE && - cmd <= SIOCDEVPRIVATE + 15) { - if (dev->do_ioctl) + if (cmd >= SIOCDEVPRIVATE && + cmd <= SIOCDEVPRIVATE + 15) { + if (dev->do_ioctl) { + if (!netif_device_present(dev)) + return -ENODEV; return dev->do_ioctl(dev, ifr, cmd); + } return -EOPNOTSUPP; } #ifdef WIRELESS_EXT - if(cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { - if (dev->do_ioctl) + if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { + if (dev->do_ioctl) { + if (!netif_device_present(dev)) + return -ENODEV; return dev->do_ioctl(dev, ifr, cmd); + } return -EOPNOTSUPP; } #endif /* WIRELESS_EXT */ @@ -1869,6 +1883,13 @@ int register_netdevice(struct net_device *dev) if (dev->rebuild_header == NULL) dev->rebuild_header = default_rebuild_header; + /* + * Default initial state at registry is that the + * device is present. + */ + + set_bit(__LINK_STATE_PRESENT, &dev->state); + dev->next = NULL; dev_init_scheduler(dev); write_lock_bh(&dev_base_lock); @@ -2049,15 +2070,6 @@ int __init net_dev_init(void) queue->completion_queue = NULL; } - /* - * The bridge has to be up before the devices - */ - -#ifdef CONFIG_BRIDGE - br_init(); -#endif - - #ifdef CONFIG_NET_PROFILE net_profile_init(); NET_PROFILE_REGISTER(dev_queue_xmit); @@ -2125,22 +2137,11 @@ int __init net_dev_init(void) dst_init(); dev_mcast_init(); -#ifdef CONFIG_BRIDGE - /* - * Register any statically linked ethernet devices with the bridge - */ - br_spacedevice_register(); -#endif - /* * Initialise network devices */ net_device_init(); -#ifdef CONFIG_IP_PNP - ip_auto_config(); -#endif - return 0; } diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index 2facf1bc1..0dcedb142 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c @@ -71,17 +71,20 @@ static rwlock_t dev_mc_lock = RW_LOCK_UNLOCKED; void dev_mc_upload(struct net_device *dev) { /* Don't do anything till we up the interface - [dev_open will call this function so the list will - stay sane] */ + * [dev_open will call this function so the list will + * stay sane] + */ - if(!(dev->flags&IFF_UP)) + if (!(dev->flags&IFF_UP)) return; /* - * Devices with no set multicast don't get set + * Devices with no set multicast or which have been + * detached don't get set. */ - if(dev->set_multicast_list==NULL) + if (dev->set_multicast_list == NULL || + !netif_device_present(dev)) return; read_lock_bh(&dev_mc_lock); @@ -103,19 +106,20 @@ int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl) struct dev_mc_list *dmi, **dmip; write_lock_bh(&dev_mc_lock); - for (dmip=&dev->mc_list; (dmi=*dmip)!=NULL; dmip=&dmi->next) { + for (dmip = &dev->mc_list; (dmi = *dmip) != NULL; dmip = &dmi->next) { /* * Find the entry we want to delete. The device could * have variable length entries so check these too. */ - if (memcmp(dmi->dmi_addr,addr,dmi->dmi_addrlen)==0 && alen==dmi->dmi_addrlen) { + if (memcmp(dmi->dmi_addr, addr, dmi->dmi_addrlen) == 0 && + alen == dmi->dmi_addrlen) { if (glbl) { int old_glbl = dmi->dmi_gusers; dmi->dmi_gusers = 0; if (old_glbl == 0) break; } - if(--dmi->dmi_users) + if (--dmi->dmi_users) goto done; /* @@ -125,7 +129,7 @@ int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl) dev->mc_count--; write_unlock_bh(&dev_mc_lock); - kfree_s(dmi,sizeof(*dmi)); + kfree_s(dmi, sizeof(*dmi)); /* * We have altered the list, so the card @@ -153,8 +157,9 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl) dmi1 = (struct dev_mc_list *)kmalloc(sizeof(*dmi), GFP_ATOMIC); write_lock_bh(&dev_mc_lock); - for(dmi=dev->mc_list; dmi!=NULL; dmi=dmi->next) { - if (memcmp(dmi->dmi_addr,addr,dmi->dmi_addrlen)==0 && dmi->dmi_addrlen==alen) { + for (dmi = dev->mc_list; dmi != NULL; dmi = dmi->next) { + if (memcmp(dmi->dmi_addr, addr, dmi->dmi_addrlen) == 0 && + dmi->dmi_addrlen == alen) { if (glbl) { int old_glbl = dmi->dmi_gusers; dmi->dmi_gusers = 1; @@ -166,16 +171,16 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl) } } - if ((dmi=dmi1)==NULL) { + if ((dmi = dmi1) == NULL) { write_unlock_bh(&dev_mc_lock); return -ENOMEM; } memcpy(dmi->dmi_addr, addr, alen); - dmi->dmi_addrlen=alen; - dmi->next=dev->mc_list; - dmi->dmi_users=1; - dmi->dmi_gusers=glbl ? 1 : 0; - dev->mc_list=dmi; + dmi->dmi_addrlen = alen; + dmi->next = dev->mc_list; + dmi->dmi_users = 1; + dmi->dmi_gusers = glbl ? 1 : 0; + dev->mc_list = dmi; dev->mc_count++; write_unlock_bh(&dev_mc_lock); dev_mc_upload(dev); @@ -195,14 +200,14 @@ done: void dev_mc_discard(struct net_device *dev) { write_lock_bh(&dev_mc_lock); - while (dev->mc_list!=NULL) { - struct dev_mc_list *tmp=dev->mc_list; - dev->mc_list=tmp->next; + while (dev->mc_list != NULL) { + struct dev_mc_list *tmp = dev->mc_list; + dev->mc_list = tmp->next; if (tmp->dmi_users > tmp->dmi_gusers) printk("dev_mc_discard: multicast leakage! dmi_users=%d\n", tmp->dmi_users); - kfree_s(tmp,sizeof(*tmp)); + kfree_s(tmp, sizeof(*tmp)); } - dev->mc_count=0; + dev->mc_count = 0; write_unlock_bh(&dev_mc_lock); } @@ -210,9 +215,9 @@ void dev_mc_discard(struct net_device *dev) static int dev_mc_read_proc(char *buffer, char **start, off_t offset, int length, int *eof, void *data) { - off_t pos=0, begin=0; + off_t pos = 0, begin = 0; struct dev_mc_list *m; - int len=0; + int len = 0; struct net_device *dev; read_lock(&dev_base_lock); @@ -221,20 +226,20 @@ static int dev_mc_read_proc(char *buffer, char **start, off_t offset, for (m = dev->mc_list; m; m = m->next) { int i; - len += sprintf(buffer+len,"%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, - m->dmi_users, m->dmi_gusers); + len += sprintf(buffer+len,"%-4d %-15s %-5d %-5d ", dev->ifindex, + dev->name, m->dmi_users, m->dmi_gusers); - for (i=0; i<m->dmi_addrlen; i++) + for (i = 0; i < m->dmi_addrlen; i++) len += sprintf(buffer+len, "%02x", m->dmi_addr[i]); - len+=sprintf(buffer+len, "\n"); + len += sprintf(buffer+len, "\n"); - pos=begin+len; + pos = begin + len; if (pos < offset) { - len=0; - begin=pos; + len = 0; + begin = pos; } - if (pos > offset+length) { + if (pos > offset + length) { read_unlock_bh(&dev_mc_lock); goto done; } @@ -245,12 +250,12 @@ static int dev_mc_read_proc(char *buffer, char **start, off_t offset, done: read_unlock(&dev_base_lock); - *start=buffer+(offset-begin); - len-=(offset-begin); - if(len>length) - len=length; - if(len<0) - len=0; + *start = buffer + (offset - begin); + len -= (offset - begin); + if (len > length) + len = length; + if (len < 0) + len = 0; return len; } #endif diff --git a/net/core/profile.c b/net/core/profile.c index 8b2616c50..0408447cb 100644 --- a/net/core/profile.c +++ b/net/core/profile.c @@ -271,12 +271,6 @@ int __init net_profile_init(void) register_netdevice(&whitehole_dev); printk("Evaluating net profiler cost ..."); -#if CPU == 586 || CPU == 686 - if (!(boot_cpu_data.x86_capability & X86_FEATURE_TSC)) { - printk(KERN_ERR "Sorry, your CPU does not support TSC. Net profiler disabled.\n"); - return -1; - } -#endif #ifdef __alpha__ alpha_tick(0); #endif diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9cdc290bf..c549162a9 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -171,7 +171,7 @@ static int rtnetlink_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, r->ifi_flags = dev->flags; r->ifi_change = change; - if (test_bit(LINK_STATE_DOWN, &dev->state)) + if (! netif_running(dev)) r->ifi_flags &= ~IFF_RUNNING; else r->ifi_flags |= IFF_RUNNING; diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 95e4d8e17..30aa1f6bb 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -4,7 +4,7 @@ * Authors: Alan Cox <iiitac@pyr.swan.ac.uk> * Florian La Roche <rzsfl@rz.uni-sb.de> * - * Version: $Id: skbuff.c,v 1.66 2000/02/09 21:11:30 davem Exp $ + * Version: $Id: skbuff.c,v 1.68 2000/02/18 16:47:18 davem Exp $ * * Fixes: * Alan Cox : Fixed the worst of the load balancer bugs. @@ -49,6 +49,7 @@ #include <linux/string.h> #include <linux/skbuff.h> #include <linux/slab.h> +#include <linux/cache.h> #include <linux/init.h> #include <net/ip.h> @@ -193,7 +194,6 @@ static inline void skb_headerinit(void *p, kmem_cache_t *cache, skb->destructor = NULL; skb->pkt_type = PACKET_HOST; /* Default type */ - skb->pkt_bridged = 0; /* Not bridged */ skb->prev = skb->next = NULL; skb->list = NULL; skb->sk = NULL; |