Skip to content

Commit 8b05c6b

Browse files
ChinmayaSharma-hueaboch
authored andcommitted
Added PCPU and SA fields to XfrmState
1 parent 1f910b7 commit 8b05c6b

File tree

4 files changed

+106
-6
lines changed

4 files changed

+106
-6
lines changed

nl/xfrm_linux.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,14 @@ const (
7878
XFRMA_PROTO /* __u8 */
7979
XFRMA_ADDRESS_FILTER /* struct xfrm_address_filter */
8080
XFRMA_PAD
81-
XFRMA_OFFLOAD_DEV /* struct xfrm_state_offload */
82-
XFRMA_SET_MARK /* __u32 */
83-
XFRMA_SET_MARK_MASK /* __u32 */
84-
XFRMA_IF_ID /* __u32 */
81+
XFRMA_OFFLOAD_DEV /* struct xfrm_state_offload */
82+
XFRMA_SET_MARK /* __u32 */
83+
XFRMA_SET_MARK_MASK /* __u32 */
84+
XFRMA_IF_ID /* __u32 */
85+
XFRMA_MTIMER_THRESH /* __u32 in seconds for input SA */
86+
XFRMA_SA_DIR /* __u8 */
87+
XFRMA_NAT_KEEPALIVE_INTERVAL /* __u32 in seconds for NAT keepalive */
88+
XFRMA_SA_PCPU /* __u32 */
8589

8690
XFRMA_MAX = iota - 1
8791
)

xfrm_linux.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ const (
4848
XFRM_MODE_MAX
4949
)
5050

