カーネルモジュールことはじめ #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
とかできるようになるかと・・・