Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 34599
b: refs/heads/master
c: 58c949d
h: refs/heads/master
i:
  34597: 368d993
  34595: 68fe1d0
  34591: 4095a9b
v: v3
  • Loading branch information
Masahide NAKAMURA authored and David S. Miller committed Sep 22, 2006
1 parent 7418a95 commit 9ed8ddb
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f7b6983f0feeefcd2a594138adcffe640593d8de
refs/heads/master: 58c949d1b9551f3e4ba9dde4aeda341ecf5e42b5
97 changes: 97 additions & 0 deletions trunk/net/ipv6/xfrm6_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,109 @@ __xfrm6_find_acq(u8 mode, u32 reqid, u8 proto,
return x0;
}

static int
__xfrm6_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n)
{
int i;
int j = 0;

/* Rule 1: select IPsec transport except AH */
for (i = 0; i < n; i++) {
if (src[i]->props.mode == XFRM_MODE_TRANSPORT &&
src[i]->id.proto != IPPROTO_AH) {
dst[j++] = src[i];
src[i] = NULL;
}
}
if (j == n)
goto end;

/* XXX: Rule 2: select MIPv6 RO or inbound trigger */

/* Rule 3: select IPsec transport AH */
for (i = 0; i < n; i++) {
if (src[i] &&
src[i]->props.mode == XFRM_MODE_TRANSPORT &&
src[i]->id.proto == IPPROTO_AH) {
dst[j++] = src[i];
src[i] = NULL;
}
}
if (j == n)
goto end;

/* Rule 4: select IPsec tunnel */
for (i = 0; i < n; i++) {
if (src[i] &&
src[i]->props.mode == XFRM_MODE_TUNNEL) {
dst[j++] = src[i];
src[i] = NULL;
}
}
if (likely(j == n))
goto end;

/* Final rule */
for (i = 0; i < n; i++) {
if (src[i]) {
dst[j++] = src[i];
src[i] = NULL;
}
}

end:
return 0;
}

static int
__xfrm6_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n)
{
int i;
int j = 0;

/* Rule 1: select IPsec transport */
for (i = 0; i < n; i++) {
if (src[i]->mode == XFRM_MODE_TRANSPORT) {
dst[j++] = src[i];
src[i] = NULL;
}
}
if (j == n)
goto end;

/* XXX: Rule 2: select MIPv6 RO or inbound trigger */

/* Rule 3: select IPsec tunnel */
for (i = 0; i < n; i++) {
if (src[i] &&
src[i]->mode == XFRM_MODE_TUNNEL) {
dst[j++] = src[i];
src[i] = NULL;
}
}
if (likely(j == n))
goto end;

/* Final rule */
for (i = 0; i < n; i++) {
if (src[i]) {
dst[j++] = src[i];
src[i] = NULL;
}
}

end:
return 0;
}

static struct xfrm_state_afinfo xfrm6_state_afinfo = {
.family = AF_INET6,
.init_tempsel = __xfrm6_init_tempsel,
.state_lookup = __xfrm6_state_lookup,
.state_lookup_byaddr = __xfrm6_state_lookup_byaddr,
.find_acq = __xfrm6_find_acq,
.tmpl_sort = __xfrm6_tmpl_sort,
.state_sort = __xfrm6_state_sort,
};

void __init xfrm6_state_init(void)
Expand Down

0 comments on commit 9ed8ddb

Please sign in to comment.