--- zzzz-none-000/linux-2.6.28.10/drivers/net/pppoe.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/drivers/net/pppoe.c 2009-10-13 15:55:55.000000000 +0000 @@ -92,6 +92,12 @@ static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb); static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb); +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) +unsigned char gbEnablePPPoERelay = 0; +int (*relayGotDiscoveryPacket_ptr)(struct sk_buff *skb, struct net_device *dev,struct packet_type *pt)=NULL; +int (*relayGotSessionPacket_ptr)(struct sk_buff *skb,struct net_device *dev, struct packet_type *pt)=NULL; +#endif + static const struct proto_ops pppoe_ops; static DEFINE_RWLOCK(pppoe_hash_lock); @@ -383,6 +389,21 @@ struct pppox_sock *po; int len; +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) + if(relayGotSessionPacket_ptr == NULL) + { + printk("\npppoe: pppoerelay module not initialized properly...\n"); + return 0; + } + + if( ( gbEnablePPPoERelay ) && ( (*relayGotSessionPacket_ptr)(skb,dev,pt) == 0) ) + { + //printk("PPPOE Relay Sess Packet : FAILURE\n"); + return 0; + } + else + { +#endif if (!(skb = skb_share_check(skb, GFP_ATOMIC))) goto out; @@ -412,6 +433,9 @@ kfree_skb(skb); out: return NET_RX_DROP; +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) + } +#endif } /************************************************************************ @@ -428,7 +452,17 @@ { struct pppoe_hdr *ph; struct pppox_sock *po; - +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) + if(relayGotDiscoveryPacket_ptr == NULL) + printk("\npppoe: pppoerealay module not initialized properly\n"); + if( ( gbEnablePPPoERelay )&& ((*relayGotDiscoveryPacket_ptr)(skb,dev,pt) == 0)) + { + //printk("PPPOE Relay Disc packet\n"); + goto abort; + } + else + { +#endif if (dev_net(dev) != &init_net) goto abort; @@ -468,6 +502,9 @@ kfree_skb(skb); out: return NET_RX_SUCCESS; /* Lies... :-) */ +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) + } +#endif } static struct packet_type pppoes_ptype = { @@ -1090,7 +1127,54 @@ .owner = THIS_MODULE, }; +int isPPPModTypePPPoE(struct ppp_channel *pppchan) +{ + if ((pppchan->ops) && + (pppchan->ops->start_xmit) && + (pppchan->ops->start_xmit == pppoe_xmit)) + return 1; + + return 0; +} + +char *getPPPoEIfName(struct ppp_channel *pppchan) +{ + struct sock *sk = (struct sock *) pppchan->private; + struct pppox_sock *po; + + if (!sk) + return NULL; + + po = pppox_sk(sk); + + if (!po) + return NULL; + + if (po->pppoe_dev) + return po->pppoe_dev->name; + + return NULL; +} + +int getPPPoESessIdAndAddr(struct ppp_channel *pppchan, unsigned char *addr) +{ + struct sock *sk = (struct sock *) pppchan->private; + struct pppox_sock *po; + int result; + + if (!sk) + return 0; + + po = pppox_sk(sk); + if (!po) + return 0; + + for (result = 0; result < 6; result++) + addr[result] = po->pppoe_pa.remote[result]; + + return po->pppoe_pa.sid; +} static int __init pppoe_init(void) { int err = proto_register(&pppoe_sk_proto, 0); @@ -1131,6 +1215,16 @@ module_init(pppoe_init); module_exit(pppoe_exit); +EXPORT_SYMBOL(isPPPModTypePPPoE); +EXPORT_SYMBOL(getPPPoEIfName); +EXPORT_SYMBOL(getPPPoESessIdAndAddr); + +#if defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY) || defined(CONFIG_FUSIV_KERNEL_PPPOE_RELAY_MODULE) +EXPORT_SYMBOL(gbEnablePPPoERelay); +EXPORT_SYMBOL(relayGotDiscoveryPacket_ptr); +EXPORT_SYMBOL(relayGotSessionPacket_ptr); +#endif + MODULE_AUTHOR("Michal Ostrowski "); MODULE_DESCRIPTION("PPP over Ethernet driver"); MODULE_LICENSE("GPL");