Seastar
High performance C++ framework for concurrent servers
ip_checksum.hh
1 /*
2  * This file is open source software, licensed to you under the terms
3  * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4  * distributed with this work for additional information regarding copyright
5  * ownership. You may not use this file except in compliance with the License.
6  *
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing,
12  * software distributed under the License is distributed on an
13  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14  * KIND, either express or implied. See the License for the
15  * specific language governing permissions and limitations
16  * under the License.
17  */
18 /*
19  * Copyright (C) 2014 Cloudius Systems, Ltd.
20  */
21 
22 #pragma once
23 
24 #include <seastar/net/packet.hh>
25 #include <seastar/util/modules.hh>
26 #ifndef SEASTAR_MODULE
27 #include <cstdint>
28 #include <cstddef>
29 #include <arpa/inet.h>
30 #endif
31 
32 namespace seastar {
33 
34 namespace net {
35 
36 uint16_t ip_checksum(const void* data, size_t len);
37 
38 struct checksummer {
39  __int128 csum = 0;
40  bool odd = false;
41  void sum(const char* data, size_t len);
42  void sum(const packet& p);
43  void sum(uint8_t data) {
44  if (!odd) {
45  csum += data << 8;
46  } else {
47  csum += data;
48  }
49  odd = !odd;
50  }
51  void sum(uint16_t data) {
52  if (odd) {
53  sum(uint8_t(data >> 8));
54  sum(uint8_t(data));
55  } else {
56  csum += data;
57  }
58  }
59  void sum(uint32_t data) {
60  if (odd) {
61  sum(uint16_t(data));
62  sum(uint16_t(data >> 16));
63  } else {
64  csum += data;
65  }
66  }
67  void sum_many() {}
68  template <typename T0, typename... T>
69  void sum_many(T0 data, T... rest) {
70  sum(data);
71  sum_many(rest...);
72  }
73  uint16_t get() const;
74 };
75 
76 }
77 
78 }
79 
Definition: packet.hh:87
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: ip_checksum.hh:38