📄 route.c
字号:
/*
* Copyright (C) 2004 MITSUBISHI ELECTRIC CORPORATION and
* RENESAS SOLUTIONS CORPORATION
* All rights reserved.
*
* add/change/delete static routing function.
* (using to set default route)
*/
#include <tk/tkernel.h>
#include <renesas_tcpip.h>
#define HOST_MASK 0xffffffff
#define ESRCH 3
void renesas_tcpip_route(u_char, char *, char *, char *, int, int);
static void masktrim(struct sockaddr_in *);
static
void masktrim(ap)
struct sockaddr_in *ap;
{
register char *cp;
if (ap->sin_addr.s_addr == 0) {
ap->sin_len = 0;
return;
}
cp = (char *)(&ap->sin_addr.s_addr + 1);
while (*(--cp) == 0)
continue;
ap->sin_len = cp - (char *)ap + 1;
}
/* add/change/delete static routing */
void renesas_tcpip_route(action, p_dst, p_gate, p_mask, metric, flags)
u_char action; /* control command */
char *p_dst; /* a pointer to destination network address */
char *p_gate; /* a pointer to gateway address */
char *p_mask; /* a pointer to netmask address */
int metric; /* hop count */
int flags; /* flag info */
{
struct {
struct rt_msghdr w_rtm;
struct sockaddr_in w_dst;
struct sockaddr_in w_gate;
struct sockaddr_in w_mask;
} w;
u_long dst;
u_long gate;
u_long mask;
int cc;
int rt_sock;
static int rt_sock_seqno = 0;
dst = inet_addr(p_dst);
gate = inet_addr(p_gate);
mask = inet_addr(p_mask);
rt_sock = renesas_tcpip_socket(PF_ROUTE, SOCK_RAW, 0);
if (rt_sock < 0)
return;
memset(&w, 0, sizeof(w));
/* set message header info */
w.w_rtm.rtm_msglen = (u_short)sizeof(w);
w.w_rtm.rtm_version = (u_char)RTM_VERSION;
w.w_rtm.rtm_type = (u_char)action;
w.w_rtm.rtm_flags = flags;
w.w_rtm.rtm_seq = ++rt_sock_seqno;
w.w_rtm.rtm_addrs = (RTA_DST | RTA_GATEWAY);
if (metric != 0) {
w.w_rtm.rtm_rmx.rmx_hopcount = metric;
w.w_rtm.rtm_inits |= RTV_HOPCOUNT;
}
/* set destination address info */
w.w_dst.sin_family = AF_INET;
w.w_dst.sin_addr.s_addr = htonl(dst);
w.w_dst.sin_len = sizeof(w.w_dst);
/* set gateway address info */
w.w_gate.sin_family = AF_INET;
w.w_gate.sin_addr.s_addr = htonl(gate);
w.w_gate.sin_len = sizeof(w.w_gate);
/* set netmask address info */
if (mask == HOST_MASK) {
w.w_rtm.rtm_flags |= RTF_HOST;
w.w_rtm.rtm_msglen -= sizeof(w.w_mask);
}
else {
w.w_rtm.rtm_addrs |= RTA_NETMASK;
w.w_mask.sin_addr.s_addr = htonl(mask);
masktrim(&w.w_mask);
if (w.w_mask.sin_len == 0)
w.w_mask.sin_len = sizeof(long);
w.w_rtm.rtm_msglen -= (sizeof(w.w_mask) - w.w_mask.sin_len);
}
cc = renesas_tcpip_write((INT)rt_sock, (char *)&w, (UINT)w.w_rtm.rtm_msglen);
if (cc == w.w_rtm.rtm_msglen) {
renesas_tcpip_close(rt_sock);
return;
}
if (cc < 0) {
renesas_tcpip_close(rt_sock);
return;
}
renesas_tcpip_shutdown(rt_sock, SHUT_RDWR);
renesas_tcpip_close(rt_sock);
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -