ARP & MAC

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 27 сен 2009.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Тема касается ядра 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 запрос)
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Через GetAdaptersInfo получить IP_ADAPTER_INFO.GatewayList.IpAddress.String, и сделать SendARP запрос по этому ip :)
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Flasher
    Мне нужно получить, уже сохранённый MAC адрес из ядра. А не получать его у переправляющей станции.
    Представим так, send_arp уже сделан. Ядро записало нужный MAC в структуру neighbour .
    А мне нужно получить это сохранённое значение.. ) как это сделать????
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    У..., я даже не заметил что для Linux'a нужно :)
    Других способов не знаю, я ядром блиско не дружу.
     
  5. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Народ, кто знает.
    HELP
     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    тема не умирай....
     
  7. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Эээ... IP address of the gateway есть в user mode:
    route -n

    MAC address:
    arp -an

    Единственное "но" - MAC address cache-ируется сиситемой но нигде не сохраняется..
     
  8. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    s0larian
    ЭЭмм..причём тут
    route -n и
    arp -an
    ?????

    Тут тоже не понятно...) мас сохраняется на какойто промежуток времени .... в структуре hh_cache в поле hh_data , разве нет?
    Моя задача, получить эти значения в ядре.
    Тоесть, я понимаю процесс так. Комп формирует и отсылает arp пакет, для определения mac адреса шлюза, затем чтоб постоянно не отсылать arp пакеты для определения mac, сохраняет их в структуре hh_cache чтоб потом правильно заполнять ethernet заголовок.
    Моя задача получить эти данные из структуры hh_cache ....а как это сделать? что-то не особо выходит.
    Подробности процесса в посте #1

    Как вытянуть уже полученнй MAC адрес шлюза из структуры hh_cache =)
     
  9. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    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)
     
  10. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Всё-же выходит так, что вариант с 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 ???
    и как это поправить???