forked from cramer/pcapmirror
additional parameters
This commit is contained in:
@@ -16,6 +16,9 @@ pcapmirror [options]
|
|||||||
* -f <filter> Specify the capture filter (BPF syntax)
|
* -f <filter> Specify the capture filter (BPF syntax)
|
||||||
* -r <host/ipv4/ipv6> Specify the destination host (required)
|
* -r <host/ipv4/ipv6> Specify the destination host (required)
|
||||||
* -p <port> Specify the destination port (default: 37008)
|
* -p <port> Specify the destination port (default: 37008)
|
||||||
|
* -e Use ERSPAN encapsulation (default: TZSP)
|
||||||
|
* -s <source_ip> Specify the source IP address (required for ERSPAN)
|
||||||
|
* -S <session_id> Specify the session ID (default: 42, must be between 0 and 1023)
|
||||||
* -4 Force IPv4 host lookup
|
* -4 Force IPv4 host lookup
|
||||||
* -6 Force IPv6 host lookup
|
* -6 Force IPv6 host lookup
|
||||||
* -l List available network interfaces.
|
* -l List available network interfaces.
|
||||||
|
|||||||
28
main.c
28
main.c
@@ -126,6 +126,9 @@ void print_usage(const char *program_name) {
|
|||||||
printf(" -f <filter> Specify the capture filter (BPF syntax)\n");
|
printf(" -f <filter> Specify the capture filter (BPF syntax)\n");
|
||||||
printf(" -r <host/ipv4/ipv6> Specify the destination host (required)\n");
|
printf(" -r <host/ipv4/ipv6> Specify the destination host (required)\n");
|
||||||
printf(" -p <port> Specify the destination port (default: %d)\n", DEFAULT_DEST_PORT);
|
printf(" -p <port> Specify the destination port (default: %d)\n", DEFAULT_DEST_PORT);
|
||||||
|
printf(" -e Use ERSPAN encapsulation (default: TZSP)\n");
|
||||||
|
printf(" -s <source_ip> Specify the source IP address (required for ERSPAN)\n");
|
||||||
|
printf(" -S <session_id> Specify the session ID (default: 42, must be between 0 and 1023)\n");
|
||||||
printf(" -4 Force IPv4 host lookup\n");
|
printf(" -4 Force IPv4 host lookup\n");
|
||||||
printf(" -6 Force IPv6 host lookup\n");
|
printf(" -6 Force IPv6 host lookup\n");
|
||||||
printf(" -l List available network interfaces\n");
|
printf(" -l List available network interfaces\n");
|
||||||
@@ -153,6 +156,8 @@ int main(int argc, char *argv[]) {
|
|||||||
unsigned long long int packet_count = 0; // Counter for matching packets (64bit)
|
unsigned long long int packet_count = 0; // Counter for matching packets (64bit)
|
||||||
|
|
||||||
int use_erspan = 0; // Flag for ERSPAN encapsulation
|
int use_erspan = 0; // Flag for ERSPAN encapsulation
|
||||||
|
char *source_address = NULL; // Source IP address, default is NULL
|
||||||
|
uint32_t session_id = 42; // Session ID (10 bits)
|
||||||
|
|
||||||
// Socket variables
|
// Socket variables
|
||||||
int sockfd;
|
int sockfd;
|
||||||
@@ -196,6 +201,16 @@ int main(int argc, char *argv[]) {
|
|||||||
verbose = 0; // Disable verbose mode if -c is set
|
verbose = 0; // Disable verbose mode if -c is set
|
||||||
} else if (strcmp(argv[i], "-e") == 0) {
|
} else if (strcmp(argv[i], "-e") == 0) {
|
||||||
use_erspan = 1; // Enable ERSPAN encapsulation
|
use_erspan = 1; // Enable ERSPAN encapsulation
|
||||||
|
} else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
|
||||||
|
source_address = argv[i + 1]; // Set source IP from command line
|
||||||
|
i++; // Skip the source IP value
|
||||||
|
} else if (strcmp(argv[i], "-S") == 0 && i + 1 < argc) {
|
||||||
|
session_id = atoi(argv[i + 1]); // Set session ID from command line
|
||||||
|
if (session_id > 1023) { // Validate session ID (must fit in 10 bits)
|
||||||
|
fprintf(stderr, "Error: Session ID must be between 0 and 1023.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
i++; // Skip the session ID value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -448,9 +463,19 @@ int main(int argc, char *argv[]) {
|
|||||||
ip_header.ip_off = 0; // Fragment offset
|
ip_header.ip_off = 0; // Fragment offset
|
||||||
ip_header.ip_ttl = 64; // Time to live
|
ip_header.ip_ttl = 64; // Time to live
|
||||||
ip_header.ip_p = IPPROTO_GRE; // Protocol (GRE)
|
ip_header.ip_p = IPPROTO_GRE; // Protocol (GRE)
|
||||||
ip_header.ip_src.s_addr = inet_addr("192.168.1.1"); // Replace with your source IP
|
|
||||||
ip_header.ip_dst.s_addr = ((struct sockaddr_in *)&dest_addr)->sin_addr.s_addr;
|
ip_header.ip_dst.s_addr = ((struct sockaddr_in *)&dest_addr)->sin_addr.s_addr;
|
||||||
|
|
||||||
|
if (source_address != NULL) {
|
||||||
|
if (inet_pton(AF_INET, source_address, &(ip_header.ip_src)) != 1) {
|
||||||
|
fprintf(stderr, "Error: Invalid source IP address '%s'\n", source_address);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ip_header.ip_src.s_addr = inet_addr("192.168.1.1"); // Default source IP
|
||||||
|
}
|
||||||
|
|
||||||
|
ip_header.ip_src.s_addr = inet_addr("192.168.1.1"); // Replace with your source IP
|
||||||
|
|
||||||
// Set GRE header fields
|
// Set GRE header fields
|
||||||
gre.flags = htons(0x1000); // GRE flags (S bit set for Sequence Number Present)
|
gre.flags = htons(0x1000); // GRE flags (S bit set for Sequence Number Present)
|
||||||
gre.protocol = htons(0x88BE); // ERSPAN protocol type
|
gre.protocol = htons(0x88BE); // ERSPAN protocol type
|
||||||
@@ -461,7 +486,6 @@ int main(int argc, char *argv[]) {
|
|||||||
uint32_t cos = 5; // Class of Service (3 bits)
|
uint32_t cos = 5; // Class of Service (3 bits)
|
||||||
uint32_t en = 0; // Trunk Encapsulation Type (2 bit)
|
uint32_t en = 0; // Trunk Encapsulation Type (2 bit)
|
||||||
uint32_t t = 1; // Truncated (1 bit)
|
uint32_t t = 1; // Truncated (1 bit)
|
||||||
uint32_t session_id = 42; // Session ID (10 bits)
|
|
||||||
|
|
||||||
// Combine fields into the 32-bit ver_vlan_cos_en_t_session field
|
// Combine fields into the 32-bit ver_vlan_cos_en_t_session field
|
||||||
erspan.ver_vlan_cos_en_t_session =
|
erspan.ver_vlan_cos_en_t_session =
|
||||||
|
|||||||
@@ -24,6 +24,15 @@ Specify the destination host (required).
|
|||||||
.B \-p \fIport\fR
|
.B \-p \fIport\fR
|
||||||
Specify the destination port (default: 37008).
|
Specify the destination port (default: 37008).
|
||||||
.TP
|
.TP
|
||||||
|
.B \-e
|
||||||
|
Use ERSPAN encapsulation.
|
||||||
|
.TP
|
||||||
|
.B \-s \fIsource_ip\fR
|
||||||
|
Specify the source IP address (required for ERSPAN).
|
||||||
|
.TP
|
||||||
|
.B \-S \fIsession_id\fR
|
||||||
|
Specify the session ID (default: 42, must be between 0 and 1023)
|
||||||
|
.TP
|
||||||
.B \-4
|
.B \-4
|
||||||
Force IPv4 host lookup.
|
Force IPv4 host lookup.
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
Reference in New Issue
Block a user