Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv6: ioam: move the check for undefined bits

The check for undefined bits in the trace type is moved from the input side to
the output side, while the input side is relaxed and now inserts default empty
values when an undefined bit is set.

Signed-off-by: Justin Iurman <justin.iurman@uliege.be>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Justin Iurman and committed by
David S. Miller
2bbc977c ef1100ef

+67 -9
+62 -8
net/ipv6/ioam6.c
··· 770 770 data += sizeof(__be32); 771 771 } 772 772 773 + /* bit12 undefined: filled with empty value */ 774 + if (trace->type.bit12) { 775 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 776 + data += sizeof(__be32); 777 + } 778 + 779 + /* bit13 undefined: filled with empty value */ 780 + if (trace->type.bit13) { 781 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 782 + data += sizeof(__be32); 783 + } 784 + 785 + /* bit14 undefined: filled with empty value */ 786 + if (trace->type.bit14) { 787 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 788 + data += sizeof(__be32); 789 + } 790 + 791 + /* bit15 undefined: filled with empty value */ 792 + if (trace->type.bit15) { 793 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 794 + data += sizeof(__be32); 795 + } 796 + 797 + /* bit16 undefined: filled with empty value */ 798 + if (trace->type.bit16) { 799 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 800 + data += sizeof(__be32); 801 + } 802 + 803 + /* bit17 undefined: filled with empty value */ 804 + if (trace->type.bit17) { 805 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 806 + data += sizeof(__be32); 807 + } 808 + 809 + /* bit18 undefined: filled with empty value */ 810 + if (trace->type.bit18) { 811 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 812 + data += sizeof(__be32); 813 + } 814 + 815 + /* bit19 undefined: filled with empty value */ 816 + if (trace->type.bit19) { 817 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 818 + data += sizeof(__be32); 819 + } 820 + 821 + /* bit20 undefined: filled with empty value */ 822 + if (trace->type.bit20) { 823 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 824 + data += sizeof(__be32); 825 + } 826 + 827 + /* bit21 undefined: filled with empty value */ 828 + if (trace->type.bit21) { 829 + *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE); 830 + data += sizeof(__be32); 831 + } 832 + 773 833 /* opaque state snapshot */ 774 834 if (trace->type.bit22) { 775 835 if (!sc) { ··· 851 791 struct ioam6_schema *sc; 852 792 u8 sclen = 0; 853 793 854 - /* Skip if Overflow flag is set OR 855 - * if an unknown type (bit 12-21) is set 794 + /* Skip if Overflow flag is set 856 795 */ 857 - if (trace->overflow || 858 - trace->type.bit12 | trace->type.bit13 | trace->type.bit14 | 859 - trace->type.bit15 | trace->type.bit16 | trace->type.bit17 | 860 - trace->type.bit18 | trace->type.bit19 | trace->type.bit20 | 861 - trace->type.bit21) { 796 + if (trace->overflow) 862 797 return; 863 - } 864 798 865 799 /* NodeLen does not include Opaque State Snapshot length. We need to 866 800 * take it into account if the corresponding bit is set (bit 22) and
+5 -1
net/ipv6/ioam6_iptunnel.c
··· 75 75 u32 fields; 76 76 77 77 if (!trace->type_be32 || !trace->remlen || 78 - trace->remlen > IOAM6_TRACE_DATA_SIZE_MAX / 4) 78 + trace->remlen > IOAM6_TRACE_DATA_SIZE_MAX / 4 || 79 + trace->type.bit12 | trace->type.bit13 | trace->type.bit14 | 80 + trace->type.bit15 | trace->type.bit16 | trace->type.bit17 | 81 + trace->type.bit18 | trace->type.bit19 | trace->type.bit20 | 82 + trace->type.bit21) 79 83 return false; 80 84 81 85 trace->nodelen = 0;