示例#1
0
int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
			   struct packet_type *ptype, struct net_device *orig_dev)
{
	struct sk_buff *nskb;
	struct x25_neigh *nb;

	if (!net_eq(dev_net(dev), &init_net))
		goto drop;

	nskb = skb_copy(skb, GFP_ATOMIC);
	if (!nskb)
		goto drop;
	kfree_skb(skb);
	skb = nskb;

	/*
                                                            
  */
	nb = x25_get_neigh(dev);
	if (!nb) {
		printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name);
		goto drop;
	}

	if (!pskb_may_pull(skb, 1))
		return 0;

	switch (skb->data[0]) {

	case X25_IFACE_DATA:
		skb_pull(skb, 1);
		if (x25_receive_data(skb, nb)) {
			x25_neigh_put(nb);
			goto out;
		}
		break;

	case X25_IFACE_CONNECT:
		x25_link_established(nb);
		break;

	case X25_IFACE_DISCONNECT:
		x25_link_terminated(nb);
		break;
	}
	x25_neigh_put(nb);
drop:
	kfree_skb(skb);
out:
	return 0;
}
示例#2
0
/*
 *	Handle the ioctls that control the subscription functions.
 */
int x25_subscr_ioctl(unsigned int cmd, void *arg)
{
	struct x25_subscrip_struct x25_subscr;
	struct x25_neigh *x25_neigh;
	struct device *dev;

	switch (cmd) {

		case SIOCX25GSUBSCRIP:
			if ((dev = x25_dev_get(x25_subscr.device)) == NULL)
				return -EINVAL;
			if ((x25_neigh = x25_get_neigh(dev)) == NULL)
				return -EINVAL;
			x25_subscr.extended = x25_neigh->extended;
			if (copy_to_user(arg, &x25_subscr, sizeof(struct x25_subscrip_struct)))
				return -EFAULT;
			break;

		case SIOCX25SSUBSCRIP:
			if (copy_from_user(&x25_subscr, arg, sizeof(struct x25_subscrip_struct)))
				return -EFAULT;
			if ((dev = x25_dev_get(x25_subscr.device)) == NULL)
				return -EINVAL;
			if ((x25_neigh = x25_get_neigh(dev)) == NULL)
				return -EINVAL;
			if (x25_subscr.extended != 0 && x25_subscr.extended != 1)
				return -EINVAL;
			x25_neigh->extended = x25_subscr.extended;
			break;

		default:
			return -EINVAL;
	}

	return 0;
}
示例#3
0
int x25_llc_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype)
{
	struct x25_neigh *neigh;

	skb->sk = NULL;

	/*
	 *	Packet received from unrecognised device, throw it away.
	 */
	if ((neigh = x25_get_neigh(dev)) == NULL) {
		printk(KERN_DEBUG "X.25: unknown_neighbour - %s\n", dev->name);
		kfree_skb(skb);
		return 0;
	}

	return x25_receive_data(skb, neigh);
}
示例#4
0
int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype)
{
	struct x25_neigh *neigh;
	int queued;

	skb->sk = NULL;

	/*
	 *	Packet received from unrecognised device, throw it away.
	 */
	if ((neigh = x25_get_neigh(dev)) == NULL) {
		printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name);
		kfree_skb(skb);
		return 0;
	}

	switch (skb->data[0]) {
		case 0x00:
			skb_pull(skb, 1);
			queued = x25_receive_data(skb, neigh);
			if( ! queued )
				/* We need to free the skb ourselves because
				 * net_bh() won't care about our return code.
				 */
				kfree_skb(skb);
			return 0;

		case 0x01:
			x25_link_established(neigh);
			kfree_skb(skb);
			return 0;

		case 0x02:
			x25_link_terminated(neigh);
			kfree_skb(skb);
			return 0;

		case 0x03:
			kfree_skb(skb);
			return 0;

		default:
			kfree_skb(skb);
			return 0;
	}
}
int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
			   struct packet_type *ptype, struct net_device *orig_dev)
{
	struct sk_buff *nskb;
	struct x25_neigh *nb;

	if (!net_eq(dev_net(dev), &init_net))
		goto drop;

	nskb = skb_copy(skb, GFP_ATOMIC);
	if (!nskb)
		goto drop;
	kfree_skb(skb);
	skb = nskb;

	/*
	 * Packet received from unrecognised device, throw it away.
	 */
	nb = x25_get_neigh(dev);
	if (!nb) {
		printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name);
		goto drop;
	}

	switch (skb->data[0]) {
		case 0x00:
			skb_pull(skb, 1);
			if (x25_receive_data(skb, nb)) {
				x25_neigh_put(nb);
				goto out;
			}
			break;
		case 0x01:
			x25_link_established(nb);
			break;
		case 0x02:
			x25_link_terminated(nb);
			break;
	}
	x25_neigh_put(nb);
drop:
	kfree_skb(skb);
out:
	return 0;
}
int x25_forward_call(struct x25_address *dest_addr, struct x25_neigh *from,
			struct sk_buff *skb, int lci)
{
	struct x25_route *rt;
	struct x25_neigh *neigh_new = NULL;
	struct list_head *entry;
	struct x25_forward *x25_frwd, *new_frwd;
	struct sk_buff *skbn;
	short same_lci = 0;
	int rc = 0;

	if ((rt = x25_get_route(dest_addr)) == NULL)
		goto out_no_route;

	if ((neigh_new = x25_get_neigh(rt->dev)) == NULL) {
<<<<<<< HEAD
		/* This shouldn't happen, if it occurs somehow
=======
		/* This shouldnt happen, if it occurs somehow
>>>>>>> 296c66da8a02d52243f45b80521febece5ed498a
		 * do something sensible
		 */
		goto out_put_route;
	}