51+
// SADir is an enum representing an ipsec template direction.
52+
type SADir uint8
53+
54+
const (
55+
XFRM_SA_DIR_IN SADir = iota + 1
56+
XFRM_SA_DIR_OUT
57+
)
58+
5159
func (m Mode) String() string {
5260
switch m {
5361
case XFRM_MODE_TRANSPORT:

xfrm_state_linux.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ type XfrmState struct {
113113
Statistics XfrmStateStats
114114
Mark *XfrmMark
115115
OutputMark *XfrmMark
116+
SADir SADir
116117
Ifid int
118+
Pcpunum *uint32
117119
Auth *XfrmStateAlgo
118120
Crypt *XfrmStateAlgo
119121
Aead *XfrmStateAlgo
@@ -126,8 +128,8 @@ type XfrmState struct {
126128
}
127129

128130
func (sa XfrmState) String() string {
129-
return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, OutputMark: %v, Ifid: %d, Auth: %v, Crypt: %v, Aead: %v, Encap: %v, ESN: %t, DontEncapDSCP: %t, OSeqMayWrap: %t, Replay: %v",
130-
sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.OutputMark, sa.Ifid, sa.Auth, sa.Crypt, sa.Aead, sa.Encap, sa.ESN, sa.DontEncapDSCP, sa.OSeqMayWrap, sa.Replay)
131+
return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, OutputMark: %v, SADir: %d, Ifid: %d, Pcpunum: %d, Auth: %v, Crypt: %v, Aead: %v, Encap: %v, ESN: %t, DontEncapDSCP: %t, OSeqMayWrap: %t, Replay: %v",
132+
sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.OutputMark, sa.SADir, sa.Ifid, *sa.Pcpunum, sa.Auth, sa.Crypt, sa.Aead, sa.Encap, sa.ESN, sa.DontEncapDSCP, sa.OSeqMayWrap, sa.Replay)
131133
}
132134
func (sa XfrmState) Print(stats bool) string {
133135
if !stats {
@@ -333,11 +335,21 @@ func (h *Handle) xfrmStateAddOrUpdate(state *XfrmState, nlProto int) error {
333335
req.AddData(out)
334336
}
335337

338+
if state.SADir != 0 {
339+
saDir := nl.NewRtAttr(nl.XFRMA_SA_DIR, nl.Uint8Attr(uint8(state.SADir)))
340+
req.AddData(saDir)
341+
}
342+
336343
if state.Ifid != 0 {
337344
ifId := nl.NewRtAttr(nl.XFRMA_IF_ID, nl.Uint32Attr(uint32(state.Ifid)))
338345
req.AddData(ifId)
339346
}
340347

348+
if state.Pcpunum != nil {
349+
pcpuNum := nl.NewRtAttr(nl.XFRMA_SA_PCPU, nl.Uint32Attr(uint32(*state.Pcpunum)))
350+
req.AddData(pcpuNum)
351+
}
352+
341353
_, err := req.Execute(unix.NETLINK_XFRM, 0)
342354
return err
343355
}
@@ -459,6 +471,11 @@ func (h *Handle) xfrmStateGetOrDelete(state *XfrmState, nlProto int) (*XfrmState
459471
req.AddData(ifId)
460472
}
461473

474+
if state.Pcpunum != nil {
475+
pcpuNum := nl.NewRtAttr(nl.XFRMA_SA_PCPU, nl.Uint32Attr(uint32(*state.Pcpunum)))
476+
req.AddData(pcpuNum)
477+
}
478+
462479
resType := nl.XFRM_MSG_NEWSA
463480
if nlProto == nl.XFRM_MSG_DELSA {
464481
resType = 0
@@ -581,8 +598,13 @@ func parseXfrmState(m []byte, family int) (*XfrmState, error) {
581598
if state.OutputMark.Mask == 0xffffffff {
582599
state.OutputMark.Mask = 0
583600
}
601+
case nl.XFRMA_SA_DIR:
602+
state.SADir = SADir(attr.Value[0])
584603
case nl.XFRMA_IF_ID:
585604
state.Ifid = int(native.Uint32(attr.Value))
605+
case nl.XFRMA_SA_PCPU:
606+
pcpuNum := native.Uint32(attr.Value)
607+
state.Pcpunum = &pcpuNum
586608
case nl.XFRMA_REPLAY_VAL:
587609
if state.Replay == nil {
588610
state.Replay = new(XfrmReplayState)

xfrm_state_linux_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,72 @@ func TestXfrmStateWithIfid(t *testing.T) {
225225
}
226226
}
227227

228+
func TestXfrmStateWithSADir(t *testing.T) {
229+
minKernelRequired(t, 4, 19)
230+
defer setUpNetlinkTest(t)()
231+
232+
state := getBaseState()
233+
state.SADir = XFRM_SA_DIR_IN
234+
if err := XfrmStateAdd(state); err != nil {
235+
t.Fatal(err)
236+
}
237+
s, err := XfrmStateGet(state)
238+
if err != nil {
239+
t.Fatal(err)
240+
}
241+
if !compareStates(state, s) {
242+
t.Fatalf("unexpected state returned.\nExpected: %v.\nGot %v", state, s)
243+
}
244+
if err = XfrmStateDel(s); err != nil {
245+
t.Fatal(err)
246+
}
247+
}
248+
249+
func TestXfrmStateWithPcpunumWithoutSADir(t *testing.T) {
250+
minKernelRequired(t, 4, 19)
251+
defer setUpNetlinkTest(t)()
252+
253+
state := getBaseState()
254+
pcpuNum := uint32(1)
255+
state.Pcpunum = &pcpuNum
256+
if err := XfrmStateAdd(state); err != nil {
257+
t.Fatal(err)
258+
}
259+
s, err := XfrmStateGet(state)
260+
if err != nil {
261+
t.Fatal(err)
262+
}
263+
if !compareStates(state, s) {
264+
t.Fatalf("unexpected state returned.\nExpected: %v.\nGot %v", state, s)
265+
}
266+
if err = XfrmStateDel(s); err != nil {
267+
t.Fatal(err)
268+
}
269+
}
270+
271+
func TestXfrmStateWithPcpunumWithSADir(t *testing.T) {
272+
minKernelRequired(t, 4, 19)
273+
defer setUpNetlinkTest(t)()
274+
275+
state := getBaseState()
276+
state.SADir = XFRM_SA_DIR_IN
277+
pcpuNum := uint32(1)
278+
state.Pcpunum = &pcpuNum
279+
if err := XfrmStateAdd(state); err != nil {
280+
t.Fatal(err)
281+
}
282+
s, err := XfrmStateGet(state)
283+
if err != nil {
284+
t.Fatal(err)
285+
}
286+
if !compareStates(state, s) {
287+
t.Fatalf("unexpected state returned.\nExpected: %v.\nGot %v", state, s)
288+
}
289+
if err = XfrmStateDel(s); err != nil {
290+
t.Fatal(err)
291+
}
292+
}
293+
228294
func TestXfrmStateWithOutputMark(t *testing.T) {
229295
minKernelRequired(t, 4, 14)
230296
defer setUpNetlinkTest(t)()

0 commit comments

Comments
 (0)