Diff for /embedaddon/libnet/sample/dhcp_discover.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2012/02/21 22:14:23 version 1.1.1.2, 2013/07/22 11:54:41
Line 64  main(int argc, char *argv[]) Line 64  main(int argc, char *argv[])
           
     char errbuf[LIBNET_ERRBUF_SIZE];      char errbuf[LIBNET_ERRBUF_SIZE];
           
    u_char options_req[] = { LIBNET_DHCP_SUBNETMASK , LIBNET_DHCP_BROADCASTADDR , LIBNET_DHCP_TIMEOFFSET , LIBNET_DHCP_ROUTER , LIBNET_DHCP_DOMAINNAME , LIBNET_DHCP_DNS , LIBNET_DHCP_HOSTNAME };    u_char options_req[] = { LIBNET_DHCP_SUBNETMASK,
                              LIBNET_DHCP_BROADCASTADDR, LIBNET_DHCP_TIMEOFFSET,
                              LIBNET_DHCP_ROUTER, LIBNET_DHCP_DOMAINNAME,
                              LIBNET_DHCP_DNS, LIBNET_DHCP_HOSTNAME };
     u_char *options;      u_char *options;
     u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};      u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
     u_char *tmp;      u_char *tmp;
           
     // have to specify interface  
     if (argc != 2)      if (argc != 2)
       {
         usage(argv[0]);          usage(argv[0]);
       }
     intf = argv[1];      intf = argv[1];
           
    l = libnet_init(    l = libnet_init(LIBNET_LINK, intf, errbuf);
            LIBNET_LINK,                            // injection type 
            intf,                                   // network interface 
            errbuf);                                // errbuf 
     if (!l)      if (!l)
     {      {
         fprintf(stderr, "libnet_init: %s", errbuf);          fprintf(stderr, "libnet_init: %s", errbuf);
         exit(EXIT_FAILURE);          exit(EXIT_FAILURE);
     }      }
    else {    else
     {
         src_ip = libnet_get_ipaddr4(l);;          src_ip = libnet_get_ipaddr4(l);;
                   
         if ((ethaddr = libnet_get_hwaddr(l)) == NULL)          if ((ethaddr = libnet_get_hwaddr(l)) == NULL)
Line 92  main(int argc, char *argv[]) Line 94  main(int argc, char *argv[])
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
                   
        printf("ip addr     : %s\n", libnet_addr2name4(src_ip, LIBNET_DONT_RESOLVE));        printf("ip addr     : %s\n", libnet_addr2name4(src_ip,
                 LIBNET_DONT_RESOLVE));
         printf("eth addr    : ");          printf("eth addr    : ");
        for (i = 0; i < 6; i++) {        for (i = 0; i < 6; i++)
         {
             printf("%2.2x", ethaddr->ether_addr_octet[i]);              printf("%2.2x", ethaddr->ether_addr_octet[i]);
            if (i != 5) {            if (i != 5)
             {
                 printf(":");                  printf(":");
             }              }
         }          }
         printf("\n");          printf("\n");
                   
                   
        // build options packet        /* build options packet */
         i = 0;          i = 0;
        options_len = 3;                            // update total payload size        /* update total payload size */
         options_len = 3;
                   
        // we are a discover packet        /* we are a discover packet */
         options = malloc(3);          options = malloc(3);
        options[i++] = LIBNET_DHCP_MESSAGETYPE;     // type        options[i++] = LIBNET_DHCP_MESSAGETYPE;     /* type */
        options[i++] = 1;                           // len        options[i++] = 1;                           /* len */
        options[i++] = LIBNET_DHCP_MSGDISCOVER;     // data        options[i++] = LIBNET_DHCP_MSGDISCOVER;     /* data */
                   
         orig_len = options_len;          orig_len = options_len;
        options_len += sizeof(options_req) + 2;     // update total payload size        /* update total payload size */
         options_len += sizeof(options_req) + 2;
                   
         // workaround for realloc on old machines  
         // options = realloc(options, options_len); // resize options buffer  
         tmp = malloc(options_len);          tmp = malloc(options_len);
         memcpy(tmp, options, orig_len);          memcpy(tmp, options, orig_len);
         free(options);          free(options);
         options = tmp;          options = tmp;
                   
        // we are going to request some parameters        /* we are going to request some parameters */
        options[i++] = LIBNET_DHCP_PARAMREQUEST;    // type        options[i++] = LIBNET_DHCP_PARAMREQUEST;                 /* type */
        options[i++] = sizeof(options_req);         // len        options[i++] = sizeof(options_req);                      /* len */
        memcpy(options + i, options_req, sizeof(options_req)); // data        memcpy(options + i, options_req, sizeof(options_req));   /* data */
         i += sizeof(options_req);          i += sizeof(options_req);
                   
        // if we have an ip already, let's request it.        /* if we have an ip already, let's request it. */
         if (src_ip)          if (src_ip)
         {          {
             orig_len = options_len;              orig_len = options_len;
             options_len += 2 + sizeof(src_ip);              options_len += 2 + sizeof(src_ip);
                           
             // workaround for realloc on old machines  
             // options = realloc(options, options_len);  
             tmp = malloc(options_len);              tmp = malloc(options_len);
             memcpy(tmp, options, orig_len);              memcpy(tmp, options, orig_len);
             free(options);              free(options);
             options = tmp;              options = tmp;
                           
            options[i++] = LIBNET_DHCP_DISCOVERADDR;    // type            options[i++] = LIBNET_DHCP_DISCOVERADDR;              /* type */
            options[i++] = sizeof(src_ip);                      // len            options[i++] = sizeof(src_ip);                        /* len */
            memcpy(options + i, (char *)&src_ip, sizeof(src_ip));// data            memcpy(options + i, (char *)&src_ip, sizeof(src_ip)); /* data */
             i += sizeof(src_ip);              i += sizeof(src_ip);
         }          }
                   
        // end our options packet        /* end our options packet */
        // workaround for realloc on old machines 
        // options = realloc(options, options_len); // resize options buffer 
         orig_len = options_len;          orig_len = options_len;
         options_len += 1;          options_len += 1;
         tmp = malloc(options_len);          tmp = malloc(options_len);
Line 160  main(int argc, char *argv[]) Line 161  main(int argc, char *argv[])
         options[i++] = LIBNET_DHCP_END;          options[i++] = LIBNET_DHCP_END;
   
                   
        // make sure we are at least the minimum length, if not fill        /* make sure we are at least the minimum length, if not fill */
        // this could go in libnet, but we will leave it in the app for now        /* this could go in libnet, but we will leave it in the app for now */
         if (options_len + LIBNET_DHCPV4_H < LIBNET_BOOTP_MIN_LEN)          if (options_len + LIBNET_DHCPV4_H < LIBNET_BOOTP_MIN_LEN)
         {          {
             orig_len = options_len;              orig_len = options_len;
             options_len = LIBNET_BOOTP_MIN_LEN - LIBNET_DHCPV4_H;              options_len = LIBNET_BOOTP_MIN_LEN - LIBNET_DHCPV4_H;
                           
             // workaround for realloc on old machines  
             // options = realloc(options, options_len);  
             tmp = malloc(options_len);              tmp = malloc(options_len);
             memcpy(tmp, options, orig_len);              memcpy(tmp, options, orig_len);
             free(options);              free(options);
Line 177  main(int argc, char *argv[]) Line 176  main(int argc, char *argv[])
             memset(options + i, 0, options_len - i);              memset(options + i, 0, options_len - i);
         }          }
                   
         // the goodies are here  
         dhcp = libnet_build_dhcpv4(          dhcp = libnet_build_dhcpv4(
                LIBNET_DHCP_REQUEST,                            // opcode                LIBNET_DHCP_REQUEST,            /* opcode */
                1,                                              // hardware type                1,                              /* hardware type */
                6,                                              // hardware address length                6,                              /* hardware address length */
                0,                                              // hop count                0,                              /* hop count */
                0xdeadbeef,                                     // transaction id                0xdeadbeef,                     /* transaction id */
                0,                                              // seconds since bootstrap                0,                              /* seconds since bootstrap */
                0x8000,                                         // flags                0x8000,                         /* flags */
                0,                                              // client ip                0,                              /* client ip */
                0,                                              // your ip                0,                              /* your ip */
                0,                                              // server ip                0,                              /* server ip */
                0,                                              // gateway ip                0,                              /* gateway ip */
                ethaddr->ether_addr_octet,                      // client hardware addr                ethaddr->ether_addr_octet,      /* client hardware addr */
                NULL,                                           // server host name                NULL,                           /* server host name */
                NULL,                                           // boot file                NULL,                           /* boot file */
                options,                                        // dhcp options stuck in payload since it is dynamic                options,                        /* dhcp options in payload */
                options_len,                                    // length of options                options_len,                    /* length of options */
                l,                                              // libnet handle                 l,                              /* libnet context */
                0);                                             // libnet id                 0);                             /* libnet ptag */
                   
         // wrap it  
         udp = libnet_build_udp(          udp = libnet_build_udp(
                68,                                             // source port                68,                             /* source port */
                67,                                             // destination port                67,                             /* destination port */
                LIBNET_UDP_H + LIBNET_DHCPV4_H + options_len,   // packet size                LIBNET_UDP_H + LIBNET_DHCPV4_H + options_len,  /* packet size */
                0,                                              // checksum                0,                              /* checksum */
                NULL,                                           // payload                 NULL,                           /* payload */
                0,                                              // payload size                 0,                              /* payload size */
                l,                                              // libnet handle                 l,                              /* libnet context */
                0);                                             // libnet id                 0);                             /* libnet ptag */
                   
         // hook me up with some ipv4  
         ip = libnet_build_ipv4(          ip = libnet_build_ipv4(
                 LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_DHCPV4_H                  LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_DHCPV4_H
                + options_len,                                  // length                + options_len,                  /* length */
                0x10,                                           // TOS                0x10,                           /* TOS */
                0,                                              // IP ID                0,                              /* IP ID */
                0,                                              // IP Frag                 0,                              /* IP Frag */
                16,                                             // TTL                16,                             /* TTL */
                IPPROTO_UDP,                                    // protocol                IPPROTO_UDP,                    /* protocol */
                0,                                              // checksum                0,                              /* checksum */
                src_ip,                                         // src ip                src_ip,                         /* src ip */
                inet_addr("255.255.255.255"),                   // destination ip                inet_addr("255.255.255.255"),   /* destination ip */
                NULL,                                           // payload                NULL,                           /* payload */
                0,                                              // payload size                0,                              /* payload size */
                l,                                              // libnet handle                l,                              /* libnet context */
                0);                                             // libnet id                0);                             /* libnet ptag */
                   
         // we can just autobuild since we arent doing anything tricky  
         t = libnet_autobuild_ethernet(          t = libnet_autobuild_ethernet(
                enet_dst,                                       // ethernet destination                enet_dst,                       /* ethernet destination */
                ETHERTYPE_IP,                                   // protocol type                ETHERTYPE_IP,                   /* protocol type */
                l);                                             // libnet handle                l);                             /* libnet context */
                   
         // write to the wire  
         if (libnet_write(l) == -1)          if (libnet_write(l) == -1)
         {          {
             fprintf(stderr, " %s: libnet_write: %s\n", argv[0],              fprintf(stderr, " %s: libnet_write: %s\n", argv[0],
Line 240  main(int argc, char *argv[]) Line 234  main(int argc, char *argv[])
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
                   
         // fill and print stats  
         libnet_stats(l, &ls);          libnet_stats(l, &ls);
         fprintf(stderr, "Packets sent:  %lld\n"          fprintf(stderr, "Packets sent:  %lld\n"
                     "Packet errors: %lld\n"                      "Packet errors: %lld\n"
Line 248  main(int argc, char *argv[]) Line 241  main(int argc, char *argv[])
                     ls.packets_sent, ls.packet_errors, ls.bytes_written);                      ls.packets_sent, ls.packet_errors, ls.bytes_written);
         libnet_destroy(l);          libnet_destroy(l);
                   
         // free mem  
         free(options);          free(options);
                   
         exit(0);          exit(0);

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>