/* a disconnect is indicated by lower layer */ static int isdn_x25iface_disconn_ind(struct concap_proto *cprot) { struct sk_buff *skb; enum wan_states *state_p = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state); IX25DEBUG( "isdn_x25iface_disconn_ind %s \n", MY_DEVNAME(cprot -> net_dev) ); if( *state_p == WAN_UNCONFIGURED ){ printk(KERN_WARNING "isdn_x25iface_disconn_ind while unconfigured\n"); return -1; } if(! cprot -> net_dev) return -1; *state_p = WAN_DISCONNECTED; skb = dev_alloc_skb(1); if( skb ){ *( skb_put(skb, 1) ) = 0x02; skb->protocol = x25_type_trans(skb, cprot->net_dev); netif_rx(skb); return 0; } else { printk(KERN_WARNING "isdn_x25iface_disconn_ind:" " out of memory\n"); return -1; } }
static void x25_asy_bump(struct x25_asy *sl) { struct net_device *dev = sl->dev; struct sk_buff *skb; int count; int err; count = sl->rcount; dev->stats.rx_bytes += count; skb = dev_alloc_skb(count+1); if (skb == NULL) { netdev_warn(sl->dev, "memory squeeze, dropping packet\n"); dev->stats.rx_dropped++; return; } skb_push(skb, 1); /* LAPB internal control */ skb_put_data(skb, sl->rbuff, count); skb->protocol = x25_type_trans(skb, sl->dev); err = lapb_data_received(skb->dev, skb); if (err != LAPB_OK) { kfree_skb(skb); printk(KERN_DEBUG "x25_asy: data received err - %d\n", err); } else { netif_rx(skb); dev->stats.rx_packets++; } }
static void x25_asy_bump(struct x25_asy *sl) { struct sk_buff *skb; int count; int err; count = sl->rcount; sl->stats.rx_bytes+=count; skb = dev_alloc_skb(count+1); if (skb == NULL) { printk("%s: memory squeeze, dropping packet.\n", sl->dev->name); sl->stats.rx_dropped++; return; } skb_push(skb,1); /* LAPB internal control */ memcpy(skb_put(skb,count), sl->rbuff, count); skb->protocol = x25_type_trans(skb, sl->dev); if((err=lapb_data_received(skb->dev, skb))!=LAPB_OK) { kfree_skb(skb); printk(KERN_DEBUG "x25_asy: data received err - %d\n",err); } else { netif_rx(skb); sl->dev->last_rx = jiffies; sl->stats.rx_packets++; } }
static int x25_data_indication(struct net_device *dev, struct sk_buff *skb) { unsigned char *ptr; skb_push(skb, 1); if (skb_cow(skb, 1)) return NET_RX_DROP; ptr = skb->data; *ptr = X25_IFACE_DATA; skb->protocol = x25_type_trans(skb, dev); return netif_rx(skb); }
/* deliver a dl_data frame received from i4l HL driver to the network layer */ static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb) { IX25DEBUG( "isdn_x25iface_receive %s \n", MY_DEVNAME(cprot->net_dev) ); if ( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state == WAN_CONNECTED ){ if( skb_push(skb, 1)){ skb -> data[0]=0x00; skb->protocol = x25_type_trans(skb, cprot->net_dev); netif_rx(skb); return 0; } } printk(KERN_WARNING "isdn_x25iface_receive %s: not connected, skb dropped\n", MY_DEVNAME(cprot->net_dev) ); dev_kfree_skb(skb); return -1; }
static void x25_connect_disconnect(struct net_device *dev, int reason, int code) { struct sk_buff *skb; unsigned char *ptr; if ((skb = dev_alloc_skb(1)) == NULL) { printk(KERN_ERR "%s: out of memory\n", dev->name); return; } ptr = skb_put(skb, 1); *ptr = code; skb->protocol = x25_type_trans(skb, dev); netif_rx(skb); }
static void x25_asy_disconnected(struct net_device *dev, int reason) { struct x25_asy *sl = dev->priv; struct sk_buff *skb; unsigned char *ptr; if ((skb = dev_alloc_skb(1)) == NULL) { printk(KERN_ERR "x25_asy: out of memory\n"); return; } ptr = skb_put(skb, 1); *ptr = 0x02; skb->protocol = x25_type_trans(skb, sl->dev); netif_rx(skb); }
static void x25_asy_disconnected(struct net_device *dev, int reason) { struct x25_asy *sl = netdev_priv(dev); struct sk_buff *skb; unsigned char *ptr; skb = dev_alloc_skb(1); if (skb == NULL) { netdev_err(dev, "out of memory\n"); return; } ptr = skb_put(skb, 1); *ptr = X25_IFACE_DISCONNECT; skb->protocol = x25_type_trans(skb, sl->dev); netif_rx(skb); }