Send.c_休闲[root@server1 ~]# cat send.c
Send.c_休闲/*                                                                                                            
Send.c_休闲 * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $    
Send.c_休闲 */
                                                                                                        
Send.c_休闲#include <linux/init.h>
Send.c_休闲#include <linux/module.h>
Send.c_休闲#include <lp.h>
Send.c_休闲MODULE_LICENSE("Dual BSD/GPL");
Send.c_休闲
Send.c_休闲int send = 0;
Send.c_休闲module_param(send, int, S_IRUGO);
Send.c_休闲
Send.c_休闲net_device_t * NIC = NULL;
Send.c_休闲
Send.c_休闲int lp_recv(sk_buff_t * skb, net_device_t * dev, packet_type_t * pt, net_device_t * d){
Send.c_休闲                PDEBUG("lp_recv is being invoked\n");
Send.c_休闲                return NET_RX_SUCCESS;
Send.c_休闲}
Send.c_休闲
Send.c_休闲packet_type_t lp_ptype = {
Send.c_休闲                .type = __constant_htons(ETH_P_LP),
Send.c_休闲                .func = lp_recv,
Send.c_休闲                .dev = NULL,
Send.c_休闲                .af_packet_priv = NULL,
Send.c_休闲};
Send.c_休闲
Send.c_休闲int lp_send_skb(sk_buff_t * skb)
Send.c_休闲{
Send.c_休闲                ethhdr_t * eth = NULL;
Send.c_休闲                char * dest = kmalloc(ETH_ALEN, GFP_KERNEL);
Send.c_休闲                if(!dest)
Send.c_休闲                {
Send.c_休闲                                PDEBUG("alloc dest fail");
Send.c_休闲                }
Send.c_休闲                dest[0] = 0x00;
Send.c_休闲                dest[1] = 0x16;
Send.c_休闲                dest[2] = 0x3e;
Send.c_休闲                dest[3] = 0x53;
Send.c_休闲                dest[4] = 0x12;
Send.c_休闲                dest[5] = 0x51;
Send.c_休闲
Send.c_休闲                skb->data_len = 0;
Send.c_休闲                skb->len =    LINK_HDR + 10;
Send.c_休闲                skb->tail = skb->data + LINK_HDR + 10;
Send.c_休闲                skb->mac.raw = skb->nh.raw = skb->h.raw = skb->data;
Send.c_休闲                skb->dev = NIC;
Send.c_休闲                skb->protocol = htons(ETH_P_LP);
Send.c_休闲                eth = (ethhdr_t *)skb->data;
Send.c_休闲                eth->h_proto = htons(ETH_P_LP);
Send.c_休闲                memcpy(eth->h_dest, dest, ETH_ALEN);
Send.c_休闲                memcpy(eth->h_source, NIC->dev_addr, ETH_ALEN);
Send.c_休闲                if(dev_queue_xmit(skb)){
Send.c_休闲                                return -1;
Send.c_休闲                }
Send.c_休闲                return 0;
Send.c_休闲}
Send.c_休闲
Send.c_休闲static int send_init(void)
Send.c_休闲{
Send.c_休闲                sk_buff_t * skb;
Send.c_休闲                if(!(NIC = dev_get_by_name("eth0")))
Send.c_休闲                {
Send.c_休闲                                PDEBUG("NIC is null\n");
Send.c_休闲                                return -ENODEV;
Send.c_休闲                }
Send.c_休闲                dev_add_pack(&lp_ptype);
Send.c_休闲                PDEBUG("lp init\n");
Send.c_休闲                if(send)
Send.c_休闲                {
Send.c_休闲                                if(!(skb = alloc_skb(LINK_HDR+10, GFP_KERNEL)))
Send.c_休闲                                {
Send.c_休闲                                                PDEBUG("alloc skb fail\n");
Send.c_休闲                                }
Send.c_休闲                                if(!lp_send_skb(skb))
Send.c_休闲                                {
Send.c_休闲                                                PDEBUG("send success\n");
Send.c_休闲                                }
Send.c_休闲                                kfree_skb(skb);
Send.c_休闲                }
Send.c_休闲                return 0;
Send.c_休闲}
Send.c_休闲
Send.c_休闲static void send_exit(void)
Send.c_休闲{
Send.c_休闲                dev_remove_pack(&lp_ptype);
Send.c_休闲                dev_put(NIC);
Send.c_休闲                PDEBUG("lp exit\n");
Send.c_休闲}
Send.c_休闲
Send.c_休闲module_init(send_init);
Send.c_休闲module_exit(send_exit);