Lines Matching refs:opt
44 void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
49 memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options));
50 memcpy(iph + sizeof(struct iphdr), opt->__data, opt->optlen);
51 opt = &(IPCB(skb)->opt);
53 if (opt->srr)
54 memcpy(iph + opt->srr + iph[opt->srr + 1] - 4, &daddr, 4);
57 if (opt->rr_needaddr)
58 ip_rt_get_source(iph + opt->rr + iph[opt->rr + 2] - 5, skb, rt);
59 if (opt->ts_needaddr)
60 ip_rt_get_source(iph + opt->ts + iph[opt->ts + 2] - 9, skb, rt);
61 if (opt->ts_needtime) {
65 memcpy(iph + opt->ts + iph[opt->ts + 2] - 5, &midtime, 4);
69 if (opt->rr) {
70 memset(iph + opt->rr, IPOPT_NOP, iph[opt->rr + 1]);
71 opt->rr = 0;
72 opt->rr_needaddr = 0;
74 if (opt->ts) {
75 memset(iph + opt->ts, IPOPT_NOP, iph[opt->ts + 1]);
76 opt->ts = 0;
77 opt->ts_needaddr = opt->ts_needtime = 0;
211 struct ip_options *opt = &(IPCB(skb)->opt);
212 int l = opt->optlen;
232 opt->ts = 0;
233 opt->rr = 0;
234 opt->rr_needaddr = 0;
235 opt->ts_needaddr = 0;
236 opt->ts_needtime = 0;
250 * Caller should clear *opt, and set opt->data.
251 * If opt == NULL, then skb->data should point to IP header.
255 struct ip_options *opt, struct sk_buff *skb,
269 optptr = opt->__data;
272 for (l = opt->optlen; l > 0; ) {
278 opt->is_changed = 1;
308 if (opt->srr) {
317 memcpy(&opt->faddr, &optptr[3], 4);
321 opt->is_strictroute = (optptr[0] == IPOPT_SSRR);
322 opt->srr = optptr - iph;
325 if (opt->rr) {
345 opt->is_changed = 1;
348 opt->rr_needaddr = 1;
350 opt->rr = optptr - iph;
353 if (opt->ts) {
375 opt->ts_needtime = 1;
388 opt->ts_needaddr = 1;
389 opt->ts_needtime = 1;
405 opt->ts_needtime = 1;
420 opt->is_changed = 1;
430 opt->is_changed = 1;
433 opt->ts = optptr - iph;
441 opt->router_alert = optptr - iph;
444 if ((!skb && !ns_capable(net->user_ns, CAP_NET_RAW)) || opt->cipso) {
448 opt->cipso = optptr - iph;
479 struct ip_options *opt, struct sk_buff *skb)
484 ret = __ip_options_compile(net, opt, skb, &info);
495 void ip_options_undo(struct ip_options *opt)
497 if (opt->srr) {
498 unsigned char *optptr = opt->__data + opt->srr - sizeof(struct iphdr);
501 memcpy(optptr + 3, &opt->faddr, 4);
503 if (opt->rr_needaddr) {
504 unsigned char *optptr = opt->__data + opt->rr - sizeof(struct iphdr);
509 if (opt->ts) {
510 unsigned char *optptr = opt->__data + opt->ts - sizeof(struct iphdr);
512 if (opt->ts_needtime) {
518 if (opt->ts_needaddr) {
528 struct ip_options_rcu *opt;
530 opt = kzalloc(sizeof(struct ip_options_rcu) + ((optlen + 3) & ~3),
532 if (!opt)
534 if (optlen && copy_from_sockptr(opt->opt.__data, data, optlen)) {
535 kfree(opt);
540 opt->opt.__data[optlen++] = IPOPT_END;
541 opt->opt.optlen = optlen;
542 if (optlen && ip_options_compile(net, &opt->opt, NULL)) {
543 kfree(opt);
547 *optp = opt;
553 struct ip_options *opt = &(IPCB(skb)->opt);
558 if (opt->rr_needaddr) {
559 optptr = (unsigned char *)raw + opt->rr;
561 opt->is_changed = 1;
563 if (opt->srr_is_hit) {
566 optptr = raw + opt->srr;
574 if (memcmp(&opt->nexthop, &optptr[srrptr-1], 4) == 0)
578 opt->is_changed = 1;
579 ip_hdr(skb)->daddr = opt->nexthop;
586 if (opt->ts_needaddr) {
587 optptr = raw + opt->ts;
589 opt->is_changed = 1;
592 if (opt->is_changed) {
593 opt->is_changed = 0;
600 struct ip_options *opt = &(IPCB(skb)->opt);
604 unsigned char *optptr = skb_network_header(skb) + opt->srr;
616 if (!opt->is_strictroute)
626 icmp_send(skb, ICMP_PARAMETERPROB, 0, htonl((opt->srr+2)<<24));
645 opt->is_changed = 1;
648 opt->srr_is_hit = 1;
649 opt->nexthop = nexthop;
650 opt->is_changed = 1;