static int pvc_close(struct device *dev) { pvc_device *pvc=dev_to_pvc(dev); pvc->state=0; if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->close_pvc) pvc->master->close_pvc(pvc); pvc->master->lmi.state |= LINK_STATE_CHANGED; return 0; }
static int pvc_xmit(struct sk_buff *skb, struct device *dev) { pvc_device *pvc=dev_to_pvc(dev); if (pvc->state & PVC_STATE_ACTIVE) { skb->dev = hdlc_to_dev(pvc->master); pvc->stats.tx_bytes+=skb->len; pvc->stats.tx_packets++; dev_queue_xmit(skb); } else { pvc->stats.tx_dropped++; dev_kfree_skb(skb); } return 0; }
static int pvc_xmit(struct sk_buff *skb, struct net_device *dev) { pvc_device *pvc = dev_to_pvc(dev); if (pvc->state & PVC_STATE_ACTIVE) { skb->dev = hdlc_to_dev(pvc->master); pvc->stats.tx_bytes += skb->len; pvc->stats.tx_packets++; if (pvc->state & PVC_STATE_FECN) pvc->stats.tx_compressed++; /* TX Congestion counter */ dev_queue_xmit(skb); } else { pvc->stats.tx_dropped++; dev_kfree_skb(skb); } return 0; }
static int pvc_open(struct device *dev) { pvc_device *pvc=dev_to_pvc(dev); int result=0; if ((hdlc_to_dev(pvc->master)->flags & IFF_UP) == 0) return -EIO; /* Master must be UP in order to activate PVC */ memset(&(pvc->stats), 0, sizeof(struct net_device_stats)); pvc->state=0; if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->open_pvc) result=pvc->master->open_pvc(pvc); if (result) return result; pvc->master->lmi.state |= LINK_STATE_CHANGED; return 0; }
static struct net_device_stats *pvc_get_stats(struct device *dev) { pvc_device *pvc=dev_to_pvc(dev); return &pvc->stats; }