version 1.1.1.1, 2012/02/21 22:14:23
|
version 1.1.1.2, 2013/07/22 11:54:41
|
Line 1
|
Line 1
|
/* |
/* |
* $Id$ |
* $Id$ |
* |
* |
* libnet 1.1 | * cdppoke |
* Build an CDP packet | * CDP information * CDP information injection tool |
| * Released as part of the MXFP Layer 2 Toolkit |
| * http://www.packetfactory.net/MXFP |
* |
* |
* Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com> | * Copyright (c) 2004 Mike D. Schiffman <mike@infonexus.com> |
| * Copyright (c) 2004 Jeremy Rauch <jrauch@cadre.org> |
| * |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 31
|
Line 35
|
*/ |
*/ |
|
|
#if (HAVE_CONFIG_H) |
#if (HAVE_CONFIG_H) |
|
#if ((_WIN32) && !(__CYGWIN__)) |
|
#include "../include/win32/config.h" |
|
#else |
#include "../include/config.h" |
#include "../include/config.h" |
#endif |
#endif |
|
#endif |
#include "./libnet_test.h" |
#include "./libnet_test.h" |
|
|
|
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
int c, len; | int c, len, index; |
libnet_t *l; |
libnet_t *l; |
libnet_ptag_t t; |
libnet_ptag_t t; |
u_char *value; |
u_char *value; |
u_char values[100]; |
u_char values[100]; |
u_short tmp; |
u_short tmp; |
u_long tmp2; |
|
char *device = NULL; |
|
char errbuf[LIBNET_ERRBUF_SIZE]; |
char errbuf[LIBNET_ERRBUF_SIZE]; |
|
uint8_t oui[3] = { 0x00, 0x00, 0x0c }; |
|
uint8_t cdp_mac[6] = {0x01, 0x0, 0xc, 0xcc, 0xcc, 0xcc}; |
|
|
printf("libnet 1.1 packet shaping: CDP[link]\n"); | if (argc != 3) |
/* | { |
* Initialize the library. Root priviledges are required. | fprintf(stderr, "usage %s device device-id\n", argv[0]); |
*/ | return (EXIT_FAILURE); |
l = libnet_init( | } |
LIBNET_LINK, /* injection type */ | |
device, /* network interface */ | |
errbuf); /* errbuf */ | |
|
|
|
fprintf(stderr, "cdppoke...\n"); |
|
|
|
l = libnet_init(LIBNET_LINK, argv[1], errbuf); |
if (l == NULL) |
if (l == NULL) |
{ |
{ |
fprintf(stderr, "libnet_init() failed: %s", errbuf); |
fprintf(stderr, "libnet_init() failed: %s", errbuf); |
exit(EXIT_FAILURE); | return (EXIT_FAILURE); |
} |
} |
|
|
value = "switch"; | /* build the TLV's by hand until we get something better */ |
len = strlen(value); | memset(values, 0, sizeof(values)); |
| index = 0; |
| |
| tmp = htons(LIBNET_CDP_VERSION); |
| memcpy(values, &tmp, 2); |
| index += 2; |
| tmp = htons(9); /* length of string below plus type and length fields */ |
| memcpy(values + index, &tmp, 2); |
| index += 2; |
| memcpy(values + index, (u_char *)"1.1.1", 5); |
| index += 5; |
|
|
|
/* this TLV is handled by the libnet builder */ |
|
value = argv[2]; |
|
len = strlen(argv[2]); |
|
|
|
/* build CDP header */ |
t = libnet_build_cdp( |
t = libnet_build_cdp( |
1, /* version */ | 1, /* version */ |
30, /* time to live */ | 30, /* time to live */ |
0, /* checksum */ | 0x0, /* checksum */ |
LIBNET_CDP_DEVID, /* type */ | 0x1, /* type */ |
len, /* length */ | len, /* length */ |
value, /* value */ | value, /* value */ |
NULL, /* payload */ | values, /* payload */ |
0, /* payload size */ | index, /* payload size */ |
l, /* libnet handle */ | l, /* libnet context */ |
0); /* libnet id */ | 0); /* libnet ptag */ |
if (t == -1) |
if (t == -1) |
{ |
{ |
fprintf(stderr, "Can't build CDP header: %s\n", libnet_geterror(l)); |
fprintf(stderr, "Can't build CDP header: %s\n", libnet_geterror(l)); |
goto bad; |
goto bad; |
} |
} |
|
|
memset(values, 0, sizeof(values)); | /* build 802.2 header */ |
tmp = htons(LIBNET_CDP_PORTID); | t = libnet_build_802_2snap( |
memcpy(values, &tmp, 2); | LIBNET_SAP_SNAP, /* SAP SNAP code */ |
tmp = htons(0x0014); | LIBNET_SAP_SNAP, /* SAP SNAP code */ |
memcpy(values + 2, &tmp, 2); | 0x03, /* control */ |
memcpy(values + 4, (u_char *)"FastEthernet0/20", 16); | oui, /* OUI */ |
t = libnet_build_data( | 0x2000, /* upper layer protocol type */ |
values, | NULL, /* payload */ |
20, | 0, /* payload size */ |
l, | l, /* libnet context */ |
0); | 0); /* libnet ptag */ |
if (t == -1) |
if (t == -1) |
{ |
{ |
fprintf(stderr, "Can't build CDP data: %s\n", libnet_geterror(l)); | fprintf(stderr, "Can't build SNAP header: %s\n", libnet_geterror(l)); |
goto bad; |
goto bad; |
} |
} |
memset(values, 0, sizeof(values)); |
|
tmp = htons(LIBNET_CDP_CAPABIL); |
|
memcpy(values, &tmp, 2); |
|
tmp = htons(0x0008); |
|
memcpy(values + 2, &tmp, 2); |
|
tmp2 = htonl((LIBNET_CDP_CAP_L2S | LIBNET_CDP_CAP_L2B)); |
|
memcpy(values + 4, &tmp2, 4); |
|
t = libnet_build_data( |
|
values, |
|
8, |
|
l, |
|
0); |
|
if (t == -1) |
|
{ |
|
fprintf(stderr, "Can't build CDP data: %s\n", libnet_geterror(l)); |
|
goto bad; |
|
} |
|
memset(values, 0, sizeof(values)); |
|
tmp = htons(LIBNET_CDP_VERSION); |
|
memcpy(values, &tmp, 2); |
|
tmp = htons(0x001f); |
|
memcpy(values + 2, &tmp, 2); |
|
memcpy(values + 4, (u_char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26); |
|
t = libnet_build_data( |
|
values, |
|
31, |
|
l, |
|
0); |
|
if (t == -1) |
|
{ |
|
fprintf(stderr, "Can't build CDP data: %s\n", libnet_geterror(l)); |
|
goto bad; |
|
} |
|
memset(values, 0, sizeof(values)); |
|
tmp = htons(LIBNET_CDP_PLATFORM); |
|
memcpy(values, &tmp, 2); |
|
tmp = htons(0x0015); |
|
memcpy(values + 2, &tmp, 2); |
|
memcpy(values + 4, (u_char *)"cisco WS-C2924-XL", 17); |
|
t = libnet_build_data( |
|
values, |
|
21, |
|
l, |
|
0); |
|
if (t == -1) |
|
{ |
|
fprintf(stderr, "Can't build CDP data: %s\n", libnet_geterror(l)); |
|
goto bad; |
|
} |
|
|
|
t = libnet_build_ethernet( | /* build 802.3 header */ |
enet_dst, /* ethernet destination */ | t = libnet_build_802_3( |
enet_src, /* ethernet source */ | cdp_mac, /* ethernet destination */ |
0x2000, /* protocol type */ | (uint8_t *)libnet_get_hwaddr(l), /* ethernet source */ |
NULL, /* payload */ | LIBNET_802_2_H + LIBNET_802_2SNAP_H + LIBNET_CDP_H, /* packet len */ |
0, /* payload size */ | NULL, /* payload */ |
l, /* libnet handle */ | 0, /* payload size */ |
0); /* libnet id */ | l, /* libnet context */ |
| 0); /* libnet ptag */ |
if (t == -1) |
if (t == -1) |
{ |
{ |
fprintf(stderr, "Can't build ethernet header: %s\n", libnet_geterror(l)); | fprintf(stderr, "Can't build 802.3 header: %s\n", libnet_geterror(l)); |
goto bad; |
goto bad; |
} |
} |
|
|
/* | /* write the packet out */ |
* Write it to the wire. | |
*/ | |
c = libnet_write(l); |
c = libnet_write(l); |
|
|
if (c == -1) |
if (c == -1) |
{ |
{ |
fprintf(stderr, "Write error: %s\n", libnet_geterror(l)); |
fprintf(stderr, "Write error: %s\n", libnet_geterror(l)); |
Line 175 main(int argc, char *argv[])
|
Line 148 main(int argc, char *argv[])
|
} |
} |
else |
else |
{ |
{ |
fprintf(stderr, "Wrote %d byte CDP packet; check the wire.\n", c); | fprintf(stderr, "Wrote %d byte CDP frame \"%s\"\n", c, argv[2]); |
} |
} |
libnet_destroy(l); |
libnet_destroy(l); |
return (EXIT_SUCCESS); |
return (EXIT_SUCCESS); |