pub struct SomeIpHeader {
pub service_id: ServiceId,
pub method_id: MethodId,
pub length: u32,
pub client_id: ClientId,
pub session_id: SessionId,
pub protocol_version: u8,
pub interface_version: u8,
pub message_type: MessageType,
pub return_code: ReturnCode,
}Expand description
SOME/IP message header (16 bytes).
+----------------+----------------+----------------+----------------+
| Message ID (32 bits) |
| Service ID (16 bits) | Method ID (16 bits) |
+----------------+----------------+----------------+----------------+
| Length (32 bits) - payload length + 8 |
+----------------+----------------+----------------+----------------+
| Request ID (32 bits) |
| Client ID (16 bits) | Session ID (16 bits) |
+----------------+----------------+----------------+----------------+
| Protocol Ver | Interface Ver | Message Type | Return Code |
| (8 bits) | (8 bits) | (8 bits) | (8 bits) |
+----------------+----------------+----------------+----------------+Fields§
§service_id: ServiceIdService ID.
method_id: MethodIdMethod ID.
length: u32Length of payload + 8 bytes (client_id, session_id, protocol_version, interface_version, message_type, return_code).
client_id: ClientIdClient ID.
session_id: SessionIdSession ID.
protocol_version: u8Protocol version (should be 0x01).
interface_version: u8Interface version.
message_type: MessageTypeMessage type.
return_code: ReturnCodeReturn code.
Implementations§
Source§impl SomeIpHeader
impl SomeIpHeader
Sourcepub fn new(service_id: ServiceId, method_id: MethodId) -> Self
pub fn new(service_id: ServiceId, method_id: MethodId) -> Self
Create a new header with the given service and method IDs.
Examples found in repository?
examples/message_basics.rs (line 59)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn request_no_return(service_id: ServiceId, method_id: MethodId) -> Self
pub fn request_no_return(service_id: ServiceId, method_id: MethodId) -> Self
Create a request-no-return header.
Sourcepub fn notification(service_id: ServiceId, method_id: MethodId) -> Self
pub fn notification(service_id: ServiceId, method_id: MethodId) -> Self
Create a notification header.
Sourcepub fn response_from(request: &Self) -> Self
pub fn response_from(request: &Self) -> Self
Create a response header from a request header.
Sourcepub fn error_from(request: &Self, return_code: ReturnCode) -> Self
pub fn error_from(request: &Self, return_code: ReturnCode) -> Self
Create an error response header from a request header.
Sourcepub fn payload_length(&self) -> u32
pub fn payload_length(&self) -> u32
Get the payload length (length field minus 8).
Sourcepub fn set_payload_length(&mut self, payload_len: u32)
pub fn set_payload_length(&mut self, payload_len: u32)
Set the payload length (updates length field to payload_len + 8).
Sourcepub fn from_bytes(data: &[u8]) -> Result<Self>
pub fn from_bytes(data: &[u8]) -> Result<Self>
Parse a header from bytes.
Sourcepub fn message_id(&self) -> u32
pub fn message_id(&self) -> u32
Get the message ID (service_id << 16 | method_id).
Examples found in repository?
examples/message_basics.rs (line 62)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Sourcepub fn request_id(&self) -> u32
pub fn request_id(&self) -> u32
Get the request ID (client_id << 16 | session_id).
Examples found in repository?
examples/message_basics.rs (line 63)
13fn main() {
14 println!("=== SOME/IP Message Basics ===\n");
15
16 // Example 1: Create a request message using the builder
17 println!("--- Example 1: Building Messages ---");
18 let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19 .client_id(ClientId(0x0100))
20 .session_id(SessionId(0x0001))
21 .interface_version(2)
22 .payload(b"Hello, World!".as_slice())
23 .build();
24
25 println!("Request message:");
26 print_message(&request);
27
28 // Example 2: Create a response from the request
29 println!("\n--- Example 2: Creating Responses ---");
30 let response = request
31 .create_response()
32 .payload(b"Response data".as_slice())
33 .build();
34
35 println!("Response message:");
36 print_message(&response);
37
38 // Example 3: Create an error response
39 println!("\n--- Example 3: Error Response ---");
40 let error = request
41 .create_error_response(ReturnCode::UnknownMethod)
42 .build();
43
44 println!("Error response:");
45 print_message(&error);
46
47 // Example 4: Serialize and deserialize
48 println!("\n--- Example 4: Serialization ---");
49 let bytes = request.to_bytes();
50 println!("Serialized to {} bytes", bytes.len());
51 println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52 println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54 let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55 println!("\nParsed message matches original: {}", parsed == request);
56
57 // Example 5: Working with headers directly
58 println!("\n--- Example 5: Header Details ---");
59 let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60 println!("Service ID: {}", header.service_id);
61 println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62 println!("Message ID: 0x{:08X}", header.message_id());
63 println!("Request ID: 0x{:08X}", header.request_id());
64
65 // Example 6: Different message types
66 println!("\n--- Example 6: Message Types ---");
67
68 let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69 .payload(b"Event data".as_slice())
70 .build();
71 println!("Notification: type={:?}, method_id={} (is_event: {})",
72 notification.header.message_type,
73 notification.header.method_id,
74 notification.header.method_id.is_event()
75 );
76
77 let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78 .payload(b"Fire and forget".as_slice())
79 .build();
80 println!("Fire-and-forget: type={:?}, expects_response: {}",
81 fire_and_forget.header.message_type,
82 fire_and_forget.expects_response()
83 );
84
85 // Example 7: Return codes
86 println!("\n--- Example 7: Return Codes ---");
87 for code in [
88 ReturnCode::Ok,
89 ReturnCode::NotOk,
90 ReturnCode::UnknownService,
91 ReturnCode::UnknownMethod,
92 ReturnCode::Timeout,
93 ] {
94 println!(" {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95 }
96
97 println!("\n=== Done! ===");
98}Trait Implementations§
Source§impl Clone for SomeIpHeader
impl Clone for SomeIpHeader
Source§fn clone(&self) -> SomeIpHeader
fn clone(&self) -> SomeIpHeader
Returns a duplicate of the value. Read more
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for SomeIpHeader
impl Debug for SomeIpHeader
Source§impl Default for SomeIpHeader
impl Default for SomeIpHeader
Source§impl PartialEq for SomeIpHeader
impl PartialEq for SomeIpHeader
impl Eq for SomeIpHeader
impl StructuralPartialEq for SomeIpHeader
Auto Trait Implementations§
impl Freeze for SomeIpHeader
impl RefUnwindSafe for SomeIpHeader
impl Send for SomeIpHeader
impl Sync for SomeIpHeader
impl Unpin for SomeIpHeader
impl UnwindSafe for SomeIpHeader
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
🔬This is a nightly-only experimental API. (
clone_to_uninit)