• Sábado 14 de Diciembre de 2024, 22:42

Autor Tema:  Sockets Raw O Tunneling  (Leído 1256 veces)

MadameSheema

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Sockets Raw O Tunneling
« en: Jueves 31 de Enero de 2008, 14:18 »
0
Hola!!
Estoy realizando un proyecto que trata de implementar un protocolo más a la capa de transporte de una pila TCP/IP especial para microprocesadores.
El protocolo es SCTP y la pila es uIP.

Ya tengo el protocolo implementado y quiero realizar pruebas de envio de paquetes con mi mandriva 2008.
Tengo el servidor y el cliente en la misma máquina y por más que lo intento me envia el primer paquete pero parece ser q no lo recibe o lo recibe mal y no lo sabe interpretar.

El código del socket por llamarlo de alguna manera ya que creo que se trata de tunneling, aunq la verdad no estoy muy segura pq es la primera vez que veo algo así, es el siguiente:

Código: Text
  1.  
  2. /*
  3.  * Copyright (c) 2001, Swedish Institute of Computer Science.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  *
  17.  * 3. Neither the name of the Institute nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * Author: Adam Dunkels <adam@sics.se>
  34.  *
  35.  * $Id: tapdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $
  36.  */
  37.  
  38. #define UIP_DRIPADDR0   192
  39. #define UIP_DRIPADDR1   168
  40. #define UIP_DRIPADDR2   0
  41. #define UIP_DRIPADDR3   1
  42.  
  43. #include <fcntl.h>
  44. #include <stdlib.h>
  45. #include <stdio.h>
  46. #include <unistd.h>
  47. #include <string.h>
  48. #include <sys/ioctl.h>
  49. #include <sys/socket.h>
  50. #include <sys/types.h>
  51. #include <sys/time.h>
  52. #include <sys/uio.h>
  53. #include <sys/socket.h>
  54.  
  55. #ifdef linux
  56. #include <sys/ioctl.h>
  57. #include <linux/if.h>
  58. #include <linux/if_tun.h>
  59. #define DEVTAP "/dev/net/tun"
  60. #else  /* linux */
  61. #define DEVTAP "/dev/tap0"
  62. #endif /* linux */
  63.  
  64. #include "uip.h"
  65.  
  66. static int drop = 0;
  67. static int fd;
  68.  
  69.  
  70. /*---------------------------------------------------------------------------*/
  71. void
  72. tapdev_init(void)
  73. {
  74.   char buf[1024];
  75.  
  76.   fd = open(DEVTAP, O_RDWR);
  77.   if(fd == -1) {
  78.     perror("tapdev: tapdev_init: open");
  79.     exit(1);
  80.   }
  81.  
  82. #ifdef linux
  83.   {
  84.     struct ifreq ifr;
  85.     memset(&ifr, 0, sizeof(ifr));
  86.     ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
  87.     if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {
  88.       perror(buf);
  89.       exit(1);
  90.     }
  91.   }
  92. #endif /* Linux */
  93.  
  94.   snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d",
  95.       UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3);
  96.   system(buf);
  97.  
  98. }
  99. /*---------------------------------------------------------------------------*/
  100. unsigned int
  101. tapdev_read(void)
  102. {
  103.   fd_set fdset;
  104.   struct timeval tv, now;
  105.   int ret;
  106.  
  107.   tv.tv_sec = 0;
  108.   tv.tv_usec = 1000;
  109.  
  110.  
  111.   FD_ZERO(&fdset);
  112.   FD_SET(fd, &fdset);
  113.  
  114.   ret = select(fd + 1, &fdset, NULL, NULL, &tv);
  115.   if(ret == 0) {
  116.     return 0;
  117.   }
  118.   ret = read(fd, uip_buf, UIP_BUFSIZE);
  119.   if(ret == -1) {
  120.     perror("tap_dev: tapdev_read: read");
  121.   }
  122.  
  123.   /*  printf("--- tap_dev: tapdev_read: read %d bytes\n", ret);*/
  124.   /*  {
  125.     int i;
  126.     for(i = 0; i < 20; i++) {
  127.       printf("%x ", uip_buf[i]);
  128.     }
  129.     printf("\n");
  130.     }*/
  131.   /*  check_checksum(uip_buf, ret);*/
  132.   return ret;
  133. }
  134. /*---------------------------------------------------------------------------*/
  135. void
  136. tapdev_send(void)
  137. {
  138.   int ret;
  139.   /*  printf("tapdev_send: sending %d bytes\n", size);*/
  140.   /*  check_checksum(uip_buf, size);*/
  141.  
  142.   /*  drop++;
  143.   if(drop % 8 == 7) {
  144.     printf("Dropped a packet!\n");
  145.     return;
  146.     }*/
  147.   ret = write(fd, uip_buf, uip_len);
  148.   if(ret == -1) {
  149.     perror("tap_dev: tapdev_send: writev");
  150.     exit(1);
  151.   }
  152. }
  153. /*---------------------------------------------------------------------------*/
  154.  
  155.  

