compat_policy.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package nftables
  2. import (
  3. "fmt"
  4. "github.com/google/nftables/expr"
  5. "golang.org/x/sys/unix"
  6. )
  7. const nft_RULE_COMPAT_F_INV uint32 = (1 << 1)
  8. const nft_RULE_COMPAT_F_MASK uint32 = nft_RULE_COMPAT_F_INV
  9. // Used by xt match or target like xt_tcpudp to set compat policy between xtables and nftables
  10. // https://elixir.bootlin.com/linux/v5.12/source/net/netfilter/nft_compat.c#L187
  11. type compatPolicy struct {
  12. Proto uint32
  13. Flag uint32
  14. }
  15. var xtMatchCompatMap map[string]*compatPolicy = map[string]*compatPolicy{
  16. "tcp": {
  17. Proto: unix.IPPROTO_TCP,
  18. },
  19. "udp": {
  20. Proto: unix.IPPROTO_UDP,
  21. },
  22. "udplite": {
  23. Proto: unix.IPPROTO_UDPLITE,
  24. },
  25. "tcpmss": {
  26. Proto: unix.IPPROTO_TCP,
  27. },
  28. "sctp": {
  29. Proto: unix.IPPROTO_SCTP,
  30. },
  31. "osf": {
  32. Proto: unix.IPPROTO_TCP,
  33. },
  34. "ipcomp": {
  35. Proto: unix.IPPROTO_COMP,
  36. },
  37. "esp": {
  38. Proto: unix.IPPROTO_ESP,
  39. },
  40. }
  41. var xtTargetCompatMap map[string]*compatPolicy = map[string]*compatPolicy{
  42. "TCPOPTSTRIP": {
  43. Proto: unix.IPPROTO_TCP,
  44. },
  45. "TCPMSS": {
  46. Proto: unix.IPPROTO_TCP,
  47. },
  48. }
  49. func getCompatPolicy(exprs []expr.Any) (*compatPolicy, error) {
  50. var exprItem expr.Any
  51. var compat *compatPolicy
  52. for _, iter := range exprs {
  53. var tmpExprItem expr.Any
  54. var tmpCompat *compatPolicy
  55. switch item := iter.(type) {
  56. case *expr.Match:
  57. if compat, ok := xtMatchCompatMap[item.Name]; ok {
  58. tmpCompat = compat
  59. tmpExprItem = item
  60. } else {
  61. continue
  62. }
  63. case *expr.Target:
  64. if compat, ok := xtTargetCompatMap[item.Name]; ok {
  65. tmpCompat = compat
  66. tmpExprItem = item
  67. } else {
  68. continue
  69. }
  70. default:
  71. continue
  72. }
  73. if compat == nil {
  74. compat = tmpCompat
  75. exprItem = tmpExprItem
  76. } else if *compat != *tmpCompat {
  77. return nil, fmt.Errorf("%#v and %#v has conflict compat policy %#v vs %#v", exprItem, tmpExprItem, compat, tmpCompat)
  78. }
  79. }
  80. return compat, nil
  81. }