--- zzzz-none-000/linux-3.10.107/net/atm/pppoatm.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/net/atm/pppoatm.c 2021-11-10 11:53:56.000000000 +0000 @@ -33,6 +33,12 @@ * These hooks are not yet available in ppp_generic */ +/** + * Some part of this file is modified by Ikanos Communications. + * + * Copyright (C) 2013-2014 Ikanos Communications. + */ + #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ #include @@ -50,6 +56,14 @@ #include "common.h" +#if defined(CONFIG_MACH_FUSIV) +#define LLC_PPPOA_OVERHEAD 6 +#define VC_PPPOA_OVERHEAD 2 +extern int (*AtmUpdateNewVCInfo_ptr)(int encap, struct atm_vcc *atmvcc, int moduleId, char *ifname); +extern int (*AtmDeleteVCInfo_ptr)(short vpi,int vci); +extern int get_PPPOAOverhead(struct ppp_channel *ppp_chan); +#endif + enum pppoatm_encaps { e_autodetect = PPPOATM_ENCAPS_AUTODETECT, e_vc = PPPOATM_ENCAPS_VC, @@ -169,6 +183,10 @@ { struct pppoatm_vcc *pvcc; pvcc = atmvcc_to_pvcc(atmvcc); + +#if defined(CONFIG_MACH_FUSIV) + (*AtmDeleteVCInfo_ptr)(atmvcc->vpi,atmvcc->vci); +#endif atmvcc->push = pvcc->old_push; atmvcc->pop = pvcc->old_pop; atmvcc->release_cb = pvcc->old_release_cb; @@ -196,10 +214,12 @@ atm_return(atmvcc, skb->truesize); switch (pvcc->encaps) { case e_llc: +#if !defined(CONFIG_MACH_FUSIV) if (skb->len < LLC_LEN || memcmp(skb->data, pppllc, LLC_LEN)) goto error; skb_pull(skb, LLC_LEN); +#endif break; case e_autodetect: if (pvcc->chan.ppp == NULL) { /* Not bound yet! */ @@ -385,7 +405,22 @@ return -ENOTTY; } +#if defined(CONFIG_MACH_FUSIV) +int getInfaceUnit(void* atmVCC) +{ + int unit = -1; + struct atm_vcc *atmvcc = (struct atm_vcc *)atmVCC; + struct pppoatm_vcc *pvcc = atmvcc_to_pvcc(atmvcc); + unit = ppp_unit_number(&(pvcc->chan)); + return unit; +} +#endif + +#if defined(CONFIG_MACH_FUSIV) +static /*const*/ struct ppp_channel_ops pppoatm_ops = { +#else static const struct ppp_channel_ops pppoatm_ops = { +#endif .start_xmit = pppoatm_send, .ioctl = pppoatm_devppp_ioctl, }; @@ -434,7 +469,9 @@ atmvcc->release_cb = pppoatm_release_cb; __module_get(THIS_MODULE); atmvcc->owner = THIS_MODULE; - +#if defined(CONFIG_MACH_FUSIV) + (*AtmUpdateNewVCInfo_ptr)(be.encaps, atmvcc, ADI_PPPOA_MODULE, "ppp0"); +#endif /* re-process everything received between connection setup and backend setup */ vcc_process_recv_queue(atmvcc); @@ -466,6 +503,22 @@ return -EINVAL; return pppoatm_assign_vcc(atmvcc, argp); } +#if defined(CONFIG_MACH_FUSIV) + case ATM_DEL_INTERFACE: + { + atm_backend_t b; + if (get_user(b, (atm_backend_t *) arg)) + return -EFAULT; + if (b != ATM_BACKEND_PPP) + return -ENOIOCTLCMD; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + pppoatm_unassign_vcc(atmvcc); + + } + + return 0; +#endif case PPPIOCGCHAN: return put_user(ppp_channel_index(&atmvcc_to_pvcc(atmvcc)-> chan), (int __user *) argp) ? -EFAULT : 0; @@ -476,6 +529,32 @@ return -ENOIOCTLCMD; } +#if defined(CONFIG_MACH_FUSIV) +int isPPPModTypePPPoA(struct ppp_channel *pppchan) +{ + if ((pppchan->ops) && + (pppchan->ops->start_xmit) && + (pppchan->ops->start_xmit == pppoatm_send)) + return 1; + + return 0; +} + + +int get_PPPOAOverhead(struct ppp_channel *pppchan) +{ + struct pppoatm_vcc *pvcc = chan_to_pvcc(pppchan); + if (pvcc->encaps == e_llc) + { + return LLC_PPPOA_OVERHEAD; + } + else + { + return VC_PPPOA_OVERHEAD; + } +} +#endif + static struct atm_ioctl pppoatm_ioctl_ops = { .owner = THIS_MODULE, .ioctl = pppoatm_ioctl, @@ -495,6 +574,13 @@ module_init(pppoatm_init); module_exit(pppoatm_exit); +#if defined(CONFIG_MACH_FUSIV) +EXPORT_SYMBOL(isPPPModTypePPPoA); +EXPORT_SYMBOL(getInfaceUnit); + +EXPORT_SYMBOL(get_PPPOAOverhead); +#endif + MODULE_AUTHOR("Mitchell Blank Jr "); MODULE_DESCRIPTION("RFC2364 PPP over ATM/AAL5"); MODULE_LICENSE("GPL");