LINUX.ORG.RU

Сообщения sn1ln

 

роутер со сменой TTL

В связи с резаньем пакетов с неверными TTL у провайдеров хочу найти в продаже какой-нибудь wifi роутер где можно менять TTL пакетов. Ну и если там будет 4G и возможность смены IMEA то вообще отлично. Желательно с заводской прошивкой.

 

sn1ln
()

/dev/tun в Oracle linux

А что за проблемма возникат при открытии /dev/tun, о которой тут пишут?

Обновления Oracle Linux теперь бесплатны
> или чтобы при открытии /dev/tun оно не падало? :-)

Видел еще на opennet.ru тоже ругались. У кого воспроизводится можно dmesg и uname -r и тест кейс сюда запостить?



sn1ln
()

вопрос по git (мержить ветки)

Что-то никак не пойму как правильно мержить ветки в git. Есть предположим ветка A основанная на 2.6.18 с кучей патчей сверху и теперь предположим что есть ветка B основанная на 2.6.39. Нужно перетащить все коммиты из ветки A в ветку B.

git checkout B

git merge A

<fix merges>

И тут получается 1 merge commit.

А мне нужно что-бы это были единичные коммиты со всей историей. git cherry-pick тут не особо кактит ибо долго очень фиксить режекты. Как бы это правильно сделать?

sn1ln
()

tcp соединение

Вот такой практическо-теоретический вопрос.

Есть tcp соединение с окном 31127.
Пишу в сокет:
send(1440 байт)
send(1140 байт)
send(1440 байт)
send(1140 байт)
и так далее

wireshark показывает, что приходит 2 пакета. потом ack.

Вопрос, как делать так что-бы ack приходил реже? Почему окно не выбирается полностью?

Интересное дело что netcat дает точно такие-же результаты:
dd if=/dev/urandom of=./test.jpg bs=1M count=1000
nc 192.168.1.164 1234 < test.jpg
на сервере соответственно nc -l 1234

Так вот, получаю 2 пакета, ack, 2 пакета, асk.
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4194304

Почему оно так происходит?

sn1ln
()

git комиты в другую ветку

Интересует вот какой вопрос. Есть предположим Х коммитов для версии скажем 2.6.12 надо перетащить их на версию 2.6.30. Как это делать в git при условии что таких коммитов много (ну то есть cherry-pick не подходит)? Понятно что что-то не наложится и придется пилить, но надо максимально автоматизировать и упростить этот процесс.

sn1ln
()

сокеты теория

Одинаковая latency будет при пересылке через tcp сокет 90 байт и 900 или 1400 с учетом того что mtu стандартный 1500? То есть даже не задержка, а разница в скорости пересылки большого буфера и маленького, с учетом того что они оба помещаются в один пакет. Мне кажется разница должна быть не большая, но на деле получается в 20 раз.

sn1ln
()

x86/64 чтиво

Есть ли какая-нибудь фундаментальная книга по архитектуре x86/64? Интересует boot code, загрузчик, загрузка ядра линуск, переключения режимов, обработчики памяти, тлб, кеш и т.д. Так же интересна тема хардварной виртуализации и ассемблер в примерах для этой архитектуры.

sn1ln
()

tcp соединение через cgi скрипт

А есть у кого опыт установки tcp соединения через cgi скрипт по середине?

Типа схема

clent-> web/cgi-->sever

Куда копать? что смотреть?

sn1ln
()

C строчка с нулями

Есть ли какой-то стандартный способ преобразоавать строчку с '\0' в строчку без них, так что-бы потом можно было востановить оригинал?


Передаю буфер POST запросом:
char *c = «some\0\0\0\0thing\0\0»
Нужно его полностью передать. Использую curl:

curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, «data»,
CURLFORM_COPYCONTENTS, ptr,
CURLFORM_END)

Так вот в данном случае ptr ищет \0 в строчке и шлет запрос. Дело в том, что это не совсем строчка а набор бинарных данных. По этому \0 может там быть где угодно. Думаю как бы его передать....

sn1ln
()

[p2p/tcp/симметричный nat] установить соединение

Всем привет, есть задача установить между 2-я пирами за симметричным натом соединение по tcp с использованием 3-го хоста с прямым IP. Нашел очень много теории, но работающих примеров не нашел. У кого есть опыт с этим, напишите в какую сторону смотреть. Желательно пример/либу на C.

sn1ln
()

как ловить general protection?

Крутитися приложение, после этак часов 8 оно падает в dmesg вижу:

app[29461] general protection ip:4061a0 sp:7fff860eea40 error:0 in app[400000+7d000]

Core нету, не смотря на ulimit -c unlimited.

Valgrind ом его долгое время гонял, тоже без результно.

Не понятно почему нет core. Судя по той строчке, что он написал падает в функции которая из моего кода явно не дергается.

Есть какой-то шанс собрать core? А по из этой строчки не понятно, что происходит.

