Тема касается ядра linux =) Мне нужно получить MAC адрес шлюза через который будут переправляться ethernet пакеты. Если не ошибаюсь, то он должен быть записан в структуре hh_cache в поле hh_data Указатель на эту структуру , находится в структуре neighbour . А чтоб получить указатель на структуру neighbour нужно проделать некоторые манипуляции с полем hash_buckets структуры neigh_table struct neigh_table { .... .... struct neighbour **hash_buckets; .... .... }; В книге, дано краткое описание функции neigh_lookup "Эта функция необходима для поиска в кэше ARP определённых элементов. Если в хэш-таблице найден соседний компьютер, который мы ищем, тогда возвращается указатель на структуру neighbour, а счётчик ссылок на элемент ARP увеличивается на один " struct neighbour *neigh_lookup( struct neigh_table *tbl, const void *pkey, struct net_device *net ); pkey - это ip адресс шлюза? или что ? Вобщем вопрос таков: Как узнать MAC - адрес шлюза (который уже был получен через ARP запрос)
Через GetAdaptersInfo получить IP_ADAPTER_INFO.GatewayList.IpAddress.String, и сделать SendARP запрос по этому ip
Flasher Мне нужно получить, уже сохранённый MAC адрес из ядра. А не получать его у переправляющей станции. Представим так, send_arp уже сделан. Ядро записало нужный MAC в структуру neighbour . А мне нужно получить это сохранённое значение.. ) как это сделать????
Эээ... IP address of the gateway есть в user mode: route -n MAC address: arp -an Единственное "но" - MAC address cache-ируется сиситемой но нигде не сохраняется..
s0larian ЭЭмм..причём тут route -n и arp -an ????? Тут тоже не понятно...) мас сохраняется на какойто промежуток времени .... в структуре hh_cache в поле hh_data , разве нет? Моя задача, получить эти значения в ядре. Тоесть, я понимаю процесс так. Комп формирует и отсылает arp пакет, для определения mac адреса шлюза, затем чтоб постоянно не отсылать arp пакеты для определения mac, сохраняет их в структуре hh_cache чтоб потом правильно заполнять ethernet заголовок. Моя задача получить эти данные из структуры hh_cache ....а как это сделать? что-то не особо выходит. Подробности процесса в посте #1 Как вытянуть уже полученнй MAC адрес шлюза из структуры hh_cache =)
featurelles, во первых, нах это делать в ядре? Как делать в user-mode можешь посмотреть в этих двух прогах. Всё сведётся к нескольким system calls. То же самое сделать можно и из kernel mode - те же вызовы. Cache для того что бы не делать ARP resolution при отправке каждого пакета. Cache-ируется L2 адрес на какое-то время, после чего вытерается (dynamic ARP entry). P.S. то есть, ничего напрямую из hash_buckets вытягивать не надо. Тебе надо сделать две вещи: 1) найти gateway IP address в routing table 2) получить L2 address (система сделает ARP lookup или отдаст cached value)
Всё-же выходит так, что вариант с routing table мне не подходит (именно для это задачи). struct iphdr *iphdr; // ip заголовок struct net_device *dev; // усройство struct neighbour *neighbour; // компьютер,к которому можно получить доступ через канальный уровень struct neigh_table *tbl; // таблица arp neighbour = neigh_lookup( tbl, &iphdr->saddr , dev ); Функция neigh_lookup должна возвратить указатель на struct neighbour , но в моём случаи возвращается NULL.... вот ссылка на текст с описанием функции и её внутреннего устройства http://books.google.ru/books?id=w3E...t void *pkey, struct net_device *dev)&f=false Почему возвращается NULL ??? и как это поправить???