인디노트

ethertnet 패킷 라우팅 C 코드 본문

개발 플랫폼 및 언어/네트워크 기술

ethertnet 패킷 라우팅 C 코드

인디개발자 2023. 4. 14. 07:40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <linux/if_packet.h>
#include <netinet/ether.h>

#define BUF_SIZE 2048
#define ETH_HDR_LEN 14

int main(int argc, char **argv) {
    int sockfd;
    struct ifreq ifr;
    char buffer[BUF_SIZE];
    struct ether_header *eth_header = (struct ether_header *) buffer;
    struct sockaddr_ll socket_address;
    int numbytes;

    if(argc != 3) {
        printf("Usage: %s <interface> <destination MAC address>\n", argv[0]);
        exit(1);
    }

    sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if(sockfd < 0) {
        perror("socket");
        exit(1);
    }

    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
    if(ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) {
        perror("ioctl");
        exit(1);
    }

    memset(&socket_address, 0, sizeof(socket_address));
    socket_address.sll_family = AF_PACKET;
    socket_address.sll_ifindex = ifr.ifr_ifindex;
    socket_address.sll_halen = ETH_ALEN;
    memcpy(socket_address.sll_addr, argv[2], ETH_ALEN);

    while(1) {
        numbytes = recvfrom(sockfd, buffer, BUF_SIZE, 0, NULL, NULL);
        if(numbytes <= 0) {
            perror("recvfrom");
            continue;
        }

        if(memcmp(eth_header->ether_dhost, argv[2], ETH_ALEN) == 0) {
            printf("Packet received on interface %s, forwarding...\n", argv[1]);
            sendto(sockfd, buffer, numbytes, 0, (struct sockaddr *)&socket_address, sizeof(socket_address));
        }
    }

    close(sockfd);
    return 0;
}

위 코드는 지정된 인터페이스에서 수신한 이더넷 패킷의 목적지 MAC 주소를 확인하여, 목적지 주소가 지정한 MAC 주소와 일치하면 해당 패킷을 해당 MAC 주소를 가진 인터페이스로 전달하는 간단한 패킷 라우팅 코드입니다.

코드의 주요 기능은 다음과 같습니다.

  • 소켓 생성 및 초기화
  • 지정된 인터페이스의 인덱스 확인
  • 패킷 수신 및 목적지 MAC 주소 확인
  • 목적지 주소가 지정한 MAC 주소와 일치하면 해당 패킷을 해당 MAC 주소를 가진 인터페이스로 전달

참고로, 위 코드는 간단한 예시일 뿐이며 실제로는 이더넷 패킷 라우팅에 필요한 다양한 기능

반응형
Comments