--- zzzz-none-000/linux-2.6.32.61/drivers/net/ppp_generic.c 2013-06-10 09:43:48.000000000 +0000 +++ ar9-7330-650/linux-2.6.32.61/drivers/net/ppp_generic.c 2011-07-20 07:23:51.000000000 +0000 @@ -49,6 +49,11 @@ #include #include +#if (defined(CONFIG_FUSIV_KERNEL_AP_2_AP) || defined(CONFIG_FUSIV_KERNEL_AP_2_AP_MODULE) ) && defined(CONFIG_ATM) +#include +struct ppp_channel *getPPPChannel(struct net_device *net_dev); +#endif + #include #include #include @@ -1215,6 +1220,17 @@ /* peek at outbound CCP frames */ ppp_ccp_peek(ppp, skb, 0); break; +#ifdef CONFIG_IFX_IPQOS +//LCP prioritization hack + case PPP_LCP: + case PPP_IPCP: + case PPP_PAP: + case PPP_CHAP: + /* MARK LCP frames with highest priority */ + /* hack for QOS: if QOS is enabled, give highest priority to LCP control packets */ + skb->priority = 7; + break; +#endif } /* try to do packet compression */ @@ -1536,6 +1552,7 @@ if (pch->chan) { while (!skb_queue_empty(&pch->file.xq)) { skb = skb_dequeue(&pch->file.xq); + skb->priority = 7; /* For LCP Prioritization */ if (!pch->chan->ops->start_xmit(pch->chan, skb)) { /* put the packet back and try again later */ skb_queue_head(&pch->file.xq, skb); @@ -1665,6 +1682,9 @@ struct sk_buff *ns; int proto, len, npi; +#if (defined(CONFIG_FUSIV_KERNEL_AP_2_AP) || defined(CONFIG_FUSIV_KERNEL_AP_2_AP_MODULE) ) && defined(CONFIG_ATM) + unsigned char encap; +#endif /* * Decompress the frame, if compressed. * Note that some decompressors need to see uncompressed frames @@ -1732,11 +1752,29 @@ case PPP_CCP: ppp_ccp_peek(ppp, skb, 1); break; +#ifdef CONFIG_IFX_IPQOS +// LCP prioritization hack + case PPP_LCP: + case PPP_IPCP: + case PPP_PAP: + case PPP_CHAP: + /* MARK LCP frames with highest priority */ + /* hack for QOS: if QOS is enabled, give highest priority to LCP control packets */ + skb->priority = 7; + break; +#endif } ++ppp->dev->stats.rx_packets; ppp->dev->stats.rx_bytes += skb->len - 2; +#if (defined(CONFIG_FUSIV_KERNEL_AP_2_AP) || defined(CONFIG_FUSIV_KERNEL_AP_2_AP_MODULE) ) && defined(CONFIG_ATM) + encap = skb->encap; + + if ((encap == ENCAPIDROUTEDLLCPPPOA) || (encap == ENCAPIDROUTEDVCPPPOA)) + proto = PPP_IP; +#endif + npi = proto_to_npindex(proto); if (npi < 0) { /* control or unknown frame - pass it to pppd */ @@ -1783,6 +1821,11 @@ || ppp->npmode[npi] != NPMODE_PASS) { kfree_skb(skb); } else { + +#if (defined(CONFIG_FUSIV_KERNEL_AP_2_AP) || defined(CONFIG_FUSIV_KERNEL_AP_2_AP_MODULE) ) && defined(CONFIG_ATM) + if((encap != ENCAPIDROUTEDLLCPPPOA) && + (encap != ENCAPIDROUTEDVCPPPOA)) +#endif /* chop off protocol */ skb_pull_rcsum(skb, 2); skb->dev = ppp->dev; @@ -2896,10 +2939,99 @@ return idr_find(p, n); } +#if (defined(CONFIG_IFX_PPA_API) || defined(CONFIG_IFX_PPA_API_MODULE)) + +#if (defined(CONFIG_PPPOE) || defined(CONFIG_PPPOE_MODULE)) +extern int32_t ppa_get_pppoe_info(struct net_device *dev, void *po, uint32_t pppoe_id, void *value); +#endif +#if (defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)) +struct pppoatm_vcc; +extern int32_t ppa_get_pppoa_info(struct net_device *dev, void *pvcc, uint32_t pppoa_id, void *value); +#endif + +/*it's very unlikely we need lock_kernel here to prevent the device being destroyed*/ +int32_t ppa_ppp_get_info(struct net_device *ppp_dev, uint32_t ppp_info_id, void *value) +{ + struct ppp *ppp; + struct channel *pch; + struct list_head *list; + int32_t ret = -EFAULT; + struct ppp_net *pn; + + if(unlikely(!ppp_dev || !value)){ + printk("PPP arg error\n"); + return ret; + } + + ppp = netdev_priv(ppp_dev); + + if (unlikely(!(ppp_dev->flags & IFF_POINTOPOINT) || !ppp)){ + printk("PPP device in abnormal status!\n"); + return ret; + } + + /*check ppp validity */ + + ppp_lock(ppp); + if(unlikely(ppp->file.dead || atomic_read(&ppp->file.refcnt) == 0 || !ppp->dev || ppp->n_channels == 0)){ + printk("PPP device is dead, being destroyed!\n"); + goto err_unlockppp; + } + + /*don't support multipul link*/ + if(unlikely(ppp->flags & SC_MULTILINK)){ + printk("Don't support multiple link\n"); + goto err_unlockppp; + } + + list = &ppp->channels; + if(unlikely(list_empty(list))){ + printk("PPP channel list empty!\n"); + goto err_unlockppp; + } + + list = list->next; + pch = list_entry(list, struct channel, clist); + + if(unlikely(!pch->chan)){ + printk("PPP cannot get channel!\n"); + goto err_unlockppp; + } + + pn = ppp_pernet(pch->chan_net); + + spin_lock_bh(&pn->all_channels_lock); /* we only need to guarantee the channel won't be destroyed, release ppp's lock to increase speed */ + ppp_unlock(ppp); + + if((ppp_info_id & PPA_PPP_MASK) == PPA_PPPOE_ID){ +#if (defined(CONFIG_PPPOE) || defined(CONFIG_PPPOE_MODULE)) + ret = ppa_get_pppoe_info(ppp_dev, pch->chan->private, ppp_info_id >>PPA_PPP_MASK_LEN, value); +#endif + }else{ +#if (defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)) + ret = ppa_get_pppoa_info(ppp_dev, pch->chan->private, ppp_info_id >>PPA_PPP_MASK_LEN, value); +#endif + } + spin_unlock_bh(&pn->all_channels_lock); + + return ret; + + +err_unlockppp: + ppp_unlock(ppp); + + return ret; +} +EXPORT_SYMBOL(ppa_ppp_get_info); + +#endif /* Module/initialization stuff */ module_init(ppp_init); module_exit(ppp_cleanup); +#if (defined(CONFIG_FUSIV_KERNEL_AP_2_AP) || defined(CONFIG_FUSIV_KERNEL_AP_2_AP_MODULE) ) && defined(CONFIG_ATM) +EXPORT_SYMBOL(getPPPChannel); +#endif EXPORT_SYMBOL(ppp_register_net_channel); EXPORT_SYMBOL(ppp_register_channel);