>> Должен отметить, что директория /lib/modules/2.6.26-2-686/build у меня отсутсвовала.
>> Я ее создал ради пробы вручную
> PavelR, тяжело тебе будет довести эту затею с помощью до конца --
> но за попытку конечто честные +100500
> если не секрет, с чего начал изучать kernel-programming? я вот с модификации
> ipt_recent.Мне было надо маркировать realm-ами трафик, который проходил через bridge.
Убойный патч, который делал это выглядел примерно так:
nswhost:/usr/src/modules/bridge# diff -u br_netfilter.c.orig br_netfilter.c
--- br_netfilter.c.orig 2009-12-03 09:51:21.000000000 +0600
+++ br_netfilter.c 2010-07-04 16:13:04.000000000 +0700
@@ -55,6 +55,7 @@
#ifdef CONFIG_SYSCTL
static struct ctl_table_header *brnf_sysctl_header;
+static int brnf_call_iproute __read_mostly = 0;
static int brnf_call_iptables __read_mostly = 1;
static int brnf_call_ip6tables __read_mostly = 1;
static int brnf_call_arptables __read_mostly = 1;
@@ -411,6 +412,11 @@
kfree_skb(skb);
return 0;
}
+ if (brnf_call_iproute) {
+ if (!(err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
+ rt->u.dst.tclassid = skb_dst(skb)->tclassid;
+ }
+ }
dst_hold(&rt->u.dst);
skb_dst_set(skb, &rt->u.dst);
}
@@ -979,6 +985,13 @@
static ctl_table brnf_table[] = {
{
+ .procname = "bridge-nf-call-iproute",
+ .data = &brnf_call_iproute,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = brnf_sysctl_call_tables,
+ },
+ {
.procname = "bridge-nf-call-arptables",
.data = &brnf_call_arptables,
.maxlen = sizeof(int),
Всё это делалось на удаленном рабочем сервере :-) (что поделать, оборудования чтобы создать тестовую среду - фактически нет, всё "на интерес")
И было очень интересно, ставишь в кроне ребут через 5 минут "на всякий случай", загружаешь модуль, заставляешь трафик идти через него (скриптом полностью перестраивается настройка сети).
Затем врубаешь флажок bridge-nf-call-iproute и смотришь, поперло или нет :-)
Это поработало несколько месяцев, но потом отказался из-за низкой стабильности - раз в месяц штормом в сети (плоская сетка провайдера на >1000 адресов в одном огромном физическом сегменте) или чем-то еще всё это дело стабильно "перекрывало" и сеть терялась. Серв удаленный, и подиагностировать это сложновато, поэтому в результате переделано на proxyarp - он лишние пакеты не слушает, маршрутизирует пакеты "честно" и делает требуемую раскраску.
Попутно была разрисована схема прохождения пакетов через вызовы, ну и т д )
Собственно, написание модуля для задачи топика - это уже не первая попытка работы с saa713х, первые попытки были когда очень хотелось заставить его цифровать звук не на 32кГц, а на 44 :-) Был найден SDK :-) Но это уж больно сложно оказалось, в результате звук цифровался внешней звуковой картой (всё это было для вещания в интернет эфирной радиостанции, мы же не сразу идем простым путем, зато интересно :).
ну а эта реализация модуля писалась практически копипастом из других модулей ядра, по образу и подобию. Параллельно руководствовался LKMPG и сайтами с LXR. Когда не понятно, как работает некий вызов - смотришь её исходник, и мал-мальски проясняются моменты, где будет выделяться память и т п )
Очень интересная вещь - это работа container_of() ...
В общем, изучение было достаточно большой частью написания и этого модуля :-)
Я вообще на С не программирую ..... ))))