カーネルモジュールことはじめ #3
どのリアルサーバにも割り当てないIPVSのスケジューラ(!?)
# いったい何に対抗してんだ?俺(^^;;
# 5/29追記、
大事なもの忘れてた!!
register_ip_vs_scheduler() で指定している構造体を定義してないやん!
というわけでコードに追記しました。試してみた人(もしいたら)ごめんなさい。
ip_vs_test.c
#include <linux/module.h> #include <linux/kernel.h> #include <net/ip_vs.h> static int ip_vs_test_init_svc(struct ip_vs_service *svc) { IP_VS_DBG(7, "ip_vs_test: init_svc\n"); return 0; } static int ip_vs_test_done_svc(struct ip_vs_service *svc) { IP_VS_DBG(7, "ip_vs_test: done_svc\n"); return 0; } static int ip_vs_test_update_svc(struct ip_vs_service *svc) { IP_VS_DBG(7, "ip_vs_test: update_svc\n"); return 0; } static struct ip_vs_dest * ip_vs_test_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { IP_VS_DBG(7, "ip_vs_test_schedule(): Scheduling...\n"); return 0; } /*----- 5/29追記 -----*/ static struct ip_vs_scheduler ip_vs_test_scheduler = { .name = "test", .refcnt = ATOMIC_INIT(0), .module = THIS_MODULE, .init_service = ip_vs_test_init_svc, .done_service = ip_vs_test_done_svc, .update_service = ip_vs_test_update_svc, .schedule = ip_vs_test_schedule, }; /*----- ここまで -----*/ static int __init ip_vs_test_init(void) { /*----- 5/29追記 -----*/ INIT_LIST_HEAD(&ip_vs_test_scheduler.n_list); /*----- ここまで -----*/ return register_ip_vs_scheduler(&ip_vs_test_scheduler) ; } static void __exit ip_vs_test_cleanup(void) { unregister_ip_vs_scheduler(&ip_vs_test_scheduler); } module_init(ip_vs_test_init); module_exit(ip_vs_test_cleanup); MODULE_LICENSE("GPL");
とりあえず最低限必要なのはこんだけ。
スマートに動かすには net/ipv4/ipvs/Kconfig と net/ipv4/ipvs/Makefile を書き換えるのが楽かな。
とりあえずはこれで
# ipvsadm -A -t 10.0.0.1:80 -s test
とかできるようになるかと・・・