55
55
#define IFLA_MACVLAN_FLAGS 2
56
56
#endif
57
57
58
+ enum {
59
+ IFLA_IPTUN_UNSPEC ,
60
+ IFLA_IPTUN_LINK ,
61
+ IFLA_IPTUN_LOCAL ,
62
+ IFLA_IPTUN_REMOTE ,
63
+ IFLA_IPTUN_TTL ,
64
+ IFLA_IPTUN_TOS ,
65
+ IFLA_IPTUN_ENCAP_LIMIT ,
66
+ IFLA_IPTUN_FLOWINFO ,
67
+ IFLA_IPTUN_FLAGS ,
68
+ IFLA_IPTUN_PROTO ,
69
+ IFLA_IPTUN_PMTUDISC ,
70
+ IFLA_IPTUN_6RD_PREFIX ,
71
+ IFLA_IPTUN_6RD_RELAY_PREFIX ,
72
+ IFLA_IPTUN_6RD_PREFIXLEN ,
73
+ IFLA_IPTUN_6RD_RELAY_PREFIXLEN ,
74
+ IFLA_IPTUN_ENCAP_TYPE ,
75
+ IFLA_IPTUN_ENCAP_FLAGS ,
76
+ IFLA_IPTUN_ENCAP_SPORT ,
77
+ IFLA_IPTUN_ENCAP_DPORT ,
78
+ __IFLA_IPTUN_MAX ,
79
+ };
80
+ #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
81
+
58
82
static int ns_sysfs_fd = -1 ;
59
83
60
84
int read_ns_sys_file (char * path , char * buf , int len )
@@ -658,8 +682,108 @@ static int dump_one_gre(struct ifinfomsg *ifi, char *kind,
658
682
return dump_unknown_device (ifi , kind , tb , ns , fds );
659
683
}
660
684
685
+ static int dump_sit (NetDeviceEntry * nde , struct cr_imgset * imgset , struct nlattr * * info )
686
+ {
687
+ int ret ;
688
+ struct nlattr * data [__IFLA_IPTUN_MAX ];
689
+ SitEntry se = SIT_ENTRY__INIT ;
690
+ /* There are for IP(v6) addresses kernel feeds to us */
691
+ uint32_t a_local , a_remote , rd_prefix [4 ], rl_prefix ;
692
+
693
+ if (!info || !info [IFLA_INFO_DATA ]) {
694
+ pr_err ("no data for sit\n" );
695
+ return -1 ;
696
+ }
697
+
698
+ pr_info ("Some data for SIT provided\n" );
699
+ ret = nla_parse_nested (data , IFLA_IPTUN_MAX , info [IFLA_INFO_DATA ], NULL );
700
+ if (ret < 0 ) {
701
+ pr_err ("failed ot parse sit data\n" );
702
+ return -1 ;
703
+ }
704
+
705
+ #define ENCODE_ENTRY (__type , __ifla , __proto ) do { \
706
+ if (data[__ifla]) { \
707
+ se.__proto = *(__type *)nla_data(data[__ifla]); \
708
+ if (se.__proto) \
709
+ se.has_##__proto = true; \
710
+ } \
711
+ } while (0)
712
+
713
+ if (data [IFLA_IPTUN_LOCAL ]) {
714
+ a_local = * (u32 * )nla_data (data [IFLA_IPTUN_LOCAL ]);
715
+ if (a_local != 0 ) {
716
+ se .n_local = 1 ;
717
+ se .local = & a_local ;
718
+ }
719
+ }
720
+
721
+ if (data [IFLA_IPTUN_REMOTE ]) {
722
+ a_remote = * (u32 * )nla_data (data [IFLA_IPTUN_REMOTE ]);
723
+ if (a_remote != 0 ) {
724
+ se .n_remote = 1 ;
725
+ se .remote = & a_remote ;
726
+ }
727
+ }
728
+
729
+ ENCODE_ENTRY (u32 , IFLA_IPTUN_LINK , link );
730
+ ENCODE_ENTRY (u8 , IFLA_IPTUN_TTL , ttl );
731
+ ENCODE_ENTRY (u8 , IFLA_IPTUN_TOS , tos );
732
+ ENCODE_ENTRY (u16 , IFLA_IPTUN_FLAGS , flags );
733
+ ENCODE_ENTRY (u8 , IFLA_IPTUN_PROTO , proto );
734
+
735
+ if (data [IFLA_IPTUN_PMTUDISC ]) {
736
+ u8 v ;
737
+
738
+ v = * (u8 * )nla_data (data [IFLA_IPTUN_PMTUDISC ]);
739
+ if (v )
740
+ se .pmtudisc = se .has_pmtudisc = true;
741
+ }
742
+
743
+ ENCODE_ENTRY (u16 , IFLA_IPTUN_ENCAP_TYPE , encap_type );
744
+ ENCODE_ENTRY (u16 , IFLA_IPTUN_ENCAP_FLAGS , encap_flags );
745
+ ENCODE_ENTRY (u16 , IFLA_IPTUN_ENCAP_SPORT , encap_sport );
746
+ ENCODE_ENTRY (u16 , IFLA_IPTUN_ENCAP_DPORT , encap_dport );
747
+
748
+ if (data [IFLA_IPTUN_6RD_PREFIXLEN ]) {
749
+ se .rd_prefixlen = * (u16 * )nla_data (data [IFLA_IPTUN_6RD_PREFIXLEN ]);
750
+ if (!se .rd_prefixlen )
751
+ goto skip ;
752
+
753
+ if (!data [IFLA_IPTUN_6RD_PREFIX ]) {
754
+ pr_err ("No 6rd prefix for sit device\n" );
755
+ return -1 ;
756
+ }
757
+
758
+ se .has_rd_prefixlen = true;
759
+ memcpy (& rd_prefix , nla_data (data [IFLA_IPTUN_6RD_PREFIX ]), sizeof (rd_prefix ));
760
+ se .n_rd_prefix = 4 ;
761
+ se .rd_prefix = rd_prefix ;
762
+
763
+ se .relay_prefixlen = * (u16 * )nla_data (data [IFLA_IPTUN_6RD_RELAY_PREFIXLEN ]);
764
+ if (!se .relay_prefixlen )
765
+ goto skip ;
766
+
767
+ if (!data [IFLA_IPTUN_6RD_RELAY_PREFIX ]) {
768
+ pr_err ("No 6rd relay prefix for sit device\n" );
769
+ return -1 ;
770
+ }
771
+
772
+ se .has_relay_prefixlen = true;
773
+ memcpy (& rl_prefix , nla_data (data [IFLA_IPTUN_6RD_RELAY_PREFIX ]), sizeof (rl_prefix ));
774
+ se .n_relay_prefix = 1 ;
775
+ se .relay_prefix = & rl_prefix ;
776
+ skip :;
777
+ }
778
+
779
+ #undef ENCODE_ENTRY
780
+
781
+ nde -> sit = & se ;
782
+ return write_netdev_img (nde , imgset , info );
783
+ }
784
+
661
785
static int dump_one_sit (struct ifinfomsg * ifi , char * kind ,
662
- struct nlattr * * tb , struct cr_imgset * fds )
786
+ struct nlattr * * tb , struct ns_id * ns , struct cr_imgset * fds )
663
787
{
664
788
char * name ;
665
789
@@ -679,8 +803,7 @@ static int dump_one_sit(struct ifinfomsg *ifi, char *kind,
679
803
return 0 ;
680
804
}
681
805
682
- pr_warn ("SIT device %s not supported natively\n" , name );
683
- return dump_unknown_device (ifi , kind , tb , fds );
806
+ return dump_one_netdev (ND_TYPE__SIT , ifi , tb , ns , fds , dump_sit );
684
807
}
685
808
686
809
static int list_one_link (struct nlmsghdr * hdr , struct ns_id * ns , void * arg )
@@ -727,7 +850,7 @@ static int dump_one_link(struct nlmsghdr *hdr, struct ns_id *ns, void *arg)
727
850
ret = dump_one_gre (ifi , kind , tb , ns , fds );
728
851
break ;
729
852
case ARPHRD_SIT :
730
- ret = dump_one_sit (ifi , kind , tb , fds );
853
+ ret = dump_one_sit (ifi , kind , tb , ns , fds );
731
854
break ;
732
855
default :
733
856
unk :
0 commit comments