mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Consolidate send_ip*_eth() functions
This commit is contained in:
@@ -3450,14 +3450,17 @@ int Sendto(const char *functionname, int sd,
|
|||||||
|
|
||||||
|
|
||||||
/* Send an IP packet over an ethernet handle. */
|
/* Send an IP packet over an ethernet handle. */
|
||||||
int send_ip_packet_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int packetlen) {
|
static int send_ip_packet_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int packetlen, int af) {
|
||||||
eth_t *ethsd;
|
eth_t *ethsd;
|
||||||
u8 *eth_frame;
|
u8 *eth_frame;
|
||||||
int res;
|
int res;
|
||||||
|
size_t framelen;
|
||||||
|
uint16_t ethertype = (af == AF_INET6 ? ETH_TYPE_IPV6 : ETH_TYPE_IP);
|
||||||
|
|
||||||
eth_frame = (u8 *) safe_malloc(14 + packetlen);
|
framelen = 14 + packetlen;
|
||||||
|
eth_frame = (u8 *) safe_malloc(framelen);
|
||||||
memcpy(eth_frame + 14, packet, packetlen);
|
memcpy(eth_frame + 14, packet, packetlen);
|
||||||
eth_pack_hdr(eth_frame, eth->dstmac, eth->srcmac, ETH_TYPE_IP);
|
eth_pack_hdr(eth_frame, eth->dstmac, eth->srcmac, ethertype);
|
||||||
if (!eth->ethsd) {
|
if (!eth->ethsd) {
|
||||||
ethsd = eth_open_cached(eth->devname);
|
ethsd = eth_open_cached(eth->devname);
|
||||||
if (!ethsd)
|
if (!ethsd)
|
||||||
@@ -3465,7 +3468,7 @@ int send_ip_packet_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int
|
|||||||
} else {
|
} else {
|
||||||
ethsd = eth->ethsd;
|
ethsd = eth->ethsd;
|
||||||
}
|
}
|
||||||
res = eth_send(ethsd, eth_frame, 14 + packetlen);
|
res = eth_send(ethsd, eth_frame, framelen);
|
||||||
/* No need to close ethsd due to caching */
|
/* No need to close ethsd due to caching */
|
||||||
free(eth_frame);
|
free(eth_frame);
|
||||||
|
|
||||||
@@ -3531,7 +3534,7 @@ int send_ip_packet_eth_or_sd(int sd, const struct eth_nfo *eth,
|
|||||||
const struct sockaddr_in *dst,
|
const struct sockaddr_in *dst,
|
||||||
const u8 *packet, unsigned int packetlen) {
|
const u8 *packet, unsigned int packetlen) {
|
||||||
if(eth)
|
if(eth)
|
||||||
return send_ip_packet_eth(eth, packet, packetlen);
|
return send_ip_packet_eth(eth, packet, packetlen, AF_INET);
|
||||||
else
|
else
|
||||||
return send_ip_packet_sd(sd, dst, packet, packetlen);
|
return send_ip_packet_sd(sd, dst, packet, packetlen);
|
||||||
}
|
}
|
||||||
@@ -3588,7 +3591,7 @@ int send_frag_ip_packet(int sd, const struct eth_nfo *eth,
|
|||||||
|
|
||||||
/* There are three ways to send a raw IPv6 packet.
|
/* There are three ways to send a raw IPv6 packet.
|
||||||
|
|
||||||
send_ipv6_eth works when the device is Ethernet. (Unfortunately IPv6-in-IPv4
|
send_ip_packet_eth works when the device is Ethernet. (Unfortunately IPv6-in-IPv4
|
||||||
tunnels are not.) We can control all header fields and extension headers.
|
tunnels are not.) We can control all header fields and extension headers.
|
||||||
|
|
||||||
send_ipv6_ipproto_raw must be used when IPPROTO_RAW sockets include the IP
|
send_ipv6_ipproto_raw must be used when IPPROTO_RAW sockets include the IP
|
||||||
@@ -3603,31 +3606,6 @@ int send_frag_ip_packet(int sd, const struct eth_nfo *eth,
|
|||||||
protocol. (More precisely, one socket per distinct Next Header value.)
|
protocol. (More precisely, one socket per distinct Next Header value.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Send an IPv6 packet over an Ethernet handle. */
|
|
||||||
static int send_ipv6_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int packetlen) {
|
|
||||||
eth_t *ethsd;
|
|
||||||
struct eth_hdr *eth_frame;
|
|
||||||
u8 *copy;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
copy = (u8 *) safe_malloc(packetlen + sizeof(*eth_frame));
|
|
||||||
memcpy(copy + sizeof(*eth_frame), packet, packetlen);
|
|
||||||
eth_frame = (struct eth_hdr *) copy;
|
|
||||||
eth_pack_hdr(eth_frame, eth->dstmac, eth->srcmac, ETH_TYPE_IPV6);
|
|
||||||
if (!eth->ethsd) {
|
|
||||||
ethsd = eth_open_cached(eth->devname);
|
|
||||||
if (!ethsd)
|
|
||||||
netutil_fatal("%s: Failed to open ethernet device (%s)", __func__, eth->devname);
|
|
||||||
} else {
|
|
||||||
ethsd = eth->ethsd;
|
|
||||||
}
|
|
||||||
res = eth_send(ethsd, eth_frame, sizeof(*eth_frame) + packetlen);
|
|
||||||
/* No need to close ethsd due to caching */
|
|
||||||
free(eth_frame);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_IPV6_IPPROTO_RAW
|
#if HAVE_IPV6_IPPROTO_RAW
|
||||||
|
|
||||||
/* Send an IPv6 packet over a raw socket, on platforms where IPPROTO_RAW implies
|
/* Send an IPv6 packet over a raw socket, on platforms where IPPROTO_RAW implies
|
||||||
@@ -3837,7 +3815,7 @@ bail:
|
|||||||
int send_ipv6_packet_eth_or_sd(int sd, const struct eth_nfo *eth,
|
int send_ipv6_packet_eth_or_sd(int sd, const struct eth_nfo *eth,
|
||||||
const struct sockaddr_in6 *dst, const u8 *packet, unsigned int packetlen) {
|
const struct sockaddr_in6 *dst, const u8 *packet, unsigned int packetlen) {
|
||||||
if (eth != NULL) {
|
if (eth != NULL) {
|
||||||
return send_ipv6_eth(eth, packet, packetlen);
|
return send_ip_packet_eth(eth, packet, packetlen, AF_INET6);
|
||||||
} else {
|
} else {
|
||||||
#if HAVE_IPV6_IPPROTO_RAW
|
#if HAVE_IPV6_IPPROTO_RAW
|
||||||
return send_ipv6_ipproto_raw(dst, packet, packetlen);
|
return send_ipv6_ipproto_raw(dst, packet, packetlen);
|
||||||
|
|||||||
@@ -424,9 +424,6 @@ int route_dst(const struct sockaddr_storage *dst, struct route_nfo *rnfo,
|
|||||||
/* Send an IP packet over a raw socket. */
|
/* Send an IP packet over a raw socket. */
|
||||||
int send_ip_packet_sd(int sd, const struct sockaddr_in *dst, const u8 *packet, unsigned int packetlen);
|
int send_ip_packet_sd(int sd, const struct sockaddr_in *dst, const u8 *packet, unsigned int packetlen);
|
||||||
|
|
||||||
/* Send an IP packet over an ethernet handle. */
|
|
||||||
int send_ip_packet_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int packetlen);
|
|
||||||
|
|
||||||
/* Sends the supplied pre-built IPv4 packet. The packet is sent through
|
/* Sends the supplied pre-built IPv4 packet. The packet is sent through
|
||||||
* the raw socket "sd" if "eth" is NULL. Otherwise, it gets sent at raw
|
* the raw socket "sd" if "eth" is NULL. Otherwise, it gets sent at raw
|
||||||
* ethernet level. */
|
* ethernet level. */
|
||||||
|
|||||||
Reference in New Issue
Block a user