@@ -1546,8 +1546,8 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
1546
1546
unsigned long now = jiffies ;
1547
1547
struct net_device * dev ;
1548
1548
struct xfrm_mode * inner_mode ;
1549
- struct dst_entry * dst_prev = NULL ;
1550
- struct dst_entry * dst0 = NULL ;
1549
+ struct xfrm_dst * xdst_prev = NULL ;
1550
+ struct xfrm_dst * xdst0 = NULL ;
1551
1551
int i = 0 ;
1552
1552
int err ;
1553
1553
int header_len = 0 ;
@@ -1573,13 +1573,13 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
1573
1573
goto put_states ;
1574
1574
}
1575
1575
1576
- if (!dst_prev )
1577
- dst0 = dst1 ;
1576
+ if (!xdst_prev )
1577
+ xdst0 = xdst ;
1578
1578
else
1579
1579
/* Ref count is taken during xfrm_alloc_dst()
1580
1580
* No need to do dst_clone() on dst1
1581
1581
*/
1582
- dst_prev -> child = dst1 ;
1582
+ xfrm_dst_set_child ( xdst_prev , & xdst -> u . dst ) ;
1583
1583
1584
1584
if (xfrm [i ]-> sel .family == AF_UNSPEC ) {
1585
1585
inner_mode = xfrm_ip2inner_mode (xfrm [i ],
@@ -1616,49 +1616,48 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
1616
1616
dst1 -> input = dst_discard ;
1617
1617
dst1 -> output = inner_mode -> afinfo -> output ;
1618
1618
1619
- dst1 -> next = dst_prev ;
1620
- dst_prev = dst1 ;
1619
+ dst1 -> next = & xdst_prev -> u . dst ;
1620
+ xdst_prev = xdst ;
1621
1621
1622
1622
header_len += xfrm [i ]-> props .header_len ;
1623
1623
if (xfrm [i ]-> type -> flags & XFRM_TYPE_NON_FRAGMENT )
1624
1624
nfheader_len += xfrm [i ]-> props .header_len ;
1625
1625
trailer_len += xfrm [i ]-> props .trailer_len ;
1626
1626
}
1627
1627
1628
- dst_prev -> child = dst ;
1629
- dst0 -> path = dst ;
1628
+ xfrm_dst_set_child ( xdst_prev , dst ) ;
1629
+ xdst0 -> u . dst . path = dst ;
1630
1630
1631
1631
err = - ENODEV ;
1632
1632
dev = dst -> dev ;
1633
1633
if (!dev )
1634
1634
goto free_dst ;
1635
1635
1636
- xfrm_init_path (( struct xfrm_dst * ) dst0 , dst , nfheader_len );
1637
- xfrm_init_pmtu (dst_prev );
1636
+ xfrm_init_path (xdst0 , dst , nfheader_len );
1637
+ xfrm_init_pmtu (& xdst_prev -> u . dst );
1638
1638
1639
- for (dst_prev = dst0 ; dst_prev != dst ; dst_prev = xfrm_dst_child (dst_prev )) {
1640
- struct xfrm_dst * xdst = (struct xfrm_dst * )dst_prev ;
1641
-
1642
- err = xfrm_fill_dst (xdst , dev , fl );
1639
+ for (xdst_prev = xdst0 ; xdst_prev != (struct xfrm_dst * )dst ;
1640
+ xdst_prev = (struct xfrm_dst * ) xfrm_dst_child (& xdst_prev -> u .dst )) {
1641
+ err = xfrm_fill_dst (xdst_prev , dev , fl );
1643
1642
if (err )
1644
1643
goto free_dst ;
1645
1644
1646
- dst_prev -> header_len = header_len ;
1647
- dst_prev -> trailer_len = trailer_len ;
1648
- header_len -= xdst -> u .dst .xfrm -> props .header_len ;
1649
- trailer_len -= xdst -> u .dst .xfrm -> props .trailer_len ;
1645
+ xdst_prev -> u . dst . header_len = header_len ;
1646
+ xdst_prev -> u . dst . trailer_len = trailer_len ;
1647
+ header_len -= xdst_prev -> u .dst .xfrm -> props .header_len ;
1648
+ trailer_len -= xdst_prev -> u .dst .xfrm -> props .trailer_len ;
1650
1649
}
1651
1650
1652
1651
out :
1653
- return dst0 ;
1652
+ return & xdst0 -> u . dst ;
1654
1653
1655
1654
put_states :
1656
1655
for (; i < nx ; i ++ )
1657
1656
xfrm_state_put (xfrm [i ]);
1658
1657
free_dst :
1659
- if (dst0 )
1660
- dst_release_immediate (dst0 );
1661
- dst0 = ERR_PTR (err );
1658
+ if (xdst0 )
1659
+ dst_release_immediate (& xdst0 -> u . dst );
1660
+ xdst0 = ERR_PTR (err );
1662
1661
goto out ;
1663
1662
}
1664
1663
@@ -2012,7 +2011,7 @@ static struct xfrm_dst *xfrm_create_dummy_bundle(struct net *net,
2012
2011
dst1 -> output = xdst_queue_output ;
2013
2012
2014
2013
dst_hold (dst );
2015
- dst1 -> child = dst ;
2014
+ xfrm_dst_set_child ( xdst , dst ) ;
2016
2015
dst1 -> path = dst ;
2017
2016
2018
2017
xfrm_init_path ((struct xfrm_dst * )dst1 , dst , 0 );
0 commit comments