LINUX.ORG.RU

[rshaper] 2.6.27 -> 2.6.31


0

0

Народ, может кто подлатает сабж? А то я в этих делах не секу. Пивом, понятное дело, угостить будет проблематично, но 100 рублей на мобилу (Билайн, МТС, Мегафон) закину.

Вот исходники с нужными инклюдами из обоих ядёр, в которых не могу разобраться: http://rghost.ru/701981.

Не получается скомпилить rshaper.c, пишет:

/usr/src/rshaper/rshaper.c:554: ошибка: ‘struct net_device’ не содержит элемента с именем ‘do_ioctl’

Ответ на: комментарий от anonymous

Выводит:

/usr/src/rshaper/rshaper.c: В функции ‘rshaper_setup’:
/usr/src/rshaper/rshaper.c:552: ошибка: assignment of read-only location ‘*dev->netdev_ops’
make[2]: *** [/usr/src/rshaper/rshaper.o] Error 1
make[1]: *** [_module_/usr/src/rshaper] Error 2
fedyan
() автор топика
Ответ на: комментарий от anonymous

2.6.32:

$ make
cc -Wall -W -O2 -s -o rshaperctl rshaperctl.c
make -C /usr/src/linux M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-2.6.32-gentoo'
  CC [M]  /home/edigaryev/src/rshaper/rshaper.o
/home/edigaryev/src/rshaper/rshaper.c: В функции ‘rshaper_setup’:
/home/edigaryev/src/rshaper/rshaper.c:555: ошибка: assignment of read-only location ‘*dev->netdev_ops’
make[2]: *** [/home/edigaryev/src/rshaper/rshaper.o] Ошибка 1
make[1]: *** [_module_/home/edigaryev/src/rshaper] Ошибка 2
make[1]: Leaving directory `/usr/src/linux-2.6.32-gentoo'
make: *** [rshaper.ko] Ошибка 2

edigaryev ★★★★★
()
Ответ на: комментарий от fedyan

Вот фикс:

sudo sed -i 's/const\ struct\ net_device_ops\ \*netdev_ops;/struct\ net_device_ops\ \*netdev_ops;/' `find /usr/src -name netdevice.h`
edigaryev@brick ~/src/rshaper $ make
cc -Wall -W -O2 -s -o rshaperctl rshaperctl.c
make -C /usr/src/linux M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-2.6.32-gentoo'
  CC [M]  /home/edigaryev/src/rshaper/rshaper.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
  CC      /home/edigaryev/src/rshaper/rshaper.mod.o
  LD [M]  /home/edigaryev/src/rshaper/rshaper.ko
make[1]: Leaving directory `/usr/src/linux-2.6.32-gentoo'
edigaryev@brick ~/src/rshaper $ 

edigaryev ★★★★★
()
Ответ на: комментарий от fedyan

А, понял, на ядро. А чем это может грозить в данном конкретном случае?

fedyan
() автор топика
Ответ на: комментарий от edigaryev

patch для rshaper

diff -urN rshaper.orig/modules.order rshaper/modules.order
--- rshaper.orig/modules.order	2009-12-13 01:52:03.000000000 +0500
+++ rshaper/modules.order	2009-12-13 22:34:25.000000000 +0500
@@ -1 +1 @@
-kernel//usr/src/rshaper/rshaper.ko
+kernel//home/edigaryev/src/rshaper/rshaper.ko
diff -urN rshaper.orig/rshaper.c rshaper/rshaper.c
--- rshaper.orig/rshaper.c	2009-12-13 20:21:06.000000000 +0500
+++ rshaper/rshaper.c	2009-12-13 22:39:57.000000000 +0500
@@ -551,7 +551,7 @@
 static void rshaper_setup(struct net_device *dev)
 {
     // nothing more than ioctl
-    dev->do_ioctl = rshaper_ioctl;
+    dev->netdev_ops->ndo_do_ioctl = rshaper_ioctl;
 }
 
 static struct net_device *rshaper_dev;
@@ -566,7 +566,7 @@
    #define RSHAPER_NETDEVICE_REGISTERED         0x20
 
 
-static void __exit rshaper_cleanup(void)
+static void rshaper_cleanup(void)
 {
     struct rshaper_host *host = NULL;
     unsigned long flags;
diff -urN rshaper.orig/.tmp_versions/rshaper.mod rshaper/.tmp_versions/rshaper.mod
--- rshaper.orig/.tmp_versions/rshaper.mod	1970-01-01 05:00:00.000000000 +0500
+++ rshaper/.tmp_versions/rshaper.mod	2009-12-13 22:34:25.000000000 +0500
@@ -0,0 +1,2 @@
+/home/edigaryev/src/rshaper/rshaper.ko
+/home/edigaryev/src/rshaper/rshaper.o
+ядрохак.

edigaryev ★★★★★
()
Ответ на: комментарий от edigaryev

Лучше делать так.

static void rshaper_setup(struct net_device *dev) { // nothing more than ioctl #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) dev->netdev_ops->ndo_do_ioctl = rshaper_ioctl; #else dev->do_ioctl = rshaper_ioctl; #endif }

Иначе потеряется совместимость со старыми ядрами. Но надо точно знать версию ядра где были сделаны изменения.

anonymous
()
Ответ на: комментарий от edigaryev

Компилируется нормально, а подгружаться отказывается - вываливается с Call Trace.

anonymous
()
Ответ на: комментарий от edigaryev

Компилируется нормально, а подгружаться отказывается - вываливается с Call Trace.

fedyan
() автор топика
Ответ на: комментарий от edigaryev

1) Этот ядрохак - ошибка. Так делать нельзя.

2) Попробуйте такой вариант: убрать все хаки,

static const struct net_device_ops rshaper_dev_ops = {    .ndo_do_ioctl = rshaper_ioctl, };

/* ------------------------------------------------ The Network Device */

static void rshaper_setup(struct net_device *dev) { // nothing more than ioctl // dev->do_ioctl = rshaper_ioctl; dev->netdev_ops = &rshaper_dev_ops; }

anonymous
()
Ответ на: комментарий от anonymous

А это вот куда?

static const struct net_device_ops rshaper_dev_ops = { ndo_do_ioctl = rshaper_ioctl, };

Если одной строкой выше функции rshaper_setup, всё равно валится на этапе компиляции:

cc -Wall -W -O2 -s -o rshaperctl rshaperctl.c
make -C /usr/src/linux M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-2.6.31-gentoo-r6'
  CC [M]  /usr/src/rshaper/rshaper.o
/usr/src/rshaper/rshaper.c:551: ошибка: ‘ndo_do_ioctl’ не описан в этой области (не в функции)
make[2]: *** [/usr/src/rshaper/rshaper.o] Error 1
make[1]: *** [_module_/usr/src/rshaper] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.31-gentoo-r6'
make: *** [rshaper.ko] Error 2
fedyan
() автор топика
Ответ на: комментарий от anonymous

Вроде работает.

Убираем из ядра ошибкохак:

sed -i 's/struct\ net_device_ops\ \*netdev_ops;/const\ struct\ net_device_ops\ \*netdev_ops;/' `find /usr/src -name netdevice.h`
Патч rshaper.c:
--- rshaper.c.orig	2009-12-14 14:42:07.000000000 +0500
+++ rshaper.c	2009-12-14 14:41:59.000000000 +0500
@@ -546,12 +546,15 @@
     return 0;
 }
 
+static const struct net_device_ops rshaper_dev_ops = { .ndo_do_ioctl = rshaper_ioctl, };
+
 /* ------------------------------------------------ The Network Device */
 
 static void rshaper_setup(struct net_device *dev)
 {
     // nothing more than ioctl
-    dev->do_ioctl = rshaper_ioctl;
+    // dev->do_ioctl = rshaper_ioctl;
+    dev->netdev_ops = &rshaper_dev_ops;
 }
 
 static struct net_device *rshaper_dev;
edigaryev@brick ~/src/rshaper $ make
cc -Wall -W -O2 -s -o rshaperctl rshaperctl.c
make -C /usr/src/linux M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-2.6.32-gentoo'
  CC [M]  /home/edigaryev/src/rshaper/rshaper.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
  CC      /home/edigaryev/src/rshaper/rshaper.mod.o
  LD [M]  /home/edigaryev/src/rshaper/rshaper.ko
make[1]: Leaving directory `/usr/src/linux-2.6.32-gentoo'
brick rshaper # insmod rshaper.ko 
brick rshaper # lsmod
Module                  Size  Used by
rshaper                 3346  0 
vboxdrv               111724  0 
wl                   1257606  0 
brick rshaper # 

edigaryev ★★★★★
()
Ответ на: комментарий от edigaryev

Да, спасибо, работает! Давай номер и название оператора. :) Анон, ты тоже давай. Просьба модераторам - когда анонимус ответит, сверить его айпишники с предыдущими постами.

fedyan
() автор топика
Ответ на: комментарий от anonymous

Этот модуль с 2004 года вроде как не развивался, я его с 2.6.18-ядра юзаю. Один раз пришлось подпатчить, где-то на 2.6.24-27, там сам разобрался. Думаю, писать разработчику бессмысленно.

Сейчас ещё нашёл в инете альтернативу, подлатал для своей Gentoo. Может ещё кому пригодится, главный плюс - использует нативные ядерные функции. Сохранять в /etc/init.d/:

#!/sbin/runscript
#
#  tc uses the following units when passed as a parameter.
#  kbps: Kilobytes per second
#  mbps: Megabytes per second
#  kbit: Kilobits per second
#  mbit: Megabits per second
#  bps: Bytes per second
#       Amounts of data can be specified in:
#       kb or k: Kilobytes
#       mb or m: Megabytes
#       mbit: Megabits
#       kbit: Kilobits
#  To get the byte figure from bits, divide the number by 8 bit
#
#  Script written by Discovery for PSA
#
# Name of the traffic control command.
TC=/sbin/tc

# The network interface we're planning on limiting bandwidth.
IF=eth0             # Interface

# Download limit (in mega bits)
DNLD=28kbps         # DOWNLOAD Limit

# Upload limit (in mega bits)
UPLD=28kbps          # UPLOAD Limit

# IP address of the machine we are controlling
# IP=192.168.241.100     # Host IP

# Filter options for limiting the intended interface.
# U32="$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32"

opts="show"

start() {

ebegin "Starting bandwidth shaping"

# We'll use Hierarchical Token Bucket (HTB) to shape bandwidth.
# For detailed configuration options, please consult Linux man
# page.

$TC qdisc add dev eth0 root handle 1: htb default 10
$TC class add dev eth0 parent 1: classid 1:1 htb rate $DNLD burst 15k
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate $DNLD ceil $DNLD burst 15k
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate $UPLD

$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

$TC filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
$TC filter add dev eth0 protocol ip parent 1:0 prio 1 handle 20 fw flowid 1:20

# iptables -t mangle -A PREROUTING -p tcp --dport 1024:65535 -j MARK --set-mark 0x14
iptables -t mangle -A OUTPUT -p tcp --sport 1024:65535 -j MARK --set-mark 0x14


# The first line creates the root qdisc, and the next two lines
# create three child qdisc that are to be used to shape download
# and upload bandwidth.

eend $?
}

stop() {

ebegin "Stopping bandwidth shaping"

# Stop the bandwidth shaping.
    $TC qdisc del dev $IF root
iptables -t mangle -F

eend $?
}

show() {

# Display status of traffic control status.
    $TC -s qdisc ls dev $IF

}
fedyan
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.