0000000000406190 <x_gc_free>:
406190: 53 push %rbx
406191: 48 8b 07 mov (%rdi),%rax
406194: 48 c7 07 00 00 00 00 movq $0x0,(%rdi)
40619b: 48 85 c0 test %rax,%rax
40619e: 74 13 je 4061b3 <x_gc_free+0x23>
4061a0: 48 8b 18 mov (%rax),%rbx
4061a3: 48 89 c7 mov %rax,%rdi
4061a6: e8 fd f0 ff ff callq 4052a8 <free@plt>
4061ab: 48 85 db test %rbx,%rbx
4061ae: 48 89 d8 mov %rbx,%rax
4061b1: 75 ed jne 4061a0 <x_gc_free+0x10>
4061b3: 5b pop %rbx
4061b4: c3 retq
4061b5: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
4061ba: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)


void
x_gc_free (struct gc_arena *a)
{
struct gc_entry *e;
/*mutex_lock_static (L_GC_MALLOC);*/
e = a->list;
a->list = NULL;
/*mutex_unlock_static (L_GC_MALLOC);*/

while (e != NULL)
{
struct gc_entry *next = e->next;
free (e);
e = next;
}
}

sn1ln
()

быстрый xor на amd x86_64

Здравстуйте, есть задача сделать быстрый xor для большого буфера. Имеется процессор Quad-Core AMD Opteron(tm) Processor 2346 HE,
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow constant_tsc rep_good tsc_reliable nonstop_tsc pni cx16 popcnt hypervisor lahf_lm extapic abm sse4a misalignsse 3dnowprefetch

Делаю 3 варианта для теста, те что пришли в голову:
Вариант 1, самай простой через xorb:
for (i = 0; i < len; i++)
buf[i] ^= (char)key;

asm:
400780: 80 34 18 0c xorb $0xc,(%rax,%rbx,1)

Вариант 2, xor на 64 битных регистрах + хвост по байтам (xor инструкция):

__uint64_t *lbuf = (__uint64_t *)buf;
int llen = len % sizeof(__uint64_t);
for (i = 0; i < llen; i++)
lbuf[i] ^= lkey;

for (i = (llen * sizeof(__uint64_t)); i < (len - llen) ; i++)
buf[i] ^= (char)key;
asm:
4007f5: 48 8d 53 08 lea 0x8(%rbx),%rdx
4007f9: 31 c0 xor %eax,%eax
4007fb: 48 b9 0c 0c 0c 0c 0c mov $0xc0c0c0c0c0c0c0c,%rcx
400802: 0c 0c 0c
400805: 48 31 0b xor %rcx,(%rbx)
400808: 48 83 c0 01 add $0x1,%rax
40080c: 48 31 0a xor %rcx,(%rdx)
40080f: 48 3d 00 65 cd 1d cmp $0x1dcd6500,%rax
400815: 75 ee jne 400805 <test+0xa5>
400817: 31 f6 xor %esi,%esi
400819: 4c 89 e7 mov %r12,%rdi


Вариант 3, xor через 128 битныйу тип, SSE2 pxor инструкция + хвост по байтам:
__m128i *lbuf = (__m128i *)buf;
int llen = len % sizeof(__m128i);
for (i = 0; i < llen; i++)
lbuf[i] = __builtin_ia32_pxor128(lbuf[i], lkey);

for (i = (llen * sizeof( __m128i)); i < (len - llen) ; i++)
buf[i] ^= (char)key

asm:

400889: 66 0f 6f 0c 24 movdqa (%rsp),%xmm1
40088e: 31 d2 xor %edx,%edx
400890: 31 c0 xor %eax,%eax
400892: 66 0f 6f 04 18 movdqa (%rax,%rbx,1),%xmm0
400897: 66 0f ef c1 pxor %xmm1,%xmm0
40089b: 66 0f 7f 04 18 movdqa %xmm0,(%rax,%rbx,1)
4008a0: 48 83 c0 10 add $0x10,%rax
4008a4: 48 3d a0 00 00 00 cmp $0xa0,%rax
4008aa: 75 e6 jne 400892 <test+0x132>
4008ac: 48 83 c2 01 add $0x1,%rdx
4008b0: 48 81 fa 00 65 cd 1d cmp $0x1dcd6500,%rdx
4008b7: 75 d7 jne 400890 <test+0x130>
4008b9: 31 f6 xor %esi,%esi
4008bb: 4c 89 e7 mov %r12,%rdi


Теперь, самое интересное это циферки. Компилирую с -O2 и запускаю:

./a.out
test for i = 1000
duration 1 = 6665.891000
duration 2 = 2087.085000
duration 3 = 10276.917000
test for i = 100000
duration 1 = 6586.843000
duration 2 = 2090.889000
duration 3 = 10469.038000
test for i = 10000000
duration 1 = 6780.421000
duration 2 = 2082.808000
duration 3 = 10459.455000

i - размер буфера, duration - время для разных вариантов.

Теперь вопрос, это нормально что SSE2 инструкция работает медленнее, чем обычный xor на регистрах? Можно ли сделать xor быстрее?


Исходник теста положил сюда: http://codepaste.net/j1us7c





sn1ln
()

C / html->pain text

Привет всем,

Если ли ну нас какая-нибудь библиотека или функция на С, которая может преобразовать буфер с юникодным html в обычный текст? Ну то есть из этого: buf=«%D0%9E%D1%82%D0%B2%D0%B5%D1%82%3A%20Hello» Cделать: buf_unencoded=«Привет: Hello»

Что-то мне подсказывает что это класический случай и такого должно быть валом.

sn1ln
()

RSS подписка на новые темы