Posts
4631
Following
317
Followers
482
Linux kernel hacker and maintainer etc.

OpenPGP: 3AB05486C7752FE1

Jarkko Sakkinen

Edited 1 year ago

I think I fixup lookup tables for escaping #zmodem traffic by intercepting traffic from lrzsz with “defacto” parameters, i.e. send large chunk of uniform distributed random data. That way I can be sure that I have all the cases, including those not in the specification form 1988.

Later on I can use that as a CI test for my crate. Sort of fuzzing approach. I just need to record all bytes that follow ASCII 24 and that builds my table.

0
0
0

Jarkko Sakkinen

nice that #github allows to turn off issues, if only "pull requests" could also fully disabled #microsoft
0
0
0

Jarkko Sakkinen

Edited 1 year ago

I’ve been using Rust professionally way or another for about 2 years now and at least this and also lack of e.g. BufRead abstraction (sorry trait) has been something that I’ve been cursing to this day because it enforces you to do totally unproductive boilerplate and glue for everything you do with Rust. So definitely a huge improvement is this… Doing some RidiculousError type for every no_std thing is just terrible IMHO. For 95% of stuff I’d rather use just predefined error codes. It also improves productivity by factors when all your crates communicate with same error codes.

Abstraction only ever make sense if they have some meaningful functional use. Otherwise, they are just code bloat.

0
0
1
@ukuli ei mua ihan kauheasti kiinnosta sannan asiat :-) lähinnä kiinnostaa oman elämät ilot ja surut. live and let live ja näin päin pois...
0
0
0

Jarkko Sakkinen

Edited 1 year ago

embedded-io and embedded-io-async seem to be something i would want to use also for crates meant to be used with std just to future-proof portability. great that there is solution for std::io issue finally. for me the disability to e.g. not being able to use std::io::Error in no_std code has been a huge turndown.

and since these are provided by the Rust HAL team there’s some trust for long-term lifespan. 3rd party solutions in the basic error types and BufRead is a maintenance risk imho.

this is good enough as far as i’m concerned

#rustlang #embedded

1
0
0
@monsieuricon just like netflix used to work as a postal service
0
0
0
Little known fact: first kernel releases were shipped via the postal service.
7
51
137

Jarkko Sakkinen

I don't really understand why the original ZMODEM spec did not specify these with charts in the first place (like ASCII charts):

https://github.com/jarkkojs/zmodem2/issues/7

Super complicated, inefficient branching and no good reason, not even then:

```
pub const fn escape(value: u8) -> u8 {
match value {
0xff => 0x6d,
0x7f => 0x6c,
0x10 | 0x90 | 0x11 | 0x91 | 0x13 | 0x93 | ZDLE => value ^ 0x40,
// Telenet command escaping, which actually necessary only when preceded
// by 0x40 or 0xc0, meaning that this could be optimized a bit with the
// help of previous byte.
0x0d | 0x8d => value ^ 0x40,
_ => value,
}
}
```
0
0
0
Overwriting data is the new "goto" sort of looking at more modern languages than C :-)
0
0
1

Jarkko Sakkinen

Edited 1 year ago
This is my ultimate goal with #tior: a multiplexed #TTY and file transfer through serial. It won't happen fast I'm barely gettting #ZMODEM together and need to finish the UI for my client after that.

Here I've carved up high-level goal what I have in mind: https://github.com/de-vri-es/serial2-rs/issues/6#issuecomment-1837024452

IMHO this is totally modern world thing. When I was still working e.g. with Nokia Linux phones security, earlier that on #Symbian, serial port was used a lot. Then it sort of phased out for a number of years in my work life but today with the maker community, all sorts of #SBC's and affordable #FPGA's the stocks are rising again. Of course if you've been all the time working on embedded, serial has been around for all this time. It is pretty weird that minicom and lrzsz still rock the world in that arena.

When you work on a a power on for a new hardware device, it is the first channel that gets usually enabled. And e.g. like any FPGA design or something you put to let's say to Arduino it is simplest route to get some communications on going.

