forked from microsoft/WSL2-Linux-Kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ipv6: implement dataplane support for rthdr type 4 (Segment Routing H…
…eader) Implement minimal support for processing of SR-enabled packets as described in https://tools.ietf.org/html/draft-ietf-6man-segment-routing-header-02. This patch implements the following operations: - Intermediate segment endpoint: incrementation of active segment and rerouting. - Egress for SR-encapsulated packets: decapsulation of outer IPv6 header + SRH and routing of inner packet. - Cleanup flag support for SR-inlined packets: removal of SRH if we are the penultimate segment endpoint. A per-interface sysctl seg6_enabled is provided, to accept/deny SR-enabled packets. Default is deny. This patch does not provide support for HMAC-signed packets. Signed-off-by: David Lebrun <david.lebrun@uclouvain.be> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
7 changed files
with
284 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#ifndef _LINUX_SEG6_H | ||
#define _LINUX_SEG6_H | ||
|
||
#include <uapi/linux/seg6.h> | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* SR-IPv6 implementation | ||
* | ||
* Author: | ||
* David Lebrun <david.lebrun@uclouvain.be> | ||
* | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#ifndef _NET_SEG6_H | ||
#define _NET_SEG6_H | ||
|
||
static inline void update_csum_diff4(struct sk_buff *skb, __be32 from, | ||
__be32 to) | ||
{ | ||
__be32 diff[] = { ~from, to }; | ||
|
||
skb->csum = ~csum_partial((char *)diff, sizeof(diff), ~skb->csum); | ||
} | ||
|
||
static inline void update_csum_diff16(struct sk_buff *skb, __be32 *from, | ||
__be32 *to) | ||
{ | ||
__be32 diff[] = { | ||
~from[0], ~from[1], ~from[2], ~from[3], | ||
to[0], to[1], to[2], to[3], | ||
}; | ||
|
||
skb->csum = ~csum_partial((char *)diff, sizeof(diff), ~skb->csum); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* SR-IPv6 implementation | ||
* | ||
* Author: | ||
* David Lebrun <david.lebrun@uclouvain.be> | ||
* | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#ifndef _UAPI_LINUX_SEG6_H | ||
#define _UAPI_LINUX_SEG6_H | ||
|
||
/* | ||
* SRH | ||
*/ | ||
struct ipv6_sr_hdr { | ||
__u8 nexthdr; | ||
__u8 hdrlen; | ||
__u8 type; | ||
__u8 segments_left; | ||
__u8 first_segment; | ||
__u8 flag_1; | ||
__u8 flag_2; | ||
__u8 reserved; | ||
|
||
struct in6_addr segments[0]; | ||
}; | ||
|
||
#define SR6_FLAG1_CLEANUP (1 << 7) | ||
#define SR6_FLAG1_PROTECTED (1 << 6) | ||
#define SR6_FLAG1_OAM (1 << 5) | ||
#define SR6_FLAG1_ALERT (1 << 4) | ||
#define SR6_FLAG1_HMAC (1 << 3) | ||
|
||
#define SR6_TLV_INGRESS 1 | ||
#define SR6_TLV_EGRESS 2 | ||
#define SR6_TLV_OPAQUE 3 | ||
#define SR6_TLV_PADDING 4 | ||
#define SR6_TLV_HMAC 5 | ||
|
||
#define sr_has_cleanup(srh) ((srh)->flag_1 & SR6_FLAG1_CLEANUP) | ||
#define sr_has_hmac(srh) ((srh)->flag_1 & SR6_FLAG1_HMAC) | ||
|
||
struct sr6_tlv { | ||
__u8 type; | ||
__u8 len; | ||
__u8 data[0]; | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters