⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 route.c

📁 T-kernel Tcp/ip Protocol Stack Sample
💻 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 + -