diff options
Diffstat (limited to 'drivers/isdn/i4l')
| -rw-r--r-- | drivers/isdn/i4l/isdn_common.c | 15 | ||||
| -rw-r--r-- | drivers/isdn/i4l/isdn_net.c | 4 | ||||
| -rw-r--r-- | drivers/isdn/i4l/isdn_ppp.c | 81 | 
3 files changed, 65 insertions, 35 deletions
diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 9bb12ba3191..9b856e1890d 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -777,7 +777,8 @@ isdn_readbchan(int di, int channel, u_char *buf, u_char *fp, int len, wait_queue  		return 0;  	if (skb_queue_empty(&dev->drv[di]->rpqueue[channel])) {  		if (sleep) -			interruptible_sleep_on(sleep); +			wait_event_interruptible(*sleep, +				!skb_queue_empty(&dev->drv[di]->rpqueue[channel]));  		else  			return 0;  	} @@ -1072,7 +1073,8 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t *off)  				retval = -EAGAIN;  				goto out;  			} -			interruptible_sleep_on(&(dev->info_waitq)); +			wait_event_interruptible(dev->info_waitq, +						 file->private_data);  		}  		p = isdn_statstr();  		file->private_data = NULL; @@ -1128,7 +1130,8 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t *off)  				retval = -EAGAIN;  				goto out;  			} -			interruptible_sleep_on(&(dev->drv[drvidx]->st_waitq)); +			wait_event_interruptible(dev->drv[drvidx]->st_waitq, +						 dev->drv[drvidx]->stavail);  		}  		if (dev->drv[drvidx]->interface->readstat) {  			if (count > dev->drv[drvidx]->stavail) @@ -1188,8 +1191,8 @@ isdn_write(struct file *file, const char __user *buf, size_t count, loff_t *off)  			goto out;  		}  		chidx = isdn_minor2chan(minor); -		while ((retval = isdn_writebuf_stub(drvidx, chidx, buf, count)) == 0) -			interruptible_sleep_on(&dev->drv[drvidx]->snd_waitq[chidx]); +		wait_event_interruptible(dev->drv[drvidx]->snd_waitq[chidx], +			(retval = isdn_writebuf_stub(drvidx, chidx, buf, count)));  		goto out;  	}  	if (minor <= ISDN_MINOR_CTRLMAX) { @@ -2378,7 +2381,7 @@ static void __exit isdn_exit(void)  	}  	isdn_tty_exit();  	unregister_chrdev(ISDN_MAJOR, "isdn"); -	del_timer(&dev->timer); +	del_timer_sync(&dev->timer);  	/* call vfree with interrupts enabled, else it will hang */  	vfree(dev);  	printk(KERN_NOTICE "ISDN-subsystem unloaded\n"); diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c index 8b98d53d997..d9aebbc510c 100644 --- a/drivers/isdn/i4l/isdn_net.c +++ b/drivers/isdn/i4l/isdn_net.c @@ -1371,7 +1371,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)  	eth = eth_hdr(skb);  	if (*eth->h_dest & 1) { -		if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) +		if (ether_addr_equal(eth->h_dest, dev->broadcast))  			skb->pkt_type = PACKET_BROADCAST;  		else  			skb->pkt_type = PACKET_MULTICAST; @@ -1382,7 +1382,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)  	 */  	else if (dev->flags & (IFF_PROMISC /*| IFF_ALLMULTI*/)) { -		if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) +		if (!ether_addr_equal(eth->h_dest, dev->dev_addr))  			skb->pkt_type = PACKET_OTHERHOST;  	}  	if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN) diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index 38ceac5053a..62f0688d45a 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -378,10 +378,15 @@ isdn_ppp_release(int min, struct file *file)  	is->slcomp = NULL;  #endif  #ifdef CONFIG_IPPP_FILTER -	kfree(is->pass_filter); -	is->pass_filter = NULL; -	kfree(is->active_filter); -	is->active_filter = NULL; +	if (is->pass_filter) { +		sk_unattached_filter_destroy(is->pass_filter); +		is->pass_filter = NULL; +	} + +	if (is->active_filter) { +		sk_unattached_filter_destroy(is->active_filter); +		is->active_filter = NULL; +	}  #endif  /* TODO: if this was the previous master: link the stuff to the new master */ @@ -437,7 +442,7 @@ static int get_filter(void __user *arg, struct sock_filter **p)  {  	struct sock_fprog uprog;  	struct sock_filter *code = NULL; -	int len, err; +	int len;  	if (copy_from_user(&uprog, arg, sizeof(uprog)))  		return -EFAULT; @@ -453,12 +458,6 @@ static int get_filter(void __user *arg, struct sock_filter **p)  	if (IS_ERR(code))  		return PTR_ERR(code); -	err = sk_chk_filter(code, uprog.len); -	if (err) { -		kfree(code); -		return err; -	} -  	*p = code;  	return uprog.len;  } @@ -629,25 +628,53 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)  #ifdef CONFIG_IPPP_FILTER  	case PPPIOCSPASS:  	{ +		struct sock_fprog_kern fprog;  		struct sock_filter *code; -		int len = get_filter(argp, &code); +		int err, len = get_filter(argp, &code); +  		if (len < 0)  			return len; -		kfree(is->pass_filter); -		is->pass_filter = code; -		is->pass_len = len; -		break; + +		fprog.len = len; +		fprog.filter = code; + +		if (is->pass_filter) { +			sk_unattached_filter_destroy(is->pass_filter); +			is->pass_filter = NULL; +		} +		if (fprog.filter != NULL) +			err = sk_unattached_filter_create(&is->pass_filter, +							  &fprog); +		else +			err = 0; +		kfree(code); + +		return err;  	}  	case PPPIOCSACTIVE:  	{ +		struct sock_fprog_kern fprog;  		struct sock_filter *code; -		int len = get_filter(argp, &code); +		int err, len = get_filter(argp, &code); +  		if (len < 0)  			return len; -		kfree(is->active_filter); -		is->active_filter = code; -		is->active_len = len; -		break; + +		fprog.len = len; +		fprog.filter = code; + +		if (is->active_filter) { +			sk_unattached_filter_destroy(is->active_filter); +			is->active_filter = NULL; +		} +		if (fprog.filter != NULL) +			err = sk_unattached_filter_create(&is->active_filter, +							  &fprog); +		else +			err = 0; +		kfree(code); + +		return err;  	}  #endif /* CONFIG_IPPP_FILTER */  	default: @@ -1147,14 +1174,14 @@ isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *  	}  	if (is->pass_filter -	    && sk_run_filter(skb, is->pass_filter) == 0) { +	    && SK_RUN_FILTER(is->pass_filter, skb) == 0) {  		if (is->debug & 0x2)  			printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");  		kfree_skb(skb);  		return;  	}  	if (!(is->active_filter -	      && sk_run_filter(skb, is->active_filter) == 0)) { +	      && SK_RUN_FILTER(is->active_filter, skb) == 0)) {  		if (is->debug & 0x2)  			printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");  		lp->huptimer = 0; @@ -1293,14 +1320,14 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)  	}  	if (ipt->pass_filter -	    && sk_run_filter(skb, ipt->pass_filter) == 0) { +	    && SK_RUN_FILTER(ipt->pass_filter, skb) == 0) {  		if (ipt->debug & 0x4)  			printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");  		kfree_skb(skb);  		goto unlock;  	}  	if (!(ipt->active_filter -	      && sk_run_filter(skb, ipt->active_filter) == 0)) { +	      && SK_RUN_FILTER(ipt->active_filter, skb) == 0)) {  		if (ipt->debug & 0x4)  			printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");  		lp->huptimer = 0; @@ -1490,9 +1517,9 @@ int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)  	}  	drop |= is->pass_filter -		&& sk_run_filter(skb, is->pass_filter) == 0; +		&& SK_RUN_FILTER(is->pass_filter, skb) == 0;  	drop |= is->active_filter -		&& sk_run_filter(skb, is->active_filter) == 0; +		&& SK_RUN_FILTER(is->active_filter, skb) == 0;  	skb_push(skb, IPPP_MAX_HEADER - 4);  	return drop;  | 
