Lines Matching refs:rt
191 static void get_next_params(char **argv, struct rtentry *rt, char **netmask)
194 if (!strcmp(*argv, "reject")) rt->rt_flags |= RTF_REJECT;
195 else if (!strcmp(*argv, "mod")) rt->rt_flags |= RTF_MODIFIED;
196 else if (!strcmp(*argv, "dyn")) rt->rt_flags |= RTF_DYNAMIC;
197 else if (!strcmp(*argv, "reinstate")) rt->rt_flags |= RTF_REINSTATE;
203 rt->rt_metric = atolx_range(argv[1], 0, ULONG_MAX) + 1;
207 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr);
212 rt->rt_genmask = sock;
215 if (!(rt->rt_flags & RTF_GATEWAY)) {
216 if (!get_hostname(argv[1], (struct sockaddr_in *) &rt->rt_gateway))
217 rt->rt_flags |= RTF_GATEWAY;
222 rt->rt_mtu = atolx_range(argv[1], 64, 65536);
223 rt->rt_flags |= RTF_MSS;
226 rt->rt_window = atolx_range(argv[1], 128, INT_MAX); //win low
227 rt->rt_flags |= RTF_WINDOW;
229 rt->rt_irtt = atolx_range(argv[1], 0, INT_MAX);
230 rt->rt_flags |= RTF_IRTT;
231 } else if (!strcmp(*argv, "dev") && !rt->rt_dev) rt->rt_dev = argv[1];
237 if (!rt->rt_dev && (rt->rt_flags & RTF_REJECT)) rt->rt_dev = (char *)"lo";
241 static void verify_netmask(struct rtentry *rt, char *netmask)
243 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr);
244 unsigned int router_addr = ~(unsigned int)(((struct sockaddr_in *)&((rt)->rt_dst))->sin_addr.s_addr);
248 if ((rt->rt_flags & RTF_HOST) && addr_mask != INVALID_ADDR)
251 addr_mask = ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr;
259 struct rtentry rt;
269 memset(&rt, 0, sizeof(struct rtentry));
276 (((struct sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr)
278 rt.rt_genmask.sa_family = AF_INET;
282 is_net_or_host = get_hostname(targetip, (void *)&rt.rt_dst);
285 rt.rt_flags = ((is_net_or_host) ? RTF_UP : (RTF_UP | RTF_HOST));
287 get_next_params(argv, &rt, (char **)&netmask);
288 verify_netmask(&rt, (char *)netmask);
290 if ((action == 1) && (rt.rt_flags & RTF_HOST))
291 (((struct sockaddr_in *)&((rt).rt_genmask))->sin_addr.s_addr) = INVALID_ADDR;
294 if (action == 1) xioctl(sokfd, SIOCADDRT, &rt);
295 else xioctl(sokfd, SIOCDELRT, &rt);
303 static void is_prefix_inet6(char **tip, struct in6_rtmsg *rt)
313 rt->rtmsg_flags = (plen == DEFAULT_PREFIXLEN) ? (RTF_UP | RTF_HOST) : RTF_UP;
314 rt->rtmsg_dst_len = plen;
321 static void get_next_params_inet6(char **argv, struct sockaddr_in6 *sock_in6, struct in6_rtmsg *rt, char **dev_name)
324 if (!strcmp(*argv, "mod")) rt->rtmsg_flags |= RTF_MODIFIED;
325 else if (!strcmp(*argv, "dyn")) rt->rtmsg_flags |= RTF_DYNAMIC;
330 rt->rtmsg_metric = atolx_range(argv[1], 0, ULONG_MAX);
333 if (!(rt->rtmsg_flags & RTF_GATEWAY)) {
335 memcpy(&rt->rtmsg_gateway, sock_in6->sin6_addr.s6_addr, sizeof(struct in6_addr));
336 rt->rtmsg_flags |= RTF_GATEWAY;
351 struct in6_rtmsg rt;
357 memset(&rt, 0, sizeof(struct in6_rtmsg));
362 rt.rtmsg_flags = RTF_UP;
363 rt.rtmsg_dst_len = 0;
365 is_prefix_inet6((char **)&targetip, &rt);
369 rt.rtmsg_metric = 1; //default metric.
370 memcpy(&rt.rtmsg_dst, sock_in6.sin6_addr.s6_addr, sizeof(struct in6_addr));
371 get_next_params_inet6(argv, &sock_in6, &rt, (char **)&dev_name);
379 rt.rtmsg_ifindex = ifre->ifr_ifindex;
381 if (action == 1) xioctl(sockfd, SIOCADDRT, &rt);
382 else xioctl(sockfd, SIOCDELRT, &rt);