Lines Matching refs:opt
43 void ip_options_build(struct sk_buff *skb, struct ip_options *opt, in ip_options_build() argument
48 memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options)); in ip_options_build()
49 memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen); in ip_options_build()
50 opt = &(IPCB(skb)->opt); in ip_options_build()
52 if (opt->srr) in ip_options_build()
53 memcpy(iph+opt->srr+iph[opt->srr+1]-4, &daddr, 4); in ip_options_build()
56 if (opt->rr_needaddr) in ip_options_build()
57 ip_rt_get_source(iph+opt->rr+iph[opt->rr+2]-5, skb, rt); in ip_options_build()
58 if (opt->ts_needaddr) in ip_options_build()
59 ip_rt_get_source(iph+opt->ts+iph[opt->ts+2]-9, skb, rt); in ip_options_build()
60 if (opt->ts_needtime) { in ip_options_build()
65 memcpy(iph+opt->ts+iph[opt->ts+2]-5, &midtime, 4); in ip_options_build()
69 if (opt->rr) { in ip_options_build()
70 memset(iph+opt->rr, IPOPT_NOP, iph[opt->rr+1]); in ip_options_build()
71 opt->rr = 0; in ip_options_build()
72 opt->rr_needaddr = 0; in ip_options_build()
74 if (opt->ts) { in ip_options_build()
75 memset(iph+opt->ts, IPOPT_NOP, iph[opt->ts+1]); in ip_options_build()
76 opt->ts = 0; in ip_options_build()
77 opt->ts_needaddr = opt->ts_needtime = 0; in ip_options_build()
214 struct ip_options *opt = &(IPCB(skb)->opt); in ip_options_fragment() local
215 int l = opt->optlen; in ip_options_fragment()
235 opt->ts = 0; in ip_options_fragment()
236 opt->rr = 0; in ip_options_fragment()
237 opt->rr_needaddr = 0; in ip_options_fragment()
238 opt->ts_needaddr = 0; in ip_options_fragment()
239 opt->ts_needtime = 0; in ip_options_fragment()
258 struct ip_options *opt, struct sk_buff *skb) in ip_options_compile() argument
271 optptr = opt->__data; in ip_options_compile()
274 for (l = opt->optlen; l > 0; ) { in ip_options_compile()
280 opt->is_changed = 1; in ip_options_compile()
310 if (opt->srr) { in ip_options_compile()
319 memcpy(&opt->faddr, &optptr[3], 4); in ip_options_compile()
323 opt->is_strictroute = (optptr[0] == IPOPT_SSRR); in ip_options_compile()
324 opt->srr = optptr - iph; in ip_options_compile()
327 if (opt->rr) { in ip_options_compile()
347 opt->is_changed = 1; in ip_options_compile()
350 opt->rr_needaddr = 1; in ip_options_compile()
352 opt->rr = optptr - iph; in ip_options_compile()
355 if (opt->ts) { in ip_options_compile()
377 opt->ts_needtime = 1; in ip_options_compile()
390 opt->ts_needaddr = 1; in ip_options_compile()
391 opt->ts_needtime = 1; in ip_options_compile()
407 opt->ts_needtime = 1; in ip_options_compile()
423 opt->is_changed = 1; in ip_options_compile()
433 opt->is_changed = 1; in ip_options_compile()
436 opt->ts = optptr - iph; in ip_options_compile()
444 opt->router_alert = optptr - iph; in ip_options_compile()
447 if ((!skb && !ns_capable(net->user_ns, CAP_NET_RAW)) || opt->cipso) { in ip_options_compile()
451 opt->cipso = optptr - iph; in ip_options_compile()
486 void ip_options_undo(struct ip_options *opt) in ip_options_undo() argument
488 if (opt->srr) { in ip_options_undo()
489 unsigned char *optptr = opt->__data+opt->srr-sizeof(struct iphdr); in ip_options_undo()
491 memcpy(optptr+3, &opt->faddr, 4); in ip_options_undo()
493 if (opt->rr_needaddr) { in ip_options_undo()
494 unsigned char *optptr = opt->__data+opt->rr-sizeof(struct iphdr); in ip_options_undo()
498 if (opt->ts) { in ip_options_undo()
499 unsigned char *optptr = opt->__data+opt->ts-sizeof(struct iphdr); in ip_options_undo()
500 if (opt->ts_needtime) { in ip_options_undo()
506 if (opt->ts_needaddr) { in ip_options_undo()
520 struct ip_options_rcu *opt, int optlen) in ip_options_get_finish() argument
523 opt->opt.__data[optlen++] = IPOPT_END; in ip_options_get_finish()
524 opt->opt.optlen = optlen; in ip_options_get_finish()
525 if (optlen && ip_options_compile(net, &opt->opt, NULL)) { in ip_options_get_finish()
526 kfree(opt); in ip_options_get_finish()
530 *optp = opt; in ip_options_get_finish()
537 struct ip_options_rcu *opt = ip_options_get_alloc(optlen); in ip_options_get_from_user() local
539 if (!opt) in ip_options_get_from_user()
541 if (optlen && copy_from_user(opt->opt.__data, data, optlen)) { in ip_options_get_from_user()
542 kfree(opt); in ip_options_get_from_user()
545 return ip_options_get_finish(net, optp, opt, optlen); in ip_options_get_from_user()
551 struct ip_options_rcu *opt = ip_options_get_alloc(optlen); in ip_options_get() local
553 if (!opt) in ip_options_get()
556 memcpy(opt->opt.__data, data, optlen); in ip_options_get()
557 return ip_options_get_finish(net, optp, opt, optlen); in ip_options_get()
562 struct ip_options *opt = &(IPCB(skb)->opt); in ip_forward_options() local
567 if (opt->rr_needaddr) { in ip_forward_options()
568 optptr = (unsigned char *)raw + opt->rr; in ip_forward_options()
570 opt->is_changed = 1; in ip_forward_options()
572 if (opt->srr_is_hit) { in ip_forward_options()
575 optptr = raw + opt->srr; in ip_forward_options()
583 if (memcmp(&opt->nexthop, &optptr[srrptr-1], 4) == 0) in ip_forward_options()
587 opt->is_changed = 1; in ip_forward_options()
588 ip_hdr(skb)->daddr = opt->nexthop; in ip_forward_options()
595 if (opt->ts_needaddr) { in ip_forward_options()
596 optptr = raw + opt->ts; in ip_forward_options()
598 opt->is_changed = 1; in ip_forward_options()
601 if (opt->is_changed) { in ip_forward_options()
602 opt->is_changed = 0; in ip_forward_options()
609 struct ip_options *opt = &(IPCB(skb)->opt); in ip_options_rcv_srr() local
613 unsigned char *optptr = skb_network_header(skb) + opt->srr; in ip_options_rcv_srr()
625 if (!opt->is_strictroute) in ip_options_rcv_srr()
635 icmp_send(skb, ICMP_PARAMETERPROB, 0, htonl((opt->srr+2)<<24)); in ip_options_rcv_srr()
654 opt->is_changed = 1; in ip_options_rcv_srr()
657 opt->srr_is_hit = 1; in ip_options_rcv_srr()
658 opt->nexthop = nexthop; in ip_options_rcv_srr()
659 opt->is_changed = 1; in ip_options_rcv_srr()