Files
kernel-study/userprog/route/route.c
T
2025-12-30 01:20:20 +00:00

62 lines
1.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/route.h> // struct rtentry
#include <arpa/inet.h>
// 사용법: route add default gw <GATEWAY_IP>
int main(int argc, char *argv[]) {
// 파싱을 간단하게 하기 위해 고정된 포맷만 지원
if (argc != 5 || strcmp(argv[1], "add") != 0 ||
strcmp(argv[2], "default") != 0 || strcmp(argv[3], "gw") != 0) {
printf("Usage: route add default gw <GATEWAY_IP>\n");
return 1;
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct rtentry rt;
memset(&rt, 0, sizeof(rt));
// 1. 목적지 (Destination): 0.0.0.0 (모든 주소)
struct sockaddr_in *dst = (struct sockaddr_in *)&rt.rt_dst;
dst->sin_family = AF_INET;
dst->sin_addr.s_addr = INADDR_ANY;
// 2. 마스크 (Genmask): 0.0.0.0 (모든 비트 허용)
struct sockaddr_in *mask = (struct sockaddr_in *)&rt.rt_genmask;
mask->sin_family = AF_INET;
mask->sin_addr.s_addr = INADDR_ANY;
// 3. 게이트웨이 (Gateway): 입력받은 IP (예: 10.0.2.2)
struct sockaddr_in *gw = (struct sockaddr_in *)&rt.rt_gateway;
gw->sin_family = AF_INET;
if (inet_pton(AF_INET, argv[4], &gw->sin_addr) <= 0) {
printf("Invalid Gateway IP\n");
close(sockfd);
return 1;
}
// 4. 플래그 설정
// RTF_UP: 경로 활성화
// RTF_GATEWAY: 목적지가 게이트웨이임
rt.rt_flags = RTF_UP | RTF_GATEWAY;
// 5. 커널에 라우팅 테이블 추가 요청 (SIOCADDRT)
if (ioctl(sockfd, SIOCADDRT, &rt) < 0) {
perror("route add");
close(sockfd);
return 1;
}
printf("Default gateway set to %s\n", argv[4]);
close(sockfd);
return 0;
}