También lo he intentado mediante Sockets Raw pero no hay manera...

Si alguien me pudiese aconsejar sobre como enviar paquetes solo a nivel IP o a nivel de enlace de datos le estaria muy agradecida ya q me estoy volviendo loca y no encuentro la solución.

GRACIAS!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Sockets Raw O Tunneling
« Respuesta #1 en: Jueves 31 de Enero de 2008, 14:28 »
0
Primero de todo depura el programa y obtene informacion mas exacta sobre lo que sucede.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

MadameSheema

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Sockets Raw O Tunneling
« Respuesta #2 en: Jueves 31 de Enero de 2008, 22:14 »
0
Hola Eternal Idol,

El descriptor que abre el canal de comunicación no me da ningún error, en el tapdev_send extraí un fichero con el paquete que enviaba y era correcto, en el tapdev_read hice lo mismo y el paquete que recibia era completamente diferente.

Tengo el cliente y el servidor en el mismo ordenador, cn la misma dirección IP y en el mismo ejecutable ya que creo que es la situación más simple.

Si quieres que te explique algo en concreto dimelo pq soy consciente de que me expreso muy mal, además de que soy nueva en el tema este de los foros.

Muchas Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Sockets Raw O Tunneling
« Respuesta #3 en: Jueves 31 de Enero de 2008, 23:49 »
0
No lo depuraste; te ayudaria pero NO trabajo bajo *NIX.

Mirate esto si queres: TUN/TAP.


Segun esto http://en.wikipedia.org/wiki/SCTP ese protocolo esta soportado en GNU/Linux asi que no tendrias que añadir nada sino simplemente usar socket con IPPROTO_SCTP en lugar de IPPROTO_TCP...

Si queres usar raw sockets en lugar de SOCK_STREAM o SOCK_DGRAM usas SOCK_RAW y si queres incluso usar tu propia cabecera IP tenes que usar setsockopt y IP_HDRINCL.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

MadameSheema

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Sockets Raw O Tunneling
« Respuesta #4 en: Viernes 1 de Febrero de 2008, 00:13 »
0
El problema está en que yo he hecho mi propia implementación del protocolo SCTP y por eso no puedo utilizar los sockets para este protocolo ya que he creado mis propias estructuras y mis propias funciones.

Respecto a TUN/TAP el código que escribí en el primer mensaje es para enviar y recibir datos por el TAP, miraré detenidamente la documentación que me has pasado a ver si aclaro mis dudas.

No sabia que en el socket RAW podia usar mi propia cabecera IP.

¿A que te refieres con depurar el código? Esque estudio telecomunicaciones y solo tengo las bases básicas de programación.

Muchas gracias por tu ayuda

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Sockets Raw O Tunneling
« Respuesta #5 en: Viernes 1 de Febrero de 2008, 01:01 »
0
Cita de: "MadameSheema"
El problema está en que yo he hecho mi propia implementación del protocolo SCTP y por eso no puedo utilizar los sockets para este protocolo ya que he creado mis propias estructuras y mis propias funciones.

¿Y entonces para que necesitas el TUN/TAP? ¿Para que lo hiciste? Ya esta implementado nativamente.

Cita de: "MadameSheema"
Respecto a TUN/TAP el código que escribí en el primer mensaje es para enviar y recibir datos por el TAP, miraré detenidamente la documentación que me has pasado a ver si aclaro mis dudas.

Si, no se cual es la razon para usar ese dispositivo ...

Cita de: "MadameSheema"
No sabia que en el socket RAW podia usar mi propia cabecera IP.

Si usas IP_HDRINCL podes.

Cita de: "MadameSheema"
¿A que te refieres con depurar el código? Esque estudio telecomunicaciones y solo tengo las bases básicas de programación.

http://es.wikipedia.org/wiki/Depurar

No se como podes haber implementado el SCTP entonces ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.