So yeah, I really think this sort of endeavour does matter.
0
0
2
@epicEaston197 All cool. I don't mind. It was a bit culminated statement I made :-) I don't mind growing outreach but being like it is not bad either.
0
0
1
@epicEaston197 Fun fact: Google+ was hugely popular among kernel developers. That does not give a good prognosis for the success of Mastodon :-) For me it is not an issue tho because I care more about this as a productivity application than social media :-) Only social media account I've ever had has been Facebook (OK, couple of short spin offs to Twitter too) and that for the most part staying in contact with relatives.

I care exactly about Mastodon because social media madness, influencers etc. do not exist here. I'm happy that Mastodon is unpopular sort of TBH
1
0
1

Jarkko Sakkinen

Edited 1 year ago

So I did a pull request to the hex crate:

https://github.com/KokaKiwi/rust-hex/pull/83

This sort of scenario is not too uncommon in data flows especially when you want to squeeze everything bit out. E.g. for something like #ZMODEM you’d prefer the implementation to scale from microcontroller to Intel Xeon.

Usage example in my crate:

        if encoding == Encoding::ZHEX {
            hex::decode_in_slice(&mut out).or::<io::Error>(Err(ErrorKind::InvalidData.into()))?;
            out.truncate(out.len() / 2);
        }

#rustlang

0
0
0

Jarkko Sakkinen

Edited 1 year ago
E.g. if you have a hex string in stack, you could convert it to a binary to either head or tail of that memory block by overwriting it as you iterate. Further any data conversion where you convert any data from more sparse format to more compressed format.
1
0
0
E.g. I could have saved 7 bytes of stack by doing that sort of thing but do not want to do the effort because of inconvenience :-) Making world bloat again
1
0
0

Jarkko Sakkinen

One thing where #Rust is pretty inconvenient to use IMHO, when you want to optimize your code in a way that you want to modify data "within its space". I.e. purposely overwrite the same data chunk that you are iterating. Totally doable but not something you tend to do. Sort of thing that is against its design principles. #rustlang
1
0
1

Jarkko Sakkinen

trivial to get my #zmodem crate heapless with the `tinyvec` crate: https://github.com/jarkkojs/zmodem2/commit/6494028c3970c2c9f769643dac0e33c31a103fff

Still a few locations using heap but they are not more complicated than these sites :-)

As for "async" goes I think I just have a function to run one cycle of the state machine as it is fairly clean that way. It should be pretty easy then to wrap whatever framework is used around.

I.e. have start_send and next_send instead of just send and such and so forth. The way zmodem splits stuff that ZDATA subpackets fits well to this scheme. I should probably learn the language level async scheme but I see no point complicating this. I'm sure a framework using that can easily wrap a state machine.

#rustlang
0
0
2

Jarkko Sakkinen

Edited 1 year ago

One thing that I had to dig up from previous #Enarx work was core::marker::PhantomData. It is not so well known but pretty important concept inside Rust.

PhantomData is a zero-sized struct that merely acts as a life-time indicator for the other parameter, which are usually pointers on where it is applied. It is used to implement many of the core structs such as Rc to name one instance.

It is pretty good lesson on how lifetime parameters interact with the Rust compiler.

I’d even say that if you understand PhantomData, then you have the basic understanding of Rust, and if not, you still have to learn a bit. It is the block that the whole core library is based on after all.

#rustlang

0
0
1

I’d actually recommend to do few exercises with just from_raw_parts and lifetime parameters before using zerocopy because that sort of gives you full tutorial on what that particular crate does internally :-) I sort of enjoy thinking of those scenarios so it also takes some fun away :-)

0
0
1
Also this the Rust tutorial I wish I had found when I first started working on with Rust: https://google.github.io/comprehensive-rust/.

It is far better than any e.g. book I've ever seen on the topic of Rust.

At least this is by fart the best tutorial if you already have strong C/C++ and perhaps assembly background. Any books that I've ever read on Rust, well I've stop reading latest on chapter 2 because they have incredibly boring. This is really good hands on engineering material if you already sort of have understanding already topics such as memory management etc.
1
0
2
Show older