<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415880&amp;view=findpost&amp;p=3811426</guid>
        <pubDate>Sun, 29 Sep 2019 09:28:48 +0000</pubDate>
        <title>Raw sockets - передача пакета между интерфейсами (мост)</title>
        <link>https://forum.sources.ru/index.php?showtopic=415880&amp;view=findpost&amp;p=3811426</link>
        <description><![CDATA[Gonarh: Запусти tcpdump на обоих интерфейсах, и посмотри там.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415880&amp;view=findpost&amp;p=3811374</guid>
        <pubDate>Fri, 27 Sep 2019 02:34:38 +0000</pubDate>
        <title>Raw sockets - передача пакета между интерфейсами (мост)</title>
        <link>https://forum.sources.ru/index.php?showtopic=415880&amp;view=findpost&amp;p=3811374</link>
        <description><![CDATA[mrborman: Доброго дня, други. Проблемка. Делаю мост L2 с помощью raw sockets.. Пакеты вижу с обоих интерфейсов (фильтрую по индексу интерфейса), вроде передаю в другой интерфейс (установив индекс) - ошибок не возникает, а связи через мост нет.. что делаю не так? Код ниже.. Может кто носом ткнуть?<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;char *opt_1 = &quot;eth0&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *opt_2 = &quot;eth1&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int sock;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int doexit = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sock = socket( AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (sock &#60; 0) </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Can&#39;t open socket\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 4;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct sockaddr_ll sll; </div><div class="code_line">&nbsp;&nbsp; &nbsp;int sll_size = sizeof( sll );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned char buf[ 1024 ];</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int &nbsp;buf_size = 1024;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct ether_header *eh = (struct ether_header *) buf;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct ifreq if_idx1, if_idx2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct ifreq if_flg1, if_flg2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int flg1, flg2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//-- Получаем индексы интерфейсов </div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(&amp;if_idx1, 0, sizeof(struct ifreq));</div><div class="code_line">&nbsp;&nbsp; &nbsp;strncpy(if_idx1.ifr_name, opt_1, IFNAMSIZ-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCGIFINDEX, &amp;if_idx1) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCGIFINDEX 1&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(&amp;if_idx2, 0, sizeof(struct ifreq));</div><div class="code_line">&nbsp;&nbsp; &nbsp;strncpy(if_idx2.ifr_name, opt_2, IFNAMSIZ-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCGIFINDEX, &amp;if_idx2) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCGIFINDEX 2&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//-- ставим &nbsp;promiscuous mode &nbsp;на оба интерфейса</div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(&amp;if_flg1, 0, sizeof(struct ifreq));</div><div class="code_line">&nbsp;&nbsp; &nbsp;strncpy(if_flg1.ifr_name, opt_1, IFNAMSIZ-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCGIFFLAGS, &amp;if_flg1) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCGIFFLAGS 1&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;flg1 = if_flg1.ifr_flags;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if_flg1.ifr_flags |= IFF_PROMISC;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCSIFFLAGS, &amp;if_flg1) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCSIFFLAGS 1&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(&amp;if_flg2, 0, sizeof(struct ifreq));</div><div class="code_line">&nbsp;&nbsp; &nbsp;strncpy(if_flg2.ifr_name, opt_2, IFNAMSIZ-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCGIFFLAGS, &amp;if_flg2) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCGIFFLAGS 2&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;flg2 = if_flg2.ifr_flags;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if_flg2.ifr_flags |= IFF_PROMISC;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCSIFFLAGS, &amp;if_flg2) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCSIFFLAGS 2&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;ready\n&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned long readed;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while( !doexit )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//-- читаем что-нибудь от кого-нибудь</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;readed = recvfrom( sock, buf, buf_size, 0, (struct sockaddr *)&amp;sll, &amp;sll_size );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//-- отфильтровываем пакеты с управляющего нтерфейса..</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( sll.sll_ifindex != if_idx1.ifr_ifindex &nbsp;&amp;&amp; &nbsp;sll.sll_ifindex != if_idx2.ifr_ifindex )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( readed &#62; 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//-- если пришло с одного интерфейса, шлём на другой (ставим нужный индекс интерфейса)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( sll.sll_ifindex == if_idx1.ifr_ifindex )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sll.sll_ifindex = if_idx2.ifr_ifindex;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sll.sll_ifindex = if_idx1.ifr_ifindex;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sll.sll_halen = ETH_ALEN;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//-- копируем адрес &quot;кому&quot; из исходного пакета</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( i=0; i&#60;6; i++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sll.sll_addr[ i ] = eh-&#62;ether_dhost[ i ] &amp; 0xFF;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( sendto( sock, buf, readed, 0, (struct sockaddr *)&amp;sll, sizeof(struct sockaddr_ll) ) &#60; 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Can&#39;t send to interface %d\n&quot; , sll.sll_ifindex );</div><div class="code_line">&nbsp;</div><div class="code_line">//---- Ошибок не выдаёт, но и связи нет .....</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//-- по завершении - восстанавливаем флаги</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if_flg1.ifr_flags = flg1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCSIFFLAGS, &amp;if_flg1) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCSIFFLAGS 1x&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if_flg2.ifr_flags = flg2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( ioctl( sock, SIOCSIFFLAGS, &amp;if_flg2) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;SIOCSIFFLAGS 2x&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;close( sock );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;bye.\n&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>mrborman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	