#include #include #include #include #include "log.h" int packet_inject_ipv4(struct in_addr *ip_dst, const char *data, int len) { struct sockaddr_in saddr4 = {0}; saddr4.sin_family = PF_INET; memcpy(&saddr4.sin_addr, ip_dst, sizeof(struct in_addr)); int fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW); if (fd == -1) { LOG_ERROR("Failed at socket(PF_INET, SOCK_RAW), %d: %s", errno, strerror(errno)); return -1; } if (sendto(fd, data, len, 0, (struct sockaddr *)&saddr4, sizeof(saddr4)) == -1) { char string[256] = {0}; inet_ntop(PF_INET, ip_dst, string, sizeof(string)); LOG_INFO("Failed at send() %s, (%d: %s)", string, errno, strerror(errno)); close(fd); return -1; } close(fd); return 0; } int packet_inject_ipv6(struct in6_addr *ip6_dst, const char *data, int len) { struct sockaddr_in6 saddr6 = {0}; saddr6.sin6_family = PF_INET6; memcpy(&saddr6.sin6_addr, ip6_dst, sizeof(struct in6_addr)); int fd = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); if (fd == -1) { LOG_ERROR("Failed at socket(PF_INET6, SOCK_RAW), %d: %s", errno, strerror(errno)); return -1; } if (sendto(fd, data, len, 0, (struct sockaddr *)&saddr6, sizeof(saddr6)) == -1) { char string[256] = {0}; inet_ntop(PF_INET6, ip6_dst, string, sizeof(string)); LOG_INFO("Failed at send() %s, (%d: %s)", string, errno, strerror(errno)); close(fd); return -1; } close(fd); return 0; }