Курсовая работа: Реализация сети в операционной системе Linux
skb = tcp_alloc_pskb память
calls csum_and_copy_from_user() делаем checksum & копируем
calls tcp_send_skb()
tcp_send_skb() - net/ipv4/tcp_output.c (160)
это главная routine посылки буфера
мы ставим буфер в очередь и решаем оставить его там или послать
calls __skb_queue_tail() добавляем в очередь
calls tcp_transmit_skb() еслиможет
tcp_transmit_skb() - net/ipv4/tcp_output.c (77)
строимзаголовок tcp ичексумму
calls tcp_build_and_update_options()
проверяем ACKs,SYN
calls tp->af_specific[ip]->queue_xmit()
udp_getfrag() - net/ipv4/udp.c
копируем из адресного пространства пользователя и добавляем checksum
udp_sendmsg() - net/ipv4/udp.c
проверяем флаги и тд
заполняем заголовок
проверяем мультикаст
заполняем маршутную информацию
calls ip_build_xmit()
обновляем статистику udp
returns err
Получение данных
Получение данных начинается с прерывания от сетевой карты. Драйвер девайса выделяет память и пересылает данные в то пространство. Потом передает пакет в связующий уровень который вызывает bottom-halv,которое обрабатывает событие вне прерывания пересылая данные на уровень выше -ip.Тот проверяет ошибки фрагменты, маршрутизирует пакет или отсылает на уровень выше(tcp || udp) Этот уровень снова проверяет ошибки определяет сокет которому предназначен пакет и ложит его в очередь сокета. Тот в свою очередь будит пользовательский процесс и копирует данные в его буфер.
Чтение из сокета(1)
Пытаемся что-то прочитать(и засыпаем)
Заполняем заголовок сообщения указателем на буфер(сокет)
проверяем простые ошибки