--- zzzz-none-000/linux-3.10.107/net/atm/clip.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/net/atm/clip.c 2021-11-10 11:53:56.000000000 +0000 @@ -2,6 +2,12 @@ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ +/** + * 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 @@ -43,6 +49,19 @@ #include "resources.h" #include +// AVM/TKL: MERGE fixed relative include paths +#if defined(CONFIG_MACH_FUSIV) +#include + + +#define ADI_IPOA_MODULE 1 +extern int (*AtmUpdateNewVCInfo_ptr)(int encap, struct atm_vcc *atmvcc, int moduleId, char *ifname); +extern int (*AtmDeleteVCInfo_ptr)(short vpi,int vci); +int (*updateEncapsulation_ptr)(short vpi, int vci, int encap) = NULL; +int (*AtmUpdateVCInterface_ptr)(int vpi, int vci, char *ifname) = NULL; +int (*AtmUpdateVCIPAddr_ptr)(int vpi, int vci, unsigned long ipaddr) = NULL; +#endif + static struct net_device *clip_devs; static struct atm_vcc *atmarpd; static struct timer_list idle_timer; @@ -204,6 +223,12 @@ unlink_clip_vcc(clip_vcc); clip_vcc->old_push(vcc, NULL); /* pass on the bad news */ kfree(clip_vcc); +#if defined(CONFIG_MACH_FUSIV) + if (AtmDeleteVCInfo_ptr != NULL) + (*AtmDeleteVCInfo_ptr)(vcc->vpi, vcc->vci); + else + printk("\nclip: atmdriver_lkm not initialized properly...\n"); +#endif return; } atm_return(vcc, skb->truesize); @@ -317,8 +342,18 @@ static int clip_encap(struct atm_vcc *vcc, int mode) { + int ret=0; CLIP_VCC(vcc)->encap = mode; - return 0; + +#if defined(CONFIG_MACH_FUSIV) + if(updateEncapsulation_ptr != NULL) + { + ret = (*updateEncapsulation_ptr)(vcc->vpi, vcc->vci, mode); + } + else + printk("\nclip: atmdriver_lkm is not initialized properly...\n"); +#endif + return ret; } static netdev_tx_t clip_start_xmit(struct sk_buff *skb, @@ -333,6 +368,22 @@ __be32 *daddr; int old; unsigned long flags; +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) + if((skb->apFlowData.flags1 >> AP_FLAG1_CLASSIFIED_BIT ) & 0x1) + { + n = (struct neighbour*) skb->apFlowData.neigh ; + if(!n) + { + printk(KERN_ERR "clip_start_xmit: NO FAST NEIGHBOUR !\n"); + dev_kfree_skb(skb); + dev->stats.tx_dropped++; + return 0; + } + entry = neighbour_priv(n); + goto process_vcc; + + } +#endif pr_debug("(skb %p)\n", skb); if (!dst) { @@ -354,6 +405,9 @@ return NETDEV_TX_OK; } entry = neighbour_priv(n); +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +process_vcc: +#endif if (!entry->vccs) { if (time_after(jiffies, entry->expires)) { /* should be resolved */ @@ -378,7 +432,9 @@ memcpy(here, llc_oui, sizeof(llc_oui)); ((__be16 *) here)[3] = skb->protocol; } + atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); + ATM_SKB(skb)->atm_options = vcc->atm_options; entry->vccs->last_use = jiffies; pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev); @@ -405,7 +461,14 @@ changes, use netif_wake_queue instead. */ spin_unlock_irqrestore(&clip_priv->xoff_lock, flags); out_release_neigh: +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) + if(!((skb->apFlowData.flags1 >> AP_FLAG1_CLASSIFIED_BIT ) & 0x1)) + { +#endif neigh_release(n); +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) + } +#endif return NETDEV_TX_OK; } @@ -435,6 +498,15 @@ /* re-process everything received between connection setup and MKIP */ vcc_process_recv_queue(vcc); +#if defined(CONFIG_MACH_FUSIV) + if(AtmUpdateNewVCInfo_ptr != NULL) + { + if( (*AtmUpdateNewVCInfo_ptr)(1, vcc, ADI_IPOA_MODULE, "none")<0) + return -1; + } + else + printk("clip: atmapdriver_lkm or br2684 not initialized properly...\n"); +#endif return 0; } @@ -479,6 +551,22 @@ } error = neigh_update(neigh, llc_oui, NUD_PERMANENT, NEIGH_UPDATE_F_OVERRIDE | NEIGH_UPDATE_F_ADMIN); + +#if defined(CONFIG_MACH_FUSIV) + if(AtmUpdateVCInterface_ptr != NULL) + { + (*AtmUpdateVCInterface_ptr)(vcc->vpi, vcc->vci, neigh->dev->name); //ADI + } + else + printk("\nclip: atmdriver_lkm is not initialized properly...\n") ; + + if(AtmUpdateVCIPAddr_ptr != NULL) + { + (*AtmUpdateVCIPAddr_ptr)(vcc->vpi, vcc->vci, ip); //ADI + } + else + printk("\nclip: atmdriver_lkm is not initialized properly...\n"); +#endif neigh_release(neigh); return error; } @@ -494,7 +582,11 @@ dev->type = ARPHRD_ATM; dev->neigh_priv_len = sizeof(struct atmarp_entry); dev->hard_header_len = RFC1483LLC_LEN; +#if !defined(CONFIG_MACH_FUSIV) dev->mtu = RFC1626_MTU; +#else + dev->mtu = 1500; +#endif dev->tx_queue_len = 100; /* "normal" queue (packets) */ /* When using a "real" qdisc, the qdisc determines the queue */ /* length. tx_queue_len is only used for the default case, */ @@ -538,6 +630,54 @@ return number; } +#if defined(CONFIG_MACH_FUSIV) + +int clip_delete(int number) +{ + struct net_device *dev = NULL; + struct net_device *prevdev = NULL; + + pr_debug("clip_delete %d\n",number); + if (number != -1) { + for (dev = clip_devs; dev; dev = PRIV(dev)->next) + { + if (PRIV(dev)->number == number) + { + pr_debug("device found %x\r\n",dev); + break; + } + else + prevdev = dev; + } + } + + pr_debug(" dev %x predev %x \r\n", dev,prevdev); + if(!dev) { + printk(" Device not found \r\n"); + return -1; + } + + if(dev->flags&IFF_UP) + { + printk("Device is up,Delete Failed\r\n"); + return -1; + } + else + { + + if(prevdev) + PRIV(prevdev)->next = PRIV(dev)->next; + else + clip_devs = PRIV(dev)->next; + + unregister_netdev(dev); + kfree(dev); + pr_debug("unregistered (net:%s)\n",dev->name); + return number; + } +} +#endif + static int clip_device_event(struct notifier_block *this, unsigned long event, void *arg) { @@ -640,9 +780,14 @@ /* allow replies and avoid getting closed if signaling dies */ vcc->dev = &atmarpd_dev; vcc_insert_socket(sk_atm(vcc)); +#ifdef CONFIG_LTQ_OAM + vcc->push_oam = ifx_push_oam; +#else + vcc->push = NULL; +#endif vcc->push = NULL; vcc->pop = NULL; /* crash */ - vcc->push_oam = NULL; /* crash */ + //AVMbk (push_oam is set above) vcc->push_oam = NULL; /* crash */ rtnl_unlock(); return 0; } @@ -658,6 +803,9 @@ case ATMARP_MKIP: case ATMARP_SETENTRY: case ATMARP_ENCAP: +#if defined(CONFIG_MACH_FUSIV) + case SIOCDLCLIP: +#endif if (!capable(CAP_NET_ADMIN)) return -EPERM; break; @@ -685,6 +833,11 @@ case ATMARP_ENCAP: err = clip_encap(vcc, arg); break; +#if defined(CONFIG_MACH_FUSIV) + case SIOCDLCLIP: + err = clip_delete(arg); + break; +#endif } return err; } @@ -931,6 +1084,13 @@ module_init(atm_clip_init); module_exit(atm_clip_exit); + +#if defined(CONFIG_MACH_FUSIV) +EXPORT_SYMBOL(updateEncapsulation_ptr); +EXPORT_SYMBOL(AtmUpdateVCInterface_ptr); +EXPORT_SYMBOL(AtmUpdateVCIPAddr_ptr); +#endif + MODULE_AUTHOR("Werner Almesberger"); MODULE_DESCRIPTION("Classical/IP over ATM interface"); MODULE_LICENSE("GPL");