LINUX.ORG.RU

SIOCGPPPSTATS - как получить по ioctl 64 бита?


0

0

Т.е. логика в том, что ifconfig в 64-битной системе как-то получает более чем 32-х битное значение полей "переданно байтов" и "получено байтов"

В pppd эта инфа берётся по ioctl(sock_fd, SIOCGPPPSTATS, &req)

Вопрос - как получить 64-х битные значения?

Вопрос в том, что драйвер пишет в переданное значение. Отсюда можно узнать как его получить. Собственно, то, что вы передаёте это значение типа int, котороё, в свою очередь, на стороне драйвера может быть приведено к значению адреса, а уж в этот адрес можно писать что угодно. Если вы точно знаете, что этот ioctl вызов должен возвращать 64-битное значение, ну передайте вы туда указатель, под который выделены эти самые 64 бита...

anonymous
()

ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.77.1 P-t-P:192.168.77.12 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1
RX packets:3475170 errors:0 dropped:0 overruns:0 frame:0
TX packets:6325421 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:164988075 (157.3 MiB) TX bytes:8552499757 (7.9 GiB)
----------
вот как получить эти значения?

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

Конкретно по поводу ifconfig и как с ним работать - ничего сказать не могу. Но принцип работы с ioctl таков:
1. Узнаёте, что ожидает от вас драйвер по этому вызову (из документации / исходников).
2. Передаёте ему это :)

Собственно, чаще всего, делается нечто вроде

some_type var;
int err;

....
fd = open(...)... // open device

memset(&var,0,sizeof(some_type));
err = ioctl(fd, IOCTL_CMD, &var);

...
ну и т.д.

А вы уверены, что то, что вам нужно именно через ioctl познаётся? Может это где-нибудь в /proc/net валяется или ещё где... ?

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

Насчёт 64-х битов - не уверен, в 32-х битные значения получаются именно так, я копал исходник pppd

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

/proc/net# cat dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth1:14651625487 10740605 0 0 0 0 0 0 363593168 5902058 0 0 0 0 0 0
eth0:9033394220 11491944 0 0 0 0 0 46748 15276774230 13471836 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ppp0:164988613 3475174 0 0 0 0 0 0 8552499837 6325423 0 0 0 0 0 0
inserv:/proc/net# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.77.1 P-t-P:192.168.77.12 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1
RX packets:3475186 errors:0 dropped:0 overruns:0 frame:0
TX packets:6325423 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:164989921 (157.3 MiB) TX bytes:8552499837 (7.9 GiB)

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

Если вам конкретно нужно из ioctl 64 бита получить, то попробуйте нечто вроде:

char var[8];

...

ioctl(fd, SOME_CMD, var);

в var и будут ваши 64 бита, разоженных по байтам в массиве var :)

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

Не проканает, там параметр - структура, с unsigned int
А по сути - мне не надо именно ioctl, хватит того что найдено :)

В 32-битных системах кстати и счётчики в /proc/net тоже 32-битные

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

>Не проканает, там параметр - структура, с unsigned int

Если смотреть исходники ядра (раз уж начали смотреть исходники), то ioctl SIOCGPPPSTATS обрабатывается в drivers/net/ppp_generic.c и возвращает struct ppp_stats в которой информация передается полями __u32. И раз уж вы решили писать 64-bit-only патч, то действительно проще читать /proc/net/dev

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