static int kaodv_netlink_receive_peer(unsigned char type, void *msg, unsigned int len) { int ret = 0; struct kaodv_rt_msg *m; struct kaodv_conf_msg *cm; struct expl_entry e; KAODV_DEBUG("Received msg: %s", kaodv_msg_type_to_str(type)); switch (type) { case KAODVM_ADDROUTE: if (len < sizeof(struct kaodv_rt_msg)) return -EINVAL; m = (struct kaodv_rt_msg *)msg; ret = kaodv_expl_get(m->dst, &e); if (ret > 0) { ret = kaodv_expl_update(m->dst, m->nhop, m->time, m->flags, m->ifindex); } else { ret = kaodv_expl_add(m->dst, m->nhop, m->time, m->flags, m->ifindex); } printk(KERN_DEBUG "kaodv: KAODVM_ADDROUTE!\n"); kaodv_queue_set_verdict(KAODV_QUEUE_SEND, m->dst); break; case KAODVM_DELROUTE: if (len < sizeof(struct kaodv_rt_msg)) return -EINVAL; m = (struct kaodv_rt_msg *)msg; kaodv_expl_del(m->dst); kaodv_queue_set_verdict(KAODV_QUEUE_DROP, m->dst); break; case KAODVM_NOROUTE_FOUND: if (len < sizeof(struct kaodv_rt_msg)) return -EINVAL; m = (struct kaodv_rt_msg *)msg; KAODV_DEBUG("No route found for %s", print_ip(m->dst)); kaodv_queue_set_verdict(KAODV_QUEUE_DROP, m->dst); break; case KAODVM_CONFIG: if (len < sizeof(struct kaodv_conf_msg)) return -EINVAL; cm = (struct kaodv_conf_msg *)msg; active_route_timeout = cm->active_route_timeout; qual_th = cm->qual_th; is_gateway = cm->is_gateway; break; default: printk("kaodv-netlink: Unknown message type\n"); ret = -EINVAL; } return ret; }
static int __init kaodv_init(void) { struct net_device *dev = NULL; int i, ret = -ENOMEM; const struct kaodv_proc_file *f; kaodv_expl_init(); ret = kaodv_queue_init(); if (ret < 0) return ret; ret = kaodv_netlink_init(); if (ret < 0) goto cleanup_queue; ret = nf_register_hook(&kaodv_ops[0]); if (ret < 0) goto cleanup_netlink; ret = nf_register_hook(&kaodv_ops[1]); if (ret < 0) goto cleanup_hook0; ret = nf_register_hook(&kaodv_ops[2]); if (ret < 0) goto cleanup_hook1; /* Prefetch network device info (ip, broadcast address, ifindex). */ for (i = 0; i < MAX_INTERFACES; i++) { if (!ifname[i]) break; dev = dev_get_by_name(&init_net, ifname[i]); if (!dev) { printk("No device %s available, ignoring!\n", ifname[i]); continue; } if_info_add(dev); dev_put(dev); } #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) proc_net_create("kaodv", 0, kaodv_proc_info); #else // if (!create_proc_read_entry("kaodv", 0, init_net.proc_net, kaodv_read_proc, // NULL)) // if (!proc_create("kaodv", 0, init_net.proc_net, &kaodv_fops)) // KAODV_DEBUG("Could not create kaodv proc entry"); for (f = kaodv_proc_files; f->name[0]; f++) { if (!proc_create_data(f->name, 0, init_net.proc_net, &kaodv_proc_fops, f->show)) { KAODV_DEBUG("Could not create kaodv proc entry"); } } #endif KAODV_DEBUG("Module init OK"); return ret; cleanup_hook1: nf_unregister_hook(&kaodv_ops[1]); cleanup_hook0: nf_unregister_hook(&kaodv_ops[0]); cleanup_netlink: kaodv_netlink_fini(); cleanup_queue: kaodv_queue_fini(); return ret; }
static int __init kaodv_init(void) { struct net_device *dev = NULL; int i, ret = -ENOMEM; //#ifndef KERNEL26 //EXPORT_NO_SYMBOLS; //#endif printk("\n\nMODULE INIT\n\n"); kaodv_expl_init(); ret = kaodv_queue_init(); if (ret < 0) return ret; ret = kaodv_netlink_init(); if (ret < 0) goto cleanup_queue; ret = nf_register_hook(&kaodv_ops[0]); if (ret < 0) goto cleanup_netlink; ret = nf_register_hook(&kaodv_ops[1]); if (ret < 0) goto cleanup_hook0; ret = nf_register_hook(&kaodv_ops[2]); if (ret < 0) goto cleanup_hook1; /* Prefetch network device info (ip, broadcast address, ifindex). */ for (i = 0; i < MAX_INTERFACES; i++) { if (!ifname[i]) break; dev = dev_get_by_name(&init_net, ifname[i]); if (!dev) { printk("No device %s available, ignoring!\n", ifname[i]); continue; } if_info_add(dev); dev_put(dev); } if (!proc_create("kaodv", 0, NULL, &proc_fops)) KAODV_DEBUG("Could not create kaodv proc entry"); KAODV_DEBUG("Module init OK"); return ret; cleanup_hook1: nf_unregister_hook(&kaodv_ops[1]); cleanup_hook0: nf_unregister_hook(&kaodv_ops[0]); cleanup_netlink: kaodv_netlink_fini(); cleanup_queue: kaodv_queue_fini(); return ret; }
static int __init kaodv_init(void) { struct net_device *dev = NULL; int i, ret = -ENOMEM; //#ifndef KERNEL26 // EXPORT_NO_SYMBOLS; //#endif kaodv_expl_init(); ret = kaodv_queue_init(); if (ret < 0) return ret; ret = kaodv_netlink_init(); if (ret < 0) goto cleanup_queue; ret = nf_register_hook(&kaodv_ops[0]); if (ret < 0) goto cleanup_netlink; ret = nf_register_hook(&kaodv_ops[1]); if (ret < 0) goto cleanup_hook0; ret = nf_register_hook(&kaodv_ops[2]); if (ret < 0) goto cleanup_hook1; ret = nf_register_hook(&kaodv_ops[3]); if (ret < 0) goto cleanup_hook2; /* Prefetch network device info (ip, broadcast address, ifindex). */ for (i = 0; i < MAX_INTERFACES; i++) { if (!ifname[i]) { printk(KERN_DEBUG "kaodv: No name available for %d!\n", i); break; } dev = dev_get_by_name(&init_net, ifname[i]); if (!dev) { printk(KERN_DEBUG "kaodv: No device %s available, ignoring!\n", ifname[i]); continue; } if_info_add(dev); dev_put(dev); printk(KERN_DEBUG "kaodv: add dev %d.\n", i); } //#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) // proc_net_create("kaodv", 0, kaodv_proc_info); //#else if (!create_proc_read_entry("kaodv", 0, init_net.proc_net, kaodv_read_proc, NULL)) KAODV_DEBUG("Could not create kaodv proc entry"); //#endif KAODV_DEBUG("Module init OK"); return ret; cleanup_hook2: nf_unregister_hook(&kaodv_ops[2]); cleanup_hook1: nf_unregister_hook(&kaodv_ops[1]); cleanup_hook0: nf_unregister_hook(&kaodv_ops[0]); cleanup_netlink: kaodv_netlink_fini(); cleanup_queue: kaodv_queue_fini(); return